用法示例
查看hive库中所有的表
sqoop list-tables --username hive --password 'XX' --connect jdbc:mysql://XX:3306/hive?characterEncoding=UTF-8
基于mysql中已经存在的库表,在hive中进行创建
sqoop create-hive-table --connect jdbc:mysql://XX:3306/hive?characterEncoding=UTF-8--table people --username hive -password 'XXX' --hive-database db_hive_edu
显示mysql中指定用户名下有哪些库表
sqoop list-databases --connect jdbc:mysql://XX:3306/--username XX --password XXX
显示指定库中有哪些表
sqoop list-tables --connect jdbc:mysql://XX:3306/firework --username xx --password XXX
在hive中创建与mysql中表结构一致的表
sqoop create-hive-table --connect jdbc:mysql://XX:3306/firework --username XX --password XX --table firework_apiinfometa --hive-table firework_apiinfometa_hive
数据导入:sqoop import
常用参数
--connect jdbc 连接地址
--connection-manager 连接管理者
--driver 驱动类
--hadoop-mapred-home $HADOOP_MAPRED_HOME
--help help 信息
-P 从命令行输入密码
-m 指定maptask的个数,指定maptask的并行度
--target-dir 指定导出数据在hdfs上的存储目录
--fields-terminated-by 指定每条记录中字段之间的分隔符
--where 指定查询sql的where条件
--query 指定sql查询
--columns 指定查询的列 (不指定默认导出所有的列)
--password 密码
--username 账号
--verbose 打印流程信息
--connection-param-file 可选参数
mysql到hdfs
(1) 不指定分隔符和路径
sqoop import --connect jdbc:mysql://XX:3306/firework --username XX --password XXX --table firework_apiinfometa -m 1
如果没有指定文件的存储目录,那么默认的会保存在hdfs上的/user/用户/book 目录中,默认的字段的分隔符逗号。
(2) 指定导入路径和分割符
sqoop import --connect jdbc:mysql://XX:3306/firework --username XX --password XXX --table firework_apiinfometa --target-dir /user/hive/warehouse/test.db/firework_apiinfometa_hive --fields-terminated-by '\t' -m 1
导入where的结果
sqoop import --connect jdbc:mysql://XX:3306/firework --username XX --password XXX --table firework_apiinfometa --where "url like '%test%'" --target-dir /user/hive/warehouse/test.db/firework_apiinfometa_hive_where -m 1
注意:where条件里面如果还需要带‘’ ,则需要使用双引号; 不能够给带‘’的串再添加转义字符
导入query的结果
双引号: sqoop import --connect jdbc:mysql://XX:3306/firework --username XX --password XXX --target-dir /user/hive/warehouse/test.db/firework_apiinfometa_hdfs_query --query "select * from firework_apiinfometa where url like '%test%' and $CONDITIONS" --split-by url --fields-terminated-by '\t' -m 1
单引号-where条件不带引号:qoop import --connect jdbc:mysql://XX:3306/firework--username XX --password XXX --target-dir /user/hive/warehouse/test.db/firework_apiinfometa_hdfs_query_append --query 'select * from firework_apiinfometa where $CONDITIONS' --split-by url --fields-terminated-by '\t' -m 1
单引号-where条件带引号: sqoop import --connect jdbc:mysql://XX:3306/firework--username XX --password XXX --target-dir /user/hive/warehouse/test.db/firework_apiinfometa_hdfs_query_append1 --query 'select * from firework_apiinfometa where url like "%test%" and $CONDITIONS' --split-by url --fields-terminated-by '\t' -m 1
备注:--table 与 --query 不能同时出现; --query 中必须包含and $CONDITIONS; 如果 query 后使用的是双引号,则$CONDITIONS 前必须加转移符(即and \$CONDITIONS;),防止 shell 识别为自己的变量 ; 如果query是单引号的查询sql,则无需加,如果携带了where条件需要带引号,则where条件带双引号,$CONDITIONS前无需加转义
mysql到hive
普通导入
sqoop import --connect jdbc:mysql://XX:3306/firework --username XX --password XXX --table firework_apiinfometa --hive-import -m 1
导入数据到hive表中时,默认在default库下,表名和MySQL导入的表名一样,默认采用'\u0001'分隔。
全量导入
sqoop import --connect jdbc:mysql://XX:3306/firework --username XX --password XX --table firework_apiinfometa --fields-terminated-by '\t' --lines-terminated-by '\n' --hive-import --hive-overwrite --create-hive-table --hive-table test.firework_apiinfometa_hive --delete-target-dir
表会自动创建,但是库不会,所以在执行语句前,一定要保证hive的数据库存在,否则会把报错
增量导入
sqoop import --connect jdbc:mysql://XX:3306/firework --username XX --password XXX --table firework_apiinfometa --target-dir /user/hive/warehouse/test.db/firework_apiinfometa_hive --incremental append --check-column url -m1
ERROR tool.ImportTool: Import failed: Character column (url) can not be used to determine which rows to incrementally import.
mysql到hbase
sqoop import --connect jdbc:mysql://XX:3306/firework--username XX --password XXX --table firework_apiinfometa --hbase-create-table --hbase-table firework_apiinfometa_hbase --column-family apiinfometa --hbase-row-key url -m 1
最开始出现很多少jar的情况,一个个copy就好了
数据导出:sqoop export
常见参数
--direct 快速导入
--export-dir HDFS 导出数据的目录
-m,--num-mappers 都少个 map 线程
--table 导出哪个表
--call 存储过程
--update-key 通过哪个字段来判断更新
--update-mode 插入模式,默认是只更新,可以设置为 allowinsert.
--input-null-string 字符类型 null 处理
--input-null-non-string 非字符类型 null 处理
--staging-table 临时表
--clear-staging-table 清空临时表
--batch 批量模式
hdfs到mysql
前置:先创建表,如果表结构不对,部分字段的值会丢失;
sqoop export --connect jdbc:mysql://XX:3306/mocksky--username XX --password XXX --table user_mall --export-dir /tmp/user_mall.txt --fields-terminated-by ' '
hive到mysql
与hdfs的不同在:--export-dir /user/hive/warehouse/uv/dt=2011-08-03 \ --input-fileds-terminated-by '\t'
hbase到mysql
通过先将hbase中数据写hdfs,然后再导入
问题1:Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.hive.conf.HiveConf
通过将jar进行拷贝得以解决: cp -f $HIVE_HOME/lib/hive-common-2.3.3.jar $SQOOP_HOME/lib
Caused by: Generating splits for a textual index column allowed only in case of "-Dorg.apache.sqoop.splitter.allow_text_splitter=true" property passed as a parameter
解决: 因为指定了-m XX,也就是XX个map处理,-m > 1 必须有主键。因为这个表没有主键,所以需要需要设置-m 1
问题2:Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil
解决:cp -f $HIVE_HOME/lib/hbase-server-1.1.1.jar $SQOOP_HOME/lib
问题3:Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.hbase.protobuf.generated.MasterProtos$MasterService$BlockingInterface
解决:cp -f$HIVE_HOME/lib/hbase-protocol-1.1.1.jar$SQOOP_HOME/lib
问题4:Exception in thread "main" java.lang.NoSuchMethodError: org.apache.hadoop.hbase.client.HBaseAdmin.<init>(Lorg/apache/hadoop/conf/Configuration;)V
解决:cp -f$HIVE_HOME/lib/hbase-client-1.1.1.jar $SQOOP_HOME/lib
问题5:Caused by: java.lang.ClassNotFoundException: com.yammer.metrics.core.MetricsRegistry
解决:cp -f$HIVE_HOME/lib/metrics-core-2.2.0.jar $SQOOP_HOME/lib
问题6:Error: org.apache.hadoop.hbase.client.HTable.<init>(Lorg/apache/hadoop/conf/Configuration;Ljava/lang/String;)V
解决:cp -f$HADOOP_HOME/share/hadoop/common/hadoop-common-2.7.6.jar $SQOOP_HOME/lib $SQOOP_HOME/lib