sqoop数据导入工具import:
sqoop数据导入hdfs和hive没什么区别,导入hdfs就是把数据按行一行一行地写入hdfs文件系统,
导入hive表,相似于在hdfs上有一个网格,按网格的指定一个个去存放,网格的位置是独立存在的
下面是从网上找的sqoop的一些命令选项,(没办法,记性很差,只能每次写sqoop命令就拿出来遛遛)java
选项 含义说明
--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> 可选,指定存储数据库链接参数的属性文件mysql
下面是我脚本里面的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_MAPPERSweb
我喜欢把链接配置信息存放到库里面,因此上面的命令我基本不改sql
这是我切换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.dshell
--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版本的,)app
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类型才行,不然会生成重复数据oop
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)sqlserver
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 同时使用