sqoop import

本文详细介绍了使用 Sqoop 工具进行数据迁移的方法,包括从 SQL Server 导入数据到 HDFS 和 Hive 的具体步骤及命令选项。文章还分享了作者在实际操作过程中遇到的问题及其解决方案。

sqoop数据导入工具import:
   sqoop数据导入hdfs和hive没什么区别,导入hdfs就是把数据按行一行一行地写入hdfs文件系统,
   导入hive表,类似于在hdfs上有一个网格,按网格的指定一个个去存放,网格的位置是独立存在的
下面是从网上找的sqoop的一些命令选项,(没办法,记性不好,只能每次写sqoop命令就拿出来遛遛)

选项    含义说明
--connect <jdbc-uri>    指定JDBC连接字符串
--connection-manager <class-name>    指定要使用的连接管理器类
--driver <class-name>    指定要使用的JDBC驱动类
--hadoop-mapred-home <dir>    指定$HADOOP_MAPRED_HOME路径
--help    打印用法帮助信息
--password-file    设置用于存放认证的密码信息文件的路径
-P    从控制台读取输入的密码
--password <password>    设置认证密码
--username <username>    设置认证用户名
--verbose    打印详细的运行信息
--connection-param-file <filename>    可选,指定存储数据库连接参数的属性文件

下面是我脚本里面的sqoop命令,类似的一些库都可以导的,把驱动和连接设置好久ok的
sqoop import --driver com.microsoft.sqlserver.jdbc.SQLServerDriver \
--connect "jdbc:sqlserver://$HOST:$PORT;database=$SERVERDB" --username $USER --password "$PASSWD" \
--table $TABLE  --fields-terminated-by '\001' --warehouse-dir /user/hive/warehouse/feidaiwebsite.db \
--null-string '\\N' --null-non-string '\0' -m $NUM_MAPPERS

我喜欢把连接配置信息存放到库里面,所以上面的命令我基本不改

这是我切换sqlserver的记录
ln -s /root/tanj/sqlserver/sqljdbc4.jar /opt/cloudera/parcels/CDH-5.10.0-1.cdh5.10.0.p0.41/lib/sqoop/lib/
export MSSQL_CONNECTOR_HOME=/root/tanj/sqlserver/sqoop-sqlserver-1.0
chmod +x /root/tanj/sqlserver/sqoop-sqlserver-1.0/install.sh
sh /root/tanj/sqlserver/sqoop-sqlserver-1.0/install.sh
ln -s /root/tanj/sqlserver/sqoop-sqlserver-1.0/lib/sqoop-sqlserver-1.0.jar /opt/cloudera/parcels/CDH-5.10.0-1.cdh5.10.0.p0.41/lib/sqoop/lib/
ln -s /root/tanj/sqlserver/sqoop-sqlserver-1.0/conf/managers.d/mssqoop-sqlserver /etc/sqoop/conf/managers.d

--append    将数据追加到HDFS上一个已存在的数据集上
--as-avrodatafile    将数据导入到Avro数据文件
--as-sequencefile    将数据导入到SequenceFile
--as-textfile    将数据导入到普通文本文件(默认)
--boundary-query <statement>    边界查询,用于创建分片(InputSplit)
--columns <col,col,col…>    从表中导出指定的一组列的数据
--delete-target-dir    如果指定目录存在,则先删除掉
--direct    使用直接导入模式(优化导入速度)
--direct-split-size <n>    分割输入stream的字节大小(在直接导入模式下)
--fetch-size <n>    从数据库中批量读取记录数
--inline-lob-limit <n>    设置内联的LOB对象的大小
-m,--num-mappers <n>    使用n个map任务并行导入数据
-e,--query <statement>    导入的查询语句
--split-by <column-name>    指定按照哪个列去分割数据
--table <table-name>    导入的源表表名
--target-dir <dir>    导入HDFS的目标路径
--warehouse-dir <dir>    HDFS存放表的根路径
--where <where clause>    指定导出时所使用的查询条件
-z,--compress    启用压缩
--compression-codec <c>    指定Hadoop的codec方式(默认gzip)
--null-string <null-string>    果指定列为字符串类型,使用指定字符串替换值为null的该类列的值
--null-non-string <null-string>    如果指定列为非字符串类型,使用指定字符串替换值为null的该类列的值

