sqoop 从sqlserver2008 导入数据到hadoop

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介: 今天终于开始上手导入数据到hadoop了,哈哈,过程蛮崎岖的,和官方文档的还不太一样。 OK,let's go!试验对象是我第一个名为ST_Statistics的一张表,我要把我表里的数据导入到hdfs、hive以及hbase当中,然后试验才算完成。
今天终于开始上手导入数据到hadoop了,哈哈,过程蛮崎岖的,和官方文档的还不太一样。
OK,let's go!试验对象是我第一个名为ST_Statistics的一张表,我要把我表里的数据导入到hdfs、hive以及hbase当中,然后试验才算完成。

1.导入数据到hdfs

sqoop import  --connect 'jdbc:sqlserver://192.168.1.105:1433;username=sa;password=cenyuhai;database=SAMS' \
          --query "SELECT * FROM ST_Statistics WHERE BigReason='OfficeSoftwareFault' AND \$CONDITIONS " \
              --split-by ResponseTime --target-dir /user/cenyuhai/sams  
这里面有几个需要注意的点:
(1)--connect 后面的字符带上了'',为毛?其实我也不知道,官方文档上可不是这么说的,加上才可以跑。
(2)--split-by 后面跟的字段必须是整形的,因为sqoop是靠这个字段是给map线程分工的,不是整理它强转的时候就会报错的。
13/09/06 06:50:31 ERROR security.UserGroupInformation: PriviledgedActionException as:root cause:java.io.IOException: com.microsoft.sqlserver.jdbc.SQLServerException: 操作数数据类型 uniqueidentifier 对于 min 运算符无效。
13/09/06 06:50:31 ERROR tool.ImportTool: Encountered IOException running import job: java.io.IOException: com.microsoft.sqlserver.jdbc.SQLServerException: 操作数数据类型 uniqueidentifier 对于 min 运算符无效。
    at org.apache.sqoop.mapreduce.db.DataDrivenDBInputFormat.getSplits(DataDrivenDBInputFormat.java:167)
    at org.apache.hadoop.mapred.JobClient.writeNewSplits(JobClient.java:1054)
    at org.apache.hadoop.mapred.JobClient.writeSplits(JobClient.java:1071)
    at org.apache.hadoop.mapred.JobClient.access$700(JobClient.java:179)
    at org.apache.hadoop.mapred.JobClient$2.run(JobClient.java:983)
    at org.apache.hadoop.mapred.JobClient$2.run(JobClient.java:936)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:396)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1232)
    at org.apache.hadoop.mapred.JobClient.submitJobInternal(JobClient.java:936)
    at org.apache.hadoop.mapreduce.Job.submit(Job.java:550)
    at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:580)
    at org.apache.sqoop.mapreduce.ImportJobBase.doSubmitJob(ImportJobBase.java:187)
    at org.apache.sqoop.mapreduce.ImportJobBase.runJob(ImportJobBase.java:16
(3)只要是语法不对的,它都会报下面这个错,希望大家注意!
At minimum, you must specify --connect and --table
Arguments to mysqldump and other subprograms may be supplied
after a '--' on the command line.

2.增量导入

sqoop支持两种增量导入到hive的模式, 一种是 append,即通过指定一个递增的列,比如: 
   --incremental append  --check-column id --last-value 0 
另种是可以根据时间戳,比如: 
   --incremental lastmodified --check-column time --last-value '2013-01-01 11:0:00' 
就是只导入time比'2013-01-01 11:0:00'更大的数据。
好,我试验的是第一种,我在插入了前面插入了差距的基础上,再插入WorkNo是201309071后面的数据(我新加的)。
sqoop import  --connect 'jdbc:sqlserver://192.168.1.105:1433;username=sa;password=cenyuhai;database=SAMS'  --table ST_Statistics \
  --where "BigReason='OfficeSoftwareFault'"   --split-by ResponseTime --target-dir /user/cenyuhai/sams \
  --incremental append  --check-column WorkNo  --last-value 201309071 
执行成功,命令的提示当中会出现以下的提示,最后的值已经到201308081了。
13/09/06 22:26:15 INFO mapreduce.ImportJobBase: Retrieved 5 records.
13/09/06 22:26:15 INFO util.AppendUtils: Appending to directory sams
13/09/06 22:26:15 INFO util.AppendUtils: Using found partition 8
13/09/06 22:26:15 INFO tool.ImportTool: Incremental import complete! To run another incremental import of all data following this import, supply the following arguments:
13/09/06 22:26:15 INFO tool.ImportTool:  --incremental append
13/09/06 22:26:15 INFO tool.ImportTool:   --check-column WorkNo
13/09/06 22:26:15 INFO tool.ImportTool:   --last-value 201309081

3.导入到hive

sqoop import  --connect 'jdbc:sqlserver://192.168.1.105:1433;username=sa;password=cenyuhai;database=SAMS' \
             --table ST_Statistics --where "BigReason='OfficeSoftwareFault'" --split-by ResponseTime --hive-import  --create-hive-table 
不知道为什么,执行hive的导入语句时,就不能用--query了,老报上面的那个提到的那个错误,可能是RP不好,就只能改成这种表加上过滤条件的方式了。然后用上面对hdfs的增量插入的方式对hive来操作也不成功,老是报前面提到的那个语法错误,真是让人无语了,报错都报得如此含蓄!

4.导入到hbase

sqoop import  --connect 'jdbc:sqlserver://192.168.1.105:1433;username=sa;password=cenyuhai;database=SAMS' --table ST_Statistics --where "BigReason='OfficeSoftwareFault'" --split-by ResponseTime  --hbase-table ST_Statistics --hbase-create-table   --hbase-row-key WorkNo  --column-family cf 
这条语句非常长,为毛?我也不知道,这种写法我试了很多次了,用\来分行的写了很多次,一次都没成功,最后误打误撞,弄成一行它就成功运行了!

5.把数据从hdfs导回到sqlserver

把数据从hdfs导回到sqlserver,从hive导出也和这个一样,因为都是文本文件,hbase的话,也是不支持直接的,需要通过和hive结合,才能导出。  

sqoop export  --connect 'jdbc:sqlserver://192.168.1.105:1433;username=sa;password=cenyuhai;database=SAMS' \
              --table ST_Statistics2 --export-dir /user/cenyuhai/sams
相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
目录
相关文章
|
3月前
|
SQL 分布式计算 Oracle
使用Sqoop从Oracle数据库导入数据
使用Sqoop从Oracle数据库导入数据
使用Sqoop从Oracle数据库导入数据
|
3月前
|
分布式计算 关系型数据库 Hadoop
使用Sqoop将数据从Hadoop导出到关系型数据库
使用Sqoop将数据从Hadoop导出到关系型数据库
|
3月前
|
分布式计算 Hadoop 关系型数据库
使用Sqoop将数据导入Hadoop的详细教程
使用Sqoop将数据导入Hadoop的详细教程
|
3月前
|
分布式计算 Hadoop 关系型数据库
Hadoop中的Sqoop是什么?请解释其作用和用途。
Hadoop中的Sqoop是什么?请解释其作用和用途。
34 0
|
10月前
|
SQL 分布式计算 关系型数据库
大数据 | (五)通过Sqoop实现从MySQL导入数据到HDFS
大数据 | (五)通过Sqoop实现从MySQL导入数据到HDFS
167 0
|
SQL 分布式计算 关系型数据库
Sqoop导入数据
Sqoop导入数据样例
164 0
|
SQL 存储 分布式计算
Sqoop进行Hadoop生态离线数据迁移工具
学习一个东西,个人认为最好的方式是:官网+源码+实践。 Sqoop官网:http://sqoop.apache.org
435 0
Sqoop进行Hadoop生态离线数据迁移工具
|
分布式计算 关系型数据库 MySQL
|
分布式计算 关系型数据库 Hadoop
hadoop完全分布式集群下安装sqoop
应用场景 当我们按照hadoop完全分布式集群搭建博客搭建了hadoop以后,发现这是一个空的hadoop,只有YARN,MapReduce,HDFS,而这些实际上我们一般不会直接使用,而是需要另外部署Hadoop的其他组件,来辅助使用。
2197 0