Sqoop是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql、postgresql...)间进行数据的传递,可以将一个关系型数据库(例如 : MySQL ,Oracle ,Postgres等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。

Sqoop的基本认知

原理
将导入或导出命令翻译成mapreduce程序来实现。
在翻译出的mapreduce中主要是对inputformat和outputformat进行定制。
安装
Sqoop的安装也很简单,首先我们需要有有一个Sqoop安装包,这个包老夫也提供了。
我们在如下目录中:

drwxr-xr-x 2 corp corp    4096 Dec 19  2017 bin -rw-rw-r-- 1 corp corp   55089 Dec 19  2017 build.xml -rw-rw-r-- 1 corp corp   47426 Dec 19  2017 CHANGELOG.txt -rw-rw-r-- 1 corp corp    9880 Dec 19  2017 COMPILING.txt drwxr-xr-x 2 corp corp    4096 Dec 19  2017 conf drwxr-xr-x 5 corp corp    4096 Dec 19  2017 docs drwxr-xr-x 2 corp corp    4096 Dec 19  2017 ivy -rw-rw-r-- 1 corp corp   11163 Dec 19  2017 ivy.xml drwxr-xr-x 2 corp corp    4096 Dec 19  2017 lib -rw-rw-r-- 1 corp corp   15419 Dec 19  2017 LICENSE.txt -rw-rw-r-- 1 corp corp     505 Dec 19  2017 NOTICE.txt -rw-rw-r-- 1 corp corp   18772 Dec 19  2017 pom-old.xml -rw-rw-r-- 1 corp corp    1096 Dec 19  2017 README.txt -rw-rw-r-- 1 corp corp 1108073 Dec 19  2017 sqoop-1.4.7.jar -rw-rw-r-- 1 corp corp    6554 Dec 19  2017 sqoop-patch-review.py -rw-rw-r-- 1 corp corp  765184 Dec 19  2017 sqoop-test-1.4.7.jar drwxr-xr-x 7 corp corp    4096 Dec 19  2017 src drwxr-xr-x 4 corp corp    4096 Dec 19  2017 testdata

我们进入到 conf/ 目录下,先修改文件 sqoop-env.sh

export HADOOP_COMMON_HOME=/opt/module/hadoop-2.7.2 export HADOOP_MAPRED_HOME=/opt/module/hadoop-2.7.2 export HIVE_HOME=/opt/module/apache-hive-1.2.1 export ZOOKEEPER_HOME=/opt/module/zookeeper-3.4.10 export ZOOCFGDIR=/opt/module/zookeeper-3.4.10 export HBASE_HOME=/opt/module/hbase-1.1.2

再将我们的JDBC的驱动拷贝到 sqoop的 lib/ 下

cp mysql-connector-java-5.1.27-bin.jar /opt/module/sqoop-1.4.7/lib/

我们可以通过某一个command来验证sqoop配置是否正确:

bin/sqoop help  Available commands:   codegen            Generate code to interact with database records   create-hive-table  Import a table definition into Hive   eval               Evaluate a SQL statement and display the results   export             Export an HDFS directory to a database table   help               List available commands   import             Import a table from a database to HDFS   import-all-tables  Import tables from a database to HDFS   import-mainframe   Import datasets from a mainframe server to HDFS   job                Work with saved jobs   list-databases     List available databases on a server   list-tables        List available tables in a database   merge              Merge results of incremental imports   metastore          Run a standalone Sqoop metastore   version            Display version information

测试Sqoop能否连接到MySQL

bin/sqoop list-databases --connect jdbc:mysql://hadoop101:3306/ --username root --password 000000  # 出现下面的标识连接成功了 information_schema amon azkaban cm corp-ci hive hue metastore mysql oozie performance_schema telecom-customer-service test

Sqoop的连接案例

导入数据

Note: 在Sqoop中,“导入”概念指:从非大数据集群(RDBMS)向大数据集群(HDFS,HIVE,HBASE)中传输数据,叫做:导入,即使用import关键字。

RDBMS到HDFS

1) 确定Mysql服务开启正常
2) 在Mysql中新建一张表并插入一些数据
下面是老夫之前在数据库中就已经存在的数据,在140W+
telecom-custome-service

全部导入
bin/sqoop import \ --connect jdbc:mysql://hadoop101:3306/sun-iot \ --username root \ --password 000000 \ --table telecom-customer-service \ --target-dir /user/telecom-customer-service \ --delete-target-dir \ --num-mappers 1 \ --fields-terminated-by "\t"

sqoop-all-import
sqoop-all-import-result

查询导入
bin/sqoop import \ --connect jdbc:mysql://hadoop101:3306/sun-iot \ --username root \ --password 000000 \ --target-dir /user/telecom-customer-service \ --delete-target-dir \ --num-mappers 1 \ --fields-terminated-by "\t" \ --query 'select call1,call2,date_time,duration from telecom-customer-service where id <=1 and $CONDITIONS;'

Note:

提示:must contain '$CONDITIONS' in WHERE clause.
如果query后使用的是双引号,则$CONDITIONS前必须加转移符,防止shell识别为自己的变量。

导入指定列