一、概述
sqoop 是 apache 旗下一款“Hadoop 和关系数据库服务器之间传送数据”的工具。
核心的功能有两个:1、导入、迁入 2、导出、迁出
导入数据:MySQL,Oracle 导入数据到 Hadoop 的 HDFS、HIVE、HBASE 等数据存储系统
导出数据:从 Hadoop 的文件系统中导出数据到关系数据库 mysql 等 Sqoop 的本质还是一个命令行工具,和 HDFS,Hive 相比,并没有什么高深的理论。
sqoop:
工具:本质就是迁移数据, 迁移的方式:就是把sqoop的迁移命令转换成MR程序
hive
工具,本质就是执行计算,依赖于HDFS存储数据,把SQL转换成MR程序
二、工作机制
将导入或导出命令翻译成 MapReduce 程序来实现 在翻译出的 MapReduce 中主要是对 InputFormat 和 OutputFormat 进行定制
三、安装及基本命令
1、修改 sqoop-env.sh
export HADOOP_COMMON_HOME=/home/hadoop/apps/hadoop-2.7.5
#Set path to where hadoop-*-core.jar is available
export HADOOP_MAPRED_HOME=/home/hadoop/apps/hadoop-2.7.5
#set the path to where bin/hbase is available
export HBASE_HOME=/home/hadoop/apps/hbase-1.2.6
#Set the path to where bin/hive is available
export HIVE_HOME=/home/hadoop/apps/apache-hive-2.3.3-bin
#Set the path for where zookeper config dir is
export ZOOCFGDIR=/home/hadoop/apps/zookeeper-3.4.10/conf
2、导入需要的jar包
hive/lib下mysql 驱动包,拷贝到sqoop的lib
hive/lib下hive-common-2.3.3.jar包,拷贝到sqoop的lib
hive/lib下hive-exec-1.2.1.jar,拷贝到sqoop的lib
3、验证安装是否成功
sqoop-version 或者 sqoop version
4、基本操作
(1)列出mysql有哪些数据库
sqoop list-databases \
--connect jdbc:mysql://localhost:3306/ \
--username root \
--password 123456
如果报错: Access denied for user 'root'@'hdp-1' (using password: YES)
将hdp-1修改成localhost,或者用hdp-2操作hdp-1的mysql
(2)列出某个数据库有哪些表
sqoop list-tables \
--connect jdbc:mysql://hdp-1:3306/mysql \
--username root \
--password 123456
(3)创建一张跟mysql中的help_keyword表一样的hive表hk:
sqoop create-hive-table \
--connect jdbc:mysql://hdp-1:3306/sqoop \
--username root \
--password 123456 \
--table tb3 \
--hive-table sqoop
版本问题会导致 ERROR tool.CreateHiveTableTool: Encountered IOException running create table job: java.io.IOException: Hive exited with status 1
四、数据导入
一 、 从RDBMS导入到HDFS中
1、语法格式
sqoop import (generic-args) (import-args)
2、常用参数
--connect <jdbc-uri> jdbc 连接地址
--connection-manager <class-name> 连接管理者
--driver <class-name> 驱动类
--hadoop-mapred-home <dir> $HADOOP_MAPRED_HOME
--help help 信息
-P 从命令行输入密码
--password <password> 密码
--username <username> 账号
--verbose 打印流程信息
--connection-param-file <filename> 可选参数
普通导入:导入mysql库中的tb3数据到HDFS上
导入的默认路径:/user/hadoop/tb3
./sqoop import \
--connect jdbc:mysql://hdp-1:3306/sqoop \
--username root \
--password 123456 \
--table tb3 \
-m 1
导入: 指定分隔符和导入路径
sqoop import \
--connect jdbc:mysql://hadoop1:3306/mysql \
--username root \
--password root \
--table help_keyword \
--target-dir /user/hadoop11/my_help_keyword1 \
--fields-terminated-by '\t' \
-m 2
导入数据:带where条件
sqoop import \
--connect jdbc:mysql://hadoop1:3306/mysql \
--username root \
--password root \
--where "name='STRING' " \
--table help_keyword \
--target-dir /sqoop/hadoop11/myoutport1 \
-m 1
查询指定列
sqoop import \
--connect jdbc:mysql://hadoop1:3306/mysql \
--username root \
--password root \
--columns "name" \
--where "name='STRING' " \
--table help_keyword \
--target-dir /sqoop/hadoop11/myoutport22 \
-m 1
selct name from help_keyword where name = "string"
导入:指定自定义查询SQL
sqoop import \
--connect jdbc:mysql://hadoop1:3306/ \
--username root \
--password root \
--target-dir /user/hadoop/myimport33_1 \
--query 'select help_keyword_id,name from mysql.help_keyword where $CONDITIONS and name = "STRING"' \
--split-by help_keyword_id \
--fields-terminated-by '\t' \
-m 4
在以上需要按照自定义SQL语句导出数据到HDFS的情况下:
1、引号问题,要么外层使用单引号,内层使用双引号,$CONDITIONS的$符号不用转义, 要么外层使用双引号,那么内层使用单引号,然后$CONDITIONS的$符号需要转义
2、自定义的SQL语句中必须带有WHERE \$CONDITIONS
二、把MySQL数据库中的表数据导入到hbase
sqoop import \
--connect jdbc:mysql://hadoop1:3306/mysql \
--username root \
--password root \
--table help_keyword \
--hbase-table new_help_keyword \
--column-family person \
--hbase-row-key help_keyword_id
(三)把MySQL数据库中的表数据导入到hive
bin/sqoop import --connect jdbc:mysql://s201:3306/test --username sqoop --password sqoop --table emp --hive-import --m 1
五、数据导出
1、从hdfs导出至mysql
前提环境:export-dir中包含传输的数据,且数据之间按input-fields-terminated-by分割,要提前保证mysql中存在表table employee,且数据结构一致(否则报错)
bin/sqoop export \
--connect jdbc:mysql://hdp-1:3306/userdb \
--username root \
--password 123456\
--table employee \
--export-dir /user/centos/emp/
--input-fields-terminated-by ','
导出的时候容易报错:Export job failed!
解决方法:1、字符集编码改成:utf-8
2、指定map为1,即在命令最后加 “--m 1” 默认的map是4个