sqoop1.4.7安装和操作

青春壹個敷衍的年華 提交于 2019-12-21 03:05:06

前提概述

官网http://sqoop.apache.org/

将来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/db/{db}/{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
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!