Sqoop是一个开源的数据传输工具,主要用于hadoop和关系型数据库之间进行数据传递。如MySQL ,Oracle ,Postgresql等.
Sqoop分client和server,server安装在hadoop集群中的某个节点上,这个节点充当要连接sqoop的入口节点,,client端不需要安装hadoop.
复制sqoop的安装包到某个节点,这个节点需要安装和配置hadoop,你不需要运行hadoop的有关服务,但是这个节点必须能够充当hadoop client..比如你必须可以访问dfs
hadoop fs -ls
sqoop依赖于hadoop的jar包和jdbc包
TODO:[明天补充],这个是修改server/conf/catalina.preperties中的一个变量....
/bin/sqoop.sh server start
> * 列出mysql数据库中的所有数据库
sqoop list-databases --connect jdbc:mysql://localhost:3306/ --username root --password 123456
> * 连接mysql并列出test数据库中的表
sqoop list-tables --connect jdbc:mysql://localhost:3306/test --username root --password 123456
> * 将关系型数据的表结构复制到hive中,只是复制表的结构,表中的内容没有复制过去。
sqoop create-hive-table --connect jdbc:mysql://localhost:3306/test --table table_name --username root --password 123456 --hive-table table_name
> * 从关系数据库导入文件到hive中
sqoop import --connect jdbc:mysql://localhost:3306/zxtest --username root --password 123456 --table table_name --hive-import --hive-table table_name -m 1
> * 将hive中的表数据导入到mysql(要导入的mysql表必须提前建好)
sqoop export --connect jdbc:mysql://localhost:3306/test --username root --password root --table table_name --export-dir /user/hive/warehouse/xxxxxx/pdate=2014-05-03
> * 从数据库导出表的数据到HDFS上文件
sqoop import --connect jdbc:mysql://localhost:3306/test--username root --password 123456 --table table_name -m 1
补充:上边是sqoop1.4,也就是只能匹配hadoop1.x版本。网上资料非常多,不多说。
下午在公司装了sqoop1.9,对应hadoop2.x..发现apache文档简陋,并且网上也很少说到sqoop1.9的版本情况,后续补上在安装和使用遇到的问题和心得。
贴出工作中整理的sqoop1.99.3文档
Sqoop是一款开源的工具,主要用于在HADOOP(Hive)与传统的数据库(mysql、postgresql...)间进行数据的传递。
Sqoop项目开始于2009年,最早是作为Hadoop的一个第三方模块存在,后来为了让使用者能够快速部署,也为了让开发人员能够更快速的迭代开发,Sqoop独立成为一个Apache项目。
Sqoop现在分为两个版本,sqoop1和sqoop2,两个版本架构完全不同,完全不兼容,公司使用的hadoop版本为hadoop2.x,但是sqoop1不支持hadoop2.x并且sqoop1的资料比较多,这里不做介绍。文档主要针对sqoop2(sqoop.1.99.3)版本。
A) 下载
wget http://mirrors.cnnic.cn/apache/sqoop/1.99.3/sqoop-1.99.3-bin-hadoop200.tar.gz
B) 安装
tar -xvzf sqoop-1.99.gz
C) 配置
cd sqoop-1.99.3/server/conf
修改sqoop.engine.direcotory
Vi sqoop.properties
将#org.apache.sqoop.submission.engine.mapreduce.configuration.directory=/etc/hadoop/conf/改为
org.apache.sqoop.submission.engine.mapreduce.configuration.directory=自己的hadoop命令路径
修改catalina.properties配置的配置项
common.loader=xxx.jar,xxx.jar,增加hadoop的依赖jar
这里要注意jar包依赖冲突,如果有冲突请检查tomcat依赖的lib下的jar 和hadoop依赖的jar
cd /home/q/sqoop-1.99.3/bin && sudo -u flightdev ./sqoop.sh server start
cd /home/q/sqoop-1.99.3/bin && sudo -u flightdev ./sqoop.sh server stop
cd /home/q/sqoop-1.99.3/bin sudo -u flightdev ./sqoop.sh client
set server --host l-bidb1.f.cn6
Id=2的链接可用,链接的mysql为:jdbc:mysql://ip:port/db
查看job详细: show job -all
create job --xid 2 --type import // --xid 2 表示为使用ID=2的connection,
--type 表示类型,,import、export 【导入、导出】
Job详细内容设置可以参考一个已有的job,不过有的参数还不清楚什么意思
一个job需要配置的信息有
[敲入create job --xid 2 --type import 后进入创建job交互状态]:
Name: cole.zhang
Schema name:
Table name: Acquisition
Table SQL statement:
Table column names:
Partition column name: user
Nulls in partition column:
Boundary query:
Output configuration
Storage type:
0 : HDFS
Choose: 0
Output format:
0 : TEXT_FILE
1 : SEQUENCE_FILE
Choose: 0
Compression format:
0 : NONE
1 : DEFAULT
2 : DEFLATE
3 : GZIP
4 : BZIP2
5 : LZO
6 : LZ4
7 : SNAPPY
Choose: 1
Output directory: cole.zhang/test
Update job --jid 2
Start job --jid 2
Status job --jid 2
Stop job --jid 2
修改源码中 org.apache.sqoop.shell.utils.FormFiller中对Boundary query的size控制,默认大小为50
* 初步调研数据库中的表要符合以下条件才能使用增量导出:
表中有类型为Int或bigint的主键
必须有日期字段
2. 配置Job信息:
Name: job的名字
Schema name:
Table name:要全量导出一张表,请填写表名,table name 和 table sql statement不能同时配置
Table SQL statement:如果填写格式必须为 select xxx from table_name where ${CONDITIONS}
Table column names:
Partition column name: 使用哪个字段来填充过滤条件 userid
Nulls in partition column:
Boundary query: 这里要写一个查询语句,返回值需为整形,sqoop运行job时,会自动填充${CONDITIONS} 这个占位符 如:select 0,10 from table,那填充的sql为
Select xxx from table_name where userid>0 and userid<10
Output configuration 输出配置
Storage type: 类型
0 : HDFS
Choose: 0
Output format: 文件格式
0 : TEXT_FILE
1 : SEQUENCE_FILE
Compression format: 压缩格式
0 : NONE
1 : DEFAULT
2 : DEFLATE
3 : GZIP
4 : BZIP2
5 : LZO
6 : LZ4
7 : SNAPPY
Output directory: 输出目录
Throttling resources
Extractors:
Loaders:
初步调研,sql可以做到符合要求的表按天增量导出,但是Output directory这个是固定的,所以当导出完成后,要立即进行入库操作,然后删除目录以备下次使用。
自定义SQL:
通过测试:以下sql都是可以的:
1. select * from ucall_center where ${CONDITIONS}
2. select * from ucall_center where ${CONDITIONS} and (date like '%2014-05-09')
3. 关联导出:select x.date from (select * from ucall_center where ${CONDITIONS} and (date like '%2014-05-09'))x join Data_Acquisition_TeamUser y limit 1;
TODO:
1. 继续调研下sqoop2的功能
2. 性能测试