(备注一下啊,这是网上1.4版本的,)

sqoop import --connect jdbc:mysql://$HOST:$PORT/$MYSQL_DB  --username $USER --password ''${PASSWD}'' --table $MYSQL_TABLE \
--hive-import --hive-overwrite  --hive-database $HIVE_DB --fields-terminated-by '\001' --target-dir $TEMPDIR --delete-target-dir --outdir /root/tanj/sh/java \
--hive-drop-import-delims --null-string '\\N' --null-non-string '\0'  -m $NUMMAPPERS

说说一些坑吧
我在密码那里加了俩单引号,是因为有的密码里面含有特殊符号,导致sqoop读取命令的时候会出错,所以我喜欢干脆的,直接在shell 的参数上全部加上''''
--hive-overwrite  我是做全量导数,(后面也有增量的脚本), 所以每次全量覆盖,不然还得去删除,否则就会add了
--fields-terminated-by 分割符啦,用了几个,都不好,它涉及到字段之间的区分,所以它必须不能在内容里面出现该符号
--target-dir 是sqoop生成的目标目录,只是个临时目录,最终会转移数据到表目录去,--delete-target-dir 所以建议用 否则任务失败后后面的任务会报错
--outdir 是java文件生成存放的目录,会自动生成,不然会存放在当前目录,生成一推的java文件
--null-string --null-non-string 处理空值
-m map任务并行数,貌似主键是int类型才行,否则会生成重复数据


hive导入参数
  --hive-home <dir>  重写$HIVE_HOME
  --hive-import          插入数据到hive当中,使用hive的默认分隔符
  --hive-overwrite  重写插入
  --create-hive-table  建表,如果表已经存在,该操作会报错!
  --hive-table <table-name>  设置到hive当中的表名
  --hive-drop-import-delims  导入到hive时删除 \n, \r, and \01 
  --hive-delims-replacement  导入到hive时用自定义的字符替换掉 \n, \r, and \01 
  --hive-partition-key          hive分区的key
  --hive-partition-value <v>  hive分区的值
  --map-column-hive <map>          类型匹配,sql类型对应到hive类型(--map-column-java)

sqoop增量导数
–check-column (col)    用来作为判断的列名,如id
–incremental (mode)    append:追加,比如对大于last-value指定的值之后的记录进行追加导入。lastmodified:最后的修改时间,追加last-value指定的日期之后的记录
–last-value (value)    指定自从上次导入后列的最大值(大于该指定的值),也可以自己设定某一值
  sqoop增量导数的例子 
  sqoop  import --connect jdbc:mysql://${APPENDHOST}:$APPENDPORT/$APPENDMYSQL_DB --username $APPENDUSER --password $APPENDPASSWD \
   --table $HIVE_TABLE --incremental append --check-column $APPENDCOLUMN --outdir /root/tanj/sh/java \
   --hive-import --hive-database $HIVE_DB --hive-table $HIVE_TABLE \
   --target-dir $APPENDTEMPDIR --fields-terminated-by "\001"  \
   --hive-drop-import-delims --null-string '\\N' --null-non-string "\0" -m $APPENDNUMMAPPERS --last-value "${APPENDLASTVALUE};";

import-all-tables
   sqoop import-all-tables --connect  jdbc:mysql://10.64.4.95:3306/financesys_move --username root --password d6f0fe881f69edec \
   --hive-import --hive-overwrite --hive-database financesys_move --fields-terminated-by '\001'  \
   --hive-drop-import-delims --null-string '\\N' --null-non-string '\0' -m 1

 

不能和--delete-target-dir 同时使用

  

转载于:https://my.oschina.net/u/2510243/blog/1544258

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值