Apache Sqoop
Sqoop 是 Hadoop 和关系数据库服务器之间传送数据的一种工具。它是用来从关系数据库如: MySQL, Oracle 到 Hadoop 的HDFS,并从 Hadoop 的文件系统导出数据到关系数据库。 由 Apache 软件基金会提供。
Sqoop: “SQL 到 Hadoop 和 Hadoop 到 SQL” 。
Sqoop 工作机制是将导入或导出命令翻译成 mapreduce 程序来实现。
在翻译出的 mapreduce 中主要是对 inputformat 和 outputformat 进行定制。
sqoop 安装
安装环境:
CentOS6.7x64(默认已安好jdk, hadoop及mysql)
sqoop版本: 1.4.6
安装步骤:
-
上传解压重命名
-
修改conf里的文件
cp sqoop-env-template.sh sqoop-env.sh vi sqoop-env.sh #添加如下配置: export HADOOP_COMMON_HOME=/export/server/hadoop-2.7.4 export HADOOP_MAPRED_HOME=/export/server/hadoop-2.7.4 export HIVE_HOME=/export/server/hive
-
加入 mysql 的 jdbc 驱动包
将mysql-connector-java-5.1.28.jar拷贝到sqoop的lib目录下 -
验证启动
在sqoop根目录下执行:bin/sqoop list-databases --connect jdbc:mysql://localhost:3306/ --username root --password 1234
执行此命令会列出所有 mysql 的数据库.
sqoop的简单使用
-
导入mysql表数据到hdfs
在sqoop根路径下执行如下命令,将数据库userdb中的emp表导入到hdfs的/sqoopresult路径下bin/sqoop import \ --connect jdbc:mysql://localhost:3306/userdb \ --username root \ --password 1234 \ --target-dir /sqoopresult \ --table emp --m 1
执行完成后查看hdfs的/sqoopresult路径下的文件
[root@node1 sqoop]# hdfs dfs -cat /sqoopresult/part-m-00000 1201,gopal,manager,50000,TP 1202,manisha,Proof reader,50000,TP 1203,khalil,php dev,30000,AC 1204,prasanth,php dev,30000,AC 1205,kranthi,admin,20000,TP
数据和emp表中相吻合
-
导入mysql表数据到hive
执行如下命令,在hive中的test1库中创建emp_add_sp表,并复制mysql中的emp_add表结构(表数据不会导入)
bin/sqoop create-hive-table \ --connect jdbc:mysql://localhost:3306/userdb \ --table emp_add \ --username root \ --password 1234 \ --hive-table test1.emp_add_sp
然后在执行如下命令,将表数据导入到hive中的表
bin/sqoop import \ --connect jdbc:mysql://localhost:3306/userdb \ --username root \ --password 1234 \ --table emp_add \ --hive-table test1.emp_add_sp \ --hive-import \ --m 1
执行完成后连接hive进行查看
0: jdbc:hive2://node1:10000> select * from emp_add_sp; +----------------+-----------------+--------------------+------------------+--+ | emp_add_sp.id | emp_add_sp.hno | emp_add_sp.street | emp_add_sp.city | +----------------+-----------------+--------------------+------------------+--+ | 1201 | 288A | vgiri | jublee | | 1202 | 108I | aoc | sec-bad | | 1203 | 144Z | pgutta | hyd | | 1204 | 78B | old city | sec-bad | | 1205 | 720X | hitec | sec-bad | +----------------+-----------------+--------------------+------------------+--+
数据与mysql表中一致
-
导入表数据子集
还可以使用查询语句将查询出来的表数据进行导入操作
例如: --where 可以指定从关系数据库导入数据时的查询条件,它执行在各自的数据库服务器相应的 SQL 查询,并将结果存储在 HDFS 的目标目录bin/sqoop import \ --connect jdbc:mysql://localhost:3306/userdb \ --username root \ --password 1234 \ --where "city ='sec-bad'" \ --target-dir /wherequery \ --table emp_add \ --m 1
使用–query执行查询语句,将结果进行hdfs导入; --split-by指定字段切割; --fields-terminated-by指定分割符
bin/sqoop import \ --connect jdbc:mysql://localhost:3306/userdb \ --username root \ --password 1234 \ --target-dir /wherequery12 \ --query 'select id,name,deg from emp WHERE id>1203 and $CONDITIONS' \ --split-by id \ --fields-terminated-by '\t' \ --m 1
-
增量导入
增量导入示例:bin/sqoop import \ --connect jdbc:mysql://localhost:3306/sqoopdb \ --username root \ --password 1234 \ --table emp --m 1 \ --incremental append \ --check-column id \ --last-value 1205
其中–incremental append表示是增加模式, --check-column id表示使用id字段作为检查字段; --last-value 1205表示记录上次数据导入到id=1205处
–check-column一般选择使用自增主键
–last-value参数可以使用变量替代,以实现自动记录 -
导出数据至mysql
首先需要手动创建mysql中的目标表:
mysql> USE userdb; CREATE TABLE employee ( id INT NOT NULL PRIMARY KEY, name VARCHAR(20), deg VARCHAR(20), salary INT, dept VARCHAR(10));
然后执行导出命令, 将hdfs的/emp_data下的文件内容导出至employee表中
bin/sqoop export \ --connect jdbc:mysql://localhost:3306/userdb \ --username root \ --password 1234 \ --table employee \ --export-dir /emp_data