前提概述
将来sqoop在使用的时候有可能会跟那些系统或者组件打交道?
HDFS, MapReduce, YARN, ZooKeeper, Hive, HBase, MySQL
sqoop1就是一个工具, 只需要在一个节点上进行安装即可。
如果sqoop要跟hive交互,那么sqoop节点机器一定要有hive系统。
版本sqoop1和sqoop2
这里使用sqoop1.4.7(CDH6.3里集成的也是这个版本)
下载安装
跟其他apache大数据组件一样的套路,下载解压,配置conf,启动。
下载地址:http://www.apache.org/dyn/closer.lua/sqoop/1.4.7
[admin@centos7x3 sqoop]$ vim conf/sqoop-env.sh
#Set path to where bin/hadoop is available
export HADOOP_COMMON_HOME=/opt/software/hadoop
#Set path to where hadoop-*-core.jar is available
export HADOOP_MAPRED_HOME=/opt/software/hadoop
#set the path to where bin/hbase is available
export HBASE_HOME=/opt/software/hbase
#Set the path to where bin/hive is available
export HIVE_HOME=/opt/software/hive
#Set the path for where zookeper config dir is
export ZOOCFGDIR=/opt/software/zookeeper/conf
import操作常用参数
--connect <jdbc-uri> jdbc 连接地址
--connection-manager <class-name> 连接管理者
--driver <class-name> 驱动类
--hadoop-mapred-home <dir> $HADOOP_MAPRED_HOME
--help help 信息
-P 从命令行输入密码
--password <password> 密码
--username <username> 账号
--verbose 打印流程信息
--connection-param-file <filename> 可选参数
| 参数 | 说明 |
|---|---|
| –null-string | string类型空值的替换符(Hive中Null用\n表示) |
| –null-non-string | 非string类型空值的替换符 |
| –split-by | 数据切片字段(int类型,m>1时必须指定) |
| -m,–num-mappers | Mapper任务数,默认为4 |
| –hive-drop-import- delims | 删除数据中包含的Hive默认分隔符(^A, ^B, \n) |
| – target-dir | HDFS目标目录(确保目录不存在,否则会报错,因为Sqoop在导入数据至HDFS时会自己在HDFS上创建目录) |
| –fields-terminated-by | 指定分隔符 |
如何使用数据导入
从mysql导入到HDFS
1全部导入
sqoop import \
--connect jdbc:mysql://node3:3306/datatest \
--username admin \
--password '123456' \
--table user \
--target-dir /user/admin/datatest \
--fields-terminated-by '\t' \
-m 1
以上,–target-dir指定HDFS目录,–fields-terminated-by指定分隔符
2带有where子句的导入
sqoop import \
--connect jdbc:mysql://node3:3306/datatest \
--username admin \
--password '123456' \
--table user \
--where "age>18" \
--target-dir /user/admin/datatest1 \
--fields-terminated-by '\t' \
-m 1
3指定列的导入
sqoop import \
--connect jdbc:mysql://node3:3306/datatest \
--username admin \
--password '123456' \
--table user \
--columns "name,age" \
--target-dir /user/admin/datatest2 \
--fields-terminated-by '\t' \
-m 1
4自定义SQL的导入
sqoop import \
--connect jdbc:mysql://node3:3306/datatest \
--username admin \
--password '123456' \
--query 'select name,age,sex from user where $CONDITIONS and age>18 order by age desc'\
--target-dir /user/admin/datatest3 \
--fields-terminated-by '\t' \
-m 1
以上,where条例里必须加上$CONDITIONS;使用–query的时候,就不要加–table参数指定表了
从mysql导入HIVE
1普通导入
数据存储在默认的default hive库中,表名就是对应的mysql的表名:
sqoop import \
--connect jdbc:mysql://node3:3306/datatest \
--username admin \
--password 123456 \
--table user \
--hive-import \
-m 1
2指定HIVE的库和表名
sqoop import \
--connect jdbc:mysql://node3:3306/datatest \
--username admin \
--password 123456 \
--table user \
--fields-terminated-by "\t" \
--lines-terminated-by "\n" \
--hive-import \
--hive-overwrite \
--create-hive-table \
--delete-target-dir \
--hive-database sqoop \
--hive-table sqoop_user_time
其中,–hive-database sqoop --hive-table sqoop_user 可以直接写成–hive-table sqoop.sqoop_user
从mysql导入到HBASE
首先在HBASE里创建表
hbase(main):011:0> create 'sqoop','user_info'
Created table sqoop
Took 7.0655 seconds
=> Hbase::Table - sqoop
sqoop import \
--connect jdbc:mysql://node3:3306/datatest \
--username admin \
--password 123456 \
--table user \
--hbase-table sqoop \
--column-family user_info \
--hbase-row-key id
参数说明:
| Argument | Description |
|---|---|
--column-family <family> |
Sets the target column family for the import列簇 |
--hbase-create-table |
If specified, create missing HBase tables |
--hbase-row-key <col> |
使用哪一列作为row key。如果不指明,默认使用–split-by指定的列。 |
--hbase-table <table-name> |
Specifies an HBase table to use as the target instead of HDFS |
--hbase-bulkload |
Enables bulk loading.启用批量导入 |
增量导入
增量数据导入分两种,一是基于递增列的增量数据导入(Append方式)。二是基于时间列的增量数据导入(LastModified方式)。
append方式
sqoop import \
--connect jdbc:mysql://node3:3306/datatest \
--username admin \
--password 123456 \
--table user \
--hive-import \
--hive-table sqoop.sqoop_user_1 \
--fields-terminated-by "\t" \
--incremental append \
--check-column id \
--last-value 8 \
-m 1
注意:–check-column 增量依据哪一列,要求为int类型
–last-value 8 意味着8以后的数据才会被导入
–fields-terminated-by 要是不指定值的话,默认分隔符为’\001’,并且以后每次导入数据都要设置 --fields-terminated-by ‘\001’,不然导入的数据为NULL。建议手动设置 --fields-terminated-by的值。
以下为不加入–fields-terminated-by的效果,导入到存在数据的表里字段显示为NULL
1 张三 18 男 addr1
2 张二 18 男 addr1
NULL NULL NULL NULL NULL
NULL NULL NULL NULL NULL
NULL NULL NULL NULL NULL
3 李四 19 女 addr1
4 王五 20 男 addr2
5 赵六 21 男 addr3
lastModify方式
此方式要求原有表中有time字段,它能指定一个时间戳,让Sqoop把该时间戳之后的数据导入至Hadoop。
–incremental lastmodified --merge-key的作用:修改过的数据和新增的数据(前提是满足last-value的条件)都会导入进来,并且重复的数据(不需要满足last-value的条件)都会进行合并。
lastModify模式不支持增量导入到HIVE。不过可以采取另一个方法:把增量数据导入到HDFS内,HIVE的相关文件夹下。
先把mysql数据做一次完整导入到HIVE
sqoop import \
--connect jdbc:mysql://node3:3306/datatest \
--username admin \
--password 123456 \
--table user \
--fields-terminated-by "\t" \
--lines-terminated-by "\n" \
--hive-import \
--hive-overwrite \
--create-hive-table \
--delete-target-dir \
--hive-database sqoop \
--hive-table sqoop_user_time
然后mysql里增加数据,再增量导入到HDFS(这里不是导入到HIVE)。成功后在HIVE里查看可以看到增量数据。
sqoop import \
--connect jdbc:mysql://node3:3306/datatest \
--username admin \
--password 123456 \
--table user \
--fields-terminated-by "\t" \
--target-dir "/hive/warehouse/sqoop.db/sqoop_user_time" \
--incremental lastmodified \
--merge-key id \
--check-column time \
--last-value "2019-12-11 10:10:10" \
--m 1
–target-dir “/hive/warehouse/sqoop.db/sqoop_user_time” 是hive默认的数据存储位置。
错误处理
1、在操作hive的时候,也许会报错。
Could not load org.apache.hadoop.hive.conf.HiveConf. Make sure HIVE_CONF_DIR is set correctly
需要复制一份 hive/lib/hive-common-3.1.2.jar 到sqoop/lib/下。
2、-–incremental lastmodified 模式 不支持 导入Hive
--incremental lastmodified option for hive imports is not supported. Please remove the parameter --incremental lastmodified.
解决办法:使用导入HDFS 的方法,只不过 --target-dir 设置成 Hive table 在 HDFS 中的位置,类似于//hive/warehouse/{table},前提 Hive 中已经存在这个表了,不存在的话先CREATE。
sqoop incremental import to hive table
3、HBASE问题,估计是版本问题,没有找到办法
Exception in thread "main" java.lang.NoSuchMethodError: org.apache.hadoop.hbase.client.HBaseAdmin.<init>(Lorg/apache/hadoop/conf/Configuration;)V
来源:CSDN
作者:zld_555
链接:https://blog.csdn.net/zld_555/article/details/103627890