Sqoop是一个用来将和关系型数据库中的数据相互转移的工具,可以将一个关系型(例如 : MySQL ,Oracle ,Postgres等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。Sqoop是为大数据集设计的。Sqoop支持增量更新,将新记录添加到最近一次的导出的数据源上,或者指定上次修改的时间戳。
接下来我们看一下如何安装与做简单示例
要安装Sqoop与简单应用,当然需要先安装好Hadoop,Hive, 相关的数据库,如Mysql,Sql Server
一、下载安装包
1、 下载地址:选择CDH相应版本下的
下载sqoop-1.4.5-cdh5.3.6.tar.gz安装包
2、解压sqoop-1.4.5-cdh5.3.6.tar.gz至指定目录,如:/opt
mv sqoop-1.4.5-cdh5.3.6.tar.gz /opt
tar -zxvf sqoop-1.4.5-cdh5.3.6.tar.gz
二、配置环境变量
/etc/profile
#sqoop enviroment export SQOOP_HOME=/opt/sqoop-1.4.5-cdh5.3.6export PATH=$PATH:$SQOOP_HOME/bin
三、Sqoop配置项更改
1、$HIVE_HOME/conf/hive-env.sh
example,这里具体值是我本地测试目录,可自行更改,如果数据操作不涉及Hbase,那么相关Hbase的配置可以不配,如果没有独立的ZooKeeper集群,那么ZooKeeper不用配置
export HADOOP_COMMON_HOME=/opt/hadoop/hadoop-2.7.3#Set path to where hadoop-*-core.jar is available#export HADOOP_MAPRED_HOME=export HADOOP_MAPRED_HOME=/opt/hadoop/hadoop-2.7.3#set the path to where bin/hbase is available#export HBASE_HOME=#Set the path to where bin/hive is available#export HIVE_HOME=export HIVE_HOME=/opt/hive/apache-hive-2.1.1.bin
2、配置jdbc驱动包
下载mysql的jdbc驱动包mysql-connector-java-5.1.6-bin.jar放入sqoop的lib目录下$SQOOP_HOME/lib
下载sqlserver的jdbc驱动包sqljdbc4.jar放入sqoop的lib目录下$SQOOP_HOME/lib
四、连接数据库与表命令
因本地Sql server数据库的表有数据,就以Sql Server为例,mysql相似
1、连接数据库,查看数据库列表
sqoop list-databases --connect 'jdbc:sqlserver://10.10.0.1:1433;instanceName=SQL2008;username=test;password=test;database=testDB'
2、连接sqlserver列出数据库在表
sqoop list-tables \--connect'jdbc:sqlserver:// 10.0.0.1:1433;instanceName=SQL2008;username=test;password=test;database=testDB’
3、导入数据库中查询的结果到指定的hdfs中目录
sqoop import \--connect 'jdbc:sqlserver://10.0.0.1:1433;instanceName=SQL2008;username=test;password=test;database=TestDB' \- -query 'select CustomerID,UserName from Customer where $CONDITIONS ' \--target-dir /user/hive/warehouse/tmp2 \--num-mappers 1
可选参数
--table //指定表名
--as-parquetfile //指定文件格式
--columns id,account //指定表的列
指定压缩
--compress
--compression-codec org.apache.hadoop.io.compress.SnappyCodec
--fields-terminated-by '\t' //指定列的分隔符,这个很关键,在导入导出时最好指定
#增量导入
--incremental append
- -check-column id //以哪个字段为依据,如id字段
--last-value 4
4、从sql server中导入到hive数据库中
sqoop import \--connect 'jdbc:sqlserver://10.0.0.1:1433;instance=SQL2008;username=test;password=test;database=TestDB' \--table Customer \--fields-terminated-by ',' \--num-mappers 1 \--hive-import \--hive-database mydatabase \--hive-table test_table
5、从HDFS中将数据导入Sql Server数据库
sqoop export \--connect 'jdbc:sqlserver://10.0.0.1:1433;instanceName=SQL2008;username=test;password=test;database=TestDB' \--table ken_test \--export-dir /user/hive/warehouse/tmp1/part-m-00000 \--num-mappers 1
本人遇到的问题:
- 导出文件指定到文件名
- Error :Verify the server and instance names and check that no firewall is blocking UDP traffic to port 1434
当有多个数据库实例时,注意开放相应的端口
如连接实例SQL2008,连接字符串中地址改为 sqlserver://10.0.0.1\SQL2008
- 一直报错,导出不成功
ERROR tool.ExportTool: Error during export: Export job failed!
最后通过表的每一个字段类型分析,主键的自增类型字段是否影响数据导入,测试结果,确实如此,不能对自增长类型字段直接赋值,当然是限于当前的环境
若是我们在数据库客户端是可以这样操作的
附参数说明:
--append
添加到HDFS已存在数据记录中
--as-sequencefile
import序列化的文件
--as-textfile
plain文件 ,默认
--columns <col,col,col…>
指定列import,逗号分隔,如:--columns "id,name"
--delete-target-dir
若已存在的import目录,则删除
--direct
直连模式,速度更快(HBase不支持)
--fetch-size <n>
一次从数据库读取n条数据
-m,--num-mappers <n>
建立 n 个并发执行task import
-e,--query <statement>
表达式<statement>执行,一般有条件查询数据时用
--split-by <column-name>
根据column分隔实例
--autoreset-to-one-mappe
如果没有主键和split-by参数 用one mapper import,此参数与split-by参数二选一
--target-dir <d>
HDFS中目标路径,如/user/hive/warehouse
--warehouse-dir <d>
HDFS 中表的父级目录
--where <where clause>
指定where从句,如果有双引号,注意转义 \$CONDITIONS,一定要加上,不能用or,子查询,join
-z,--compress
开启压缩
--null-string <null-string>
string列为空指定为此值
--null-non-string <null-string>
非string列为空指定为此值,-null这两个参数可选 , 如果不设置,会指定为"null"
--export-dir
指定导出的文件位置,不是目录,具体化文件名