1、Sqoop 简介
Apache sqoop 是一个专门为高效在 Apache hadoop 和结构化数据库之间传输大规模数据的工具,可以用来在 MySQL,postgresql,Oracle 和 HDFS 之间传输数据。Sqoop 开始于 2012 年 3 月份,现在是 Apache 的顶级项目。目前最稳定的 sqoop1 版本也是 sqoop1 的最后一个版本是 1.4.6,最新的 sqoop2 版本是 1.99.7。Sqoop1 和 sqoop2 之间不兼容。
下载地址:http://sqoop.apache.org
文档地址:http://sqoop.apache.org/docs/…
2、Sqoop 安装
(1)、编辑 sqoop/conf/sqoop-env.sh
若是不用 hbase 和 hive 的话就不用配置,需要使用 zookeeper 的话自己配置 zookeeper 的 home, 这里仅仅只配置了 hive,其他类似。export HIVE_HOME=XXXX
(2)、编辑 sqoop/bin/configure-sqoop
根据需要注释掉自己不用的东西:根据自己的需要注释掉了 HCAT_HOME、ACCUMULO_HOME、ZOOKEEPER_HOME
(3)、测试
命令行输入:sqoop version
显示如下:06/09/19 15:28:49 INFO sqoop.Sqoop: Running Sqoop version: 1.4.5
Sqoop 1.4.5
git commit id 5b34accaca7de251fc91161733f906af2eddbe83
Compiled by abe on Fri Aug 1 11:19:26 PDT 2014
3、sqoop 命令行简介
(1)、sqoop list-databases 命令
列出 pg 数据库下的所有数据库:
例子:
sqoop list-databases --connect jdbc:postgresql://host:port --username user --password pass
(2)、sqoop list-tables 命令
列出 pg 数据库下某数据库下所有表:
例子:
sqoop list-tables --connect jdbc:postgresql://host:port/database --username user --password pass
(3)、sqoop create-hive-table 命令
在 hive 上创建一个和关系型数据库一样的表:
sqoop create-hive-table --connect jdbc:postgresql://host:port/database --username user --password pass --table table_name --hive-database hive_database --hive-table hive_table_name
其中:
--table 标识关系数据库中的表
--hive-database 标识 hive 中的目标库
--hive-table 标识 hive 中的目标表
(4)、sqoop import 命令
sqoop 的核心功能,将数据从关系型数据库导入到 hive 或者 hdfs 中
导入数据到 hive 例子:
sqoop import --connect jdbc:postgresql://$HOST:$PORT/$DATABASES --username $USER --password $PASS --direct --hive-import --hive-database $hive_db --hive-table $hive_tb --map-column-java $arg --map-column-hive $arg --table $pg_tb --where "$wh" -- --schema public --input-null-string '\\N' --input-null-non-string '\\N'
其中:
--connect: 数据库的地址,里面包含有用到的数据库名和端口号等信息
--username: 连接关系型数据库的用户名
--password: 相应的应户名密码
--direct:sqoop 的快速传输模式,去掉此命令则会在传输中用 MapReduce 的方式传输数据
--hive-import:标识传输数据到 hive,类似的有 --hbase-import 等
--hive-database:数据传输到 hive 的目标数据库
--hive-table:数据传输到 hive 的目标表
--map-column-java:数据库字段在生成的 java 文件中会映射为各种属性,且默认的数据类 型与数据库类型保持对应,比如数据库中某字段的类型为 bigint,则在 Java 文件中的数据类型为 long 型,通过这个属性,可以改变数据库字段在 java 中映射的数据类型,格式如:–map-column-java DB_ID=String,id=Integer
--map-column-hive:生成 hive 表时,可以更改生成字段的数据类型,格式如:–map-column-hive TBL_ID=String,LAST_ACCESS_TIME=string
--table:关系型数据库中的表名字
--where:关系型数据库中的限制条件,可以选择同步的数据集合
-- --schema:pg 中用到的 schema 名字
--input-null-string:string 类型的字段值为 null 时的填充值
--input-null-non-string:非 string 类型的字段值为 null 时的填充值
导入数据到 hdfs 例子:
sqoop import --connect jdbc:postgresql://$HOST:$PORT/$DATABASES --username user --password pass --append --target-dir /user/ticketdev --direct --table ttd_first_order_info -- --schema transformation
其中:
--append:增量同步,每次同步时候先把数据发到临时目录,然后 copy 到目标目录
--target-dir:目标目录
更新
在用 sqoop 导入表的时候,发现同一张表从 pg 到 hive 会多出来很多几乎全部为 null 的行,原因是在字段中有 n 导致的,查资料发现用 –hive-drop-import-delims 可以解决这个问题,用法是直接加上 –hive-drop-import-delims 就可以了后面不用指定字符,会默认的去掉 n,r,01 等字符。
例:
sqoop import --connect jdbc:postgresql://$HOST:$PORT/$DATABASES --username $USER --password $PASS --hive-drop-import-delims --hive-import --hive-database $hive_db --hive-table $hive_tb --table $pg_tb -- --schema $pg_db
需要注意的地方是 –hive-drop-import-delims 和 –direct 不兼容!
还会有集群机器访问数据库权限问题。
这样的话就需要走 MapReduce 的方式同步,问题又出现了:如果表里面没有主键,就需要加上 -m 1,-m 表示启动几个 map 任务来读取数据,如果数据库中的表没有主键这个参数是必须设置的而且只能设定为 1 否则会提示错误;
例:
sqoop import -m 1 --connect jdbc:postgresql://$HOST:$PORT/$DATABASES --username $USER --password $PASS --hive-drop-import-delims --hive-import --hive-database $hive_db --hive-table $hive_tb --table $pg_tb -- --schema $pg_db
这时候又会出现提示:hdfs://qunarcluster/user/ticketdev/table_name 这个目录已经存在的问题,现在需要在前面先删除这个目录,然后执行 sqoop 命令;
更新
pg 中数据有乱码的时候,同步到 hive 会导致 hive 表大面积乱码。
同步的时候可以限制字符编码:
sqoop import --connect "jdbc:postgresql://HOST:PORT/database?useUnicode=true&characterEncoding=utf-8" --username USER --password PASS --direct --hive-import --hive-database hive_db --hive-table hive_tb --table pg_tb -- --schema pg_schema