Sqoop-1.4.6安装部署及详细使用介绍
2023-04-27 09:14:27
Sqoop1之所以被选中,是因为目前Sqoop2存在太多问题。不能正常使用,综合比较后选择Sqoop1。
Sqoop1安装配置简单
一、安装部署(1)、下载地址:http://archive.cloudera.com/cdh5/cdh/5/sqoop-1.4.6-cdh5.5.2.tar.gz
解压到/opt/cdh5/sqoop
(2)、jdbc驱动包mysql复制MySQL-connector-Java-5.1.31-bin.jar到sqoop/lib目录下。
(3)、配置环境变量
#sqoop
export SQOOP_HOME=/opt/cdh5/sqoop
export PATH=$PATH:$SQOOP_HOME/bin
(4)、复制sqoop/conf/sqoop-env-template.sh为sqoop-env.sh
添加相关配置
#Setpath to where bin/Hadoopis available
exportHADOOP_COMMON_HOME=/opt/cdh5/hadoop
#Setpath to where hadoop-*-core.jar isavailable
exportHADOOP_MAPRED_HOME=/opt/cdh5/hadoop
#setthe path to where bin/hbase isavailable
exportHBASE_HOME=/opt/cdh5/hbase
#Setthe path to where bin/hive is available
exportHIVE_HOME= /opt/cdh5/hive
#Setthe path for where zookeper config diris
exportZOOCFGDIR= /opt/cdh5/zookeeper
(5)、测试Sqoop
发现有警告
修改$SQOOP_HOME/bin/configure-sqoop
注释HCatalog、Accumulo检查(除非您准备使用HCatalog、Accumulo等HADOP上的组件)
## Moved to be a runtime check in sqoop.
#if [ ! -d "${HCAT_HOME}" ]; then
#echo "Warning: $HCAT_HOME does not exist! HCatalog jobs willfail."
#echo 'Please set $HCAT_HOME to the root of your HCatalog installation.'
#fi
#if [ ! -d "${ACCUMULO_HOME}" ];then
#echo "Warning: $ACCUMULO_HOME does not exist! Accumulo imports willfail."
#echo 'Please set $ACCUMULO_HOME to the root of your Accumuloinstallation.'
#fi
sqoop再次执行 version
您还可以查看命令的使用说明:
$ sqoopimport --help
$ sqoophelp import
sqoop import 一个例子如下:
$ sqoop import --connect jdbc:mysql://192.168.56.121:3306/metastore --username hiveuser --password redhat --table TBLS
您还可以使用它--options-file可以用这种方法重用一些配置参数来传输文件:
$ sqoop --options-file /users/homer/work/import.txt --table TES
/users/homer/work/import.txt 文件如下:
import
--connect
jdbc:mysql://192.168.56.121:3306/metastore
--username
hiveuser
--password
redhat
二、Sqoop使用说明书 1、测试连接:(1)显示mysql数据库列表
sqoop list-databases –connect jdbc:mysql:///hadoop00030003:3306/--username root –P
(2)显示数据库中的所有表格:
sqoop list-tables --connectjdbc:mysql:///hadoop00030003:3306/EDW --username root -P
2、Mysql和HDFS互导(1)mysql导入hdfss
fin___cashier_order导入hdfs,导入前查询fin_cashier_order表中的数据
共:199条
sqoop import --connectjdbc:mysql:///hadoop00030003:3306/ssa --username root --password ***** --table fin_cashier_order --target-dir/user/hadoop/databases/ssa/fin_cashier_order -m 4
-M表示Map并发数
若是不写--target-dir默认为hdfs上的user//username/tablename 路径
如果重复执行,会提示目录已经存在,可以手动删除
运行mapreduce后,去HDFS检查
验证hdfs导入的数据:
hadoop fs -ls /user/hadoop/databases/ssa/fin_cashier_order
hadoop fs -cat /user/hadoop/databases/ssa/fin_cashier_order/part-m-00000
(2)HDFS导入mysql
将HDFS中的数据导入Mysql表中,需要提前在mysql中建立空表fin_cashier_order2,此时此表为空
sqoop export --connectjdbc:mysql:///hadoop00030003:3306/ssa --table fin_cashier_order2 --username root--password ****** --export-dirhdfs://jrtestcluster/user/hadoop/databases/ssa/fin_cashier_order/
运行完显示
16/02/25 16:23:39 INFOmapreduce.ExportJobBase: Transferred 70.4619 KB in 48.3235 seconds (1.4581KB/sec)
16/02/25 16:23:39 INFO mapreduce.ExportJobBase:Exported 199 records.
显示导出199条记录。
到表fin_______cashier_order2查看
而且正好是199条。
到目前为止,Mysql和HDFS的互导功都是用Sqop验证的
您还可以指定其他参数:
参数
说明
--append
将数据添加到hdfs中现有的dataset中。使用此参数,sqoop将数据导入临时目录,然后将文件重新命名为正式目录,以避免与目录中现有的文件重名。
--as-avrodatafile
将数据导入Avro数据文件
--as-sequencefile
将数据导入sequence文件
--as-textfile
将数据导入普通文本文件,生成文本文件后,可以通过hive中的sql语句查询结果。
--boundary-query <statement>
边界查询,即在导入前通过SQL查询获得结果集,然后导入的数据是结果集中的数据,格式如下:--boundary-query 'select id,no from t where id = 3'
,导入的数据是id=3的记录,或者select min(<split-by>), max(<split-by>) from <table name>
,注意查询字段中不能有字符串字段的数据类型,否则会报错
--columns<col,col>
指定要导入的字段值,格式如下:--columns id,username
--direct
直接导入模式使用与数据库相关的导入和导出工具。官方网站表示,这种导入将更快
--direct-split-size
在使用上述direct直接导入的基础上,根据字节数对导入的流量进行分块,特别是当使用直接连接模式从PostgresQL导入数据时,可以将达到设定大小的文件分为几个独立的文件。
--inline-lob-limit
设置大对象数据类型的最大值
-m,--num-mappers
启动N个map并行导入数据,默认为4个,最好不要将数字设置为高于集群的节点数
--query,-e <sql>
在使用该参数时,必须指定从查询结果中导入数据–target-dir
、–hive-table
,where条件必须包含在查询语句中,where条件必须包括在内\$CONDITIONS
,示例:--query 'select * from t where \$CONDITIONS ' --target-dir /tmp/t –hive-table t
--split-by <column>
表中的列名用于分割工作单元,一般跟随主键ID
--table <table-name>
关系数据库表名,数据从表中获取
--delete-target-dir
删除目标目录
--target-dir <dir>
指定hdfs路径
--warehouse-dir <dir>
与--target-dir
指定数据导入的存储目录不能同时使用,适用于hdfs导入,不适用于hive目录导入
--where
从关系数据库导入数据时的查询条件,例如:--where "id = 2"
-z,--compress
压缩参数,默认情况下数据没有压缩,Gzip压缩算法可用于压缩数据,适用于SequenceFile, text文本文件, 以及Avro文件
--compression-codec
Hadoop压缩编码默认为gzip
--null-string <null-string>
如果没有指定可选参数,将使用字符串null
--null-non-string <null-string>
如果没有指定可选参数,将使用字符串null
示例程序:
$ sqoop import --connect jdbc:mysql://192.168.56.121:3306/metastore --username hiveuser --password redhat --table TBLS --columns "tbl_id,create_time" --where "tbl_id > 1" --target-dir /user/hive/result
使用 sql 语句
参照上表,使用 sql 语句查询时,需要指定$CONDITIONS
$ sqoop import --connect jdbc:mysql://192.168.56.121:3306/metastore --username hiveuser --password redhat --query 'SELECT * from TBLS where \$CONDITIONS ' --split-by tbl_id -m 4 --target-dir /user/hive/result
上述命令通过-m 1
使用 direct 模式:
$ sqoop import --connect jdbc:mysql://192.168.56.121:3306/metastore --username hiveuser --password redhat --table TBLS --delete-target-dir --direct --default-character-set UTF-8 --target-dir /user/hive/result
指定文件输出格式:
$sqoop import --connect jdbc:mysql://192.168.56.121:3306/metastore --username hiveuser --password redhat --table TBLS --fields-terminated-by"\t"--lines-terminated-by"\n"
这时候查看 hdfs 中间数据(观察分隔符是否为制表符):
$ hadoop fs -ls resultFound 5 items-rw-r--r-- 3 root hadoop 0 2014-08-04 16:07 result/_SUCCESS-rw-r--r-- 3 root hadoop 69 2014-08-04 16:07 result/part-m-00000-rw-r--r-- 3 root hadoop 0 2014-08-04 16:07 result/part-m-00001-rw-r--r-- 3 root hadoop 142 2014-08-04 16:07 result/part-m-00002-rw-r--r-- 3 root hadoop 62 2014-08-04 16:07 result/part-m-00003$ hadoop fs -cat result/part-m-0000034 1406784308 8 0 root 0 45 test1 EXTERNAL_TABLE null null null$ hadoop fs -cat result/part-m-0000240 1406797005 9 0 root 0 52 test2 EXTERNAL_TABLE null null null42 1407122307 7 0 root 0 59 test3 EXTERNAL_TABLE null null null
指定空字符串:
$ sqoop import --connect jdbc:mysql://192.168.56.121:3306/metastore --username hiveuser --password redhat --table TBLS --fields-terminated-by "\t" --lines-terminated-by "\n" --delete-target-dir --null-string '\\N' --null-non-string '\\N' --target-dir /user/hive/result
若需要指定压缩:
附:可选文件参数如下表所示。
参数
说明
--enclosed-by <char>
在字段值前后加入指定的字符,如双引号、示例:--enclosed-by '\"'
,显示例:“3”,“jimsss","dd@dd.com"
--escaped-by <char>
对于双引号进行转义处理,如字段值为“测试”--escaped-by "\\"
hdfs处理后的显示值为:\"测试\""
,对单引号无效
--fields-terminated-by <char>
设置每个字段以什么符号结束,默认为逗号,也可以改为其他符号,如句号.
,示例如:--fields-terminated-by
--lines-terminated-by <char>
设置每个记录行之间的分隔符,默认是换行串,但也可以设置自己需要的字符串,例如:--lines-terminated-by "#"
以#号分隔
--mysql-delimiters
Mysql默认设置分隔符,字段之间设置,
隔开,行间换行\n
隔离,默认转义符号为\
,字段值为单引号'
包含起来。
--optionally-enclosed-by <char>
enclosed-by强制在每个字段值前后添加指定的符号,而--optionally-enclosed-by
只需将指定的符号添加到具有双引号或单引号的字段值中,即可选
3、Mysql和Hive互导
以下错误:
错误1:
ERROR tool.ImportTool: EncounteredIOException running import job: java.io.IOException: DataStreamer Exception:
atorg.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.run(DFSOutputStream.java:796)
Caused by: java.lang.OutOfMemoryError:unable to create new native thread
at java.lang.Thread.start0(Native Method)
at java.lang.Thread.start(Thread.java:714)
atorg.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.initDataStreaming(DFSOutputStream.java:581)
at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.run(DFSOutputStream.java:669)
解决方法:
net.ipv4.ip_local_port_range = 1024 65000
修改系统参数
echo "100000" > /proc/sys/kernel/threads-max
echo "100000" > /proc/sys/kernel/pid_max(默认32768)
echo "200000" > /proc/sys/vm/max_map_count(默认65530)
修改/etc/security/limits.conf
* - nproc 999999* -nofile 999999PS:nproc是修改系统的max user processes大小;nofile 修改open files的大小,以及linux 2.6.在25内核之前,有一个宏定义,定义了这个值的最大值,1024*1024,正好是100万,而在2.6.25内核及其后,此值可通过/proc/sys/fs/nr_open设置,但是,99999就够了。很多人可能会遇到,只能启动32000多个线程,就不能再启动更多的线程。其实是pid_max = 32768 给限制住了
通过sqoopp增加map的数量 -m 选项指定更多的map。通过更多的map,减少每个子过程占用的heap space,避免超过hadoop设置的java heap space 大小sqoop ... -m <map 数量>
错误2:
Caused by: java.lang.RuntimeException:java.sql.SQLException: Access denied for user 'root@hadoop03 (usingpassword: YES)
atorg.apache.sqoop.mapreduce.db.DBInputFormat.getConnection(DBInputFormat.java:220)
atorg.apache.sqoop.mapreduce.db.DBInputFormat.setConf(DBInputFormat.java:165)
... 9 more
程序正常运行,结果正确。说明数据库连接是正确的,也可以单独用mysql连接。报告这个异常错误。
查询数据库中的用户信息
JDBC连接的机器名称是hadoop03,虽然已经赋予root所有机器远程访问权限(”%),但hadoop03账户可能无法打开机器的远程权限。因此,为hadoop03机器打开远程权限。
GRANT ALL PRIVILEGES ON *.* TO'root@hadoop03 IDENTIFIED BY ******** WITH GRANT OPTION;
再次执行导入命令。成功。上述错误不再出现。
错误3:
从mysql导入到Hive报告如下错误:
ERROR hive.HiveConfig: Could not loadorg.apache.hadoop.hive.conf.HiveConf. Make sure HIVE_CONF_DIR is set correctly.
16/02/26 14:43:47 ERROR tool.ImportTool:Encountered IOException running import job: java.io.IOException:java.lang.ClassNotFoundException: org.apache.hadoop.hive.conf.HiveConf
数据已导入HDFS。从HDFS移动到Hive时出错。提示HIVE_CONF_DIR配置不正确。
但是,HIVE_CONF_DIR添加到sqopp中-env.sh、hadoop-env.sh、hive-env.sh不起作用。
最终正确的解决方案:
在/etc/profile 添加下面一句话
exportHADOOP_CLASSPATH=$HADOOP_CLASSPATH:$HIVE_HOME/lib/*
Sqoop-1.4.7版本似乎解决了这个问题。期待这个版本