Sqoop
(Sqoop 是连接传统关系型数据库和 Hadoop 的桥梁,它不需要开发人员编写相应的 Map Reduce 代 码,只需要编写简单的配置脚本即可,大大提升了开发效率。)
简单日志业务流程的分析 注意Sqoop的位置
Sqoop简介
官网:http://sqoop.apache.org/ :数据导入导出框架 Sqoop
Sqoop产生背景
在工作中,我们经常会遇到下面这样的场景。
场景一:将关系型数据库中某张表的数据抽取到 Hadoop(HDFS/Hive/HBase)上;
场景二:将 Hadoop 上的数据导出到关系型数据库中。
导入:Map Reduce 输入为 DBInput Format 类型,输出为 Text Output Format。
导出:Map Reduce 输入为 Text Input Format 类型,输出为 DBOutput Format。
使用 Map Reduce 处理以上两个场景时存在如下问题:每次都需要编写 Map Reduce 程序,非常麻烦。在没有出现 Sqoop 之前,实际生产中有很多类似的需求需要通过编写 Map Reduce 去实现,然后形成一个工具,后来慢慢就将该工具代码整理出一个框架并逐步完善,最终就有了 Sqoop 的诞生。
Sqoop概述
基于 Hadoop 之上的数据传输工具 Sqoop 是 Apache 的顶级项目,主要用于在 Hadoop 和关系数据 库、数据仓库、No SQL 系统间传递数据。通过 Sqoop 我们可以方便地将数据从关系数据库导入到 HDFS、HBase、Hive,或者将数据从 HDFS 导出到关系数据库。使用 Sqoop 导入导出数据的处理流程 如图 所示。
Sqoop 在 Hadoop 生态圈中的位置如图 所示。
Sqoop架构
Sqoop 的架构非常简单,其整合了 Hive、HBase 等,通过 map 任务来传输数据,map 负责数据的加 载、转换,然后存储到 HDFS、HBase 或者 Hive 中
-
从工作模式角度看待:Sqoop 是基于客户端模式的,用户使用客户端模式,只需要在一台机器上 即可完成。
-
从 Map Reduce 角度看待:Sqoop 只提交一个 map 作业,数据的传输和转换都是使用 Mapper 来完成的,而且该 Map Reduce 作业仅有 Mapper 并不需要 Reducer,在执行 Sqoop 时可以通过 YARN 监控页面查看到。
-
从安全角度看待:需要在执行时将用户名或者密码显性指定,也可以在配置文件中配置,总的来 说,安全性不是很高。
Sqoop导入和导出过程
由前面的 Sqoop 框架,可以知道 Sqoop 是通过 MapReduce 作业进行导入操作的。在导入过程中, Sqoop 从表中读取数据行,将其写入 HDFS。反之就是导出过程。
Sqoop安装
下载地址
http://archive.apache.org/dist/sqoop/1.4.7/
上传并解压
[root@node01 ~]# tar -zxvf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz
[root@node01 ~]# rm -rf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz
[root@node01 ~]# mv sqoop-1.4.7.bin__hadoop-2.6.0 /opt/yjx/
[root@node01 yjx]# cd /opt/yjx/
[root@node01 yjx]# mv sqoop-1.4.7.bin__hadoop-2.6.0 sqoop-1.4.7
配置环境变量
[root@node01 ~]# vim /etc/profile
export SQOOP_HOME=/opt/yjx/sqoop-1.4.7
export PATH=$SQOOP_HOME/bin:$PATH
[root@node01 ~]# source /etc/profile
添加mysql连接包
[root@node01 ~]# cp ~/mysql-connector-java-5.1.32-bin.jar /opt/yjx/sqoop-1.4.7/lib/
添加Hive的jar包
[root@node01 ~]# cp /opt/yjx/apache-hive-3.1.2-bin/lib/hive-exec-3.1.2.jar/opt/yjx/sqoop-1.4.7/lib/
修改Sqoop配置文件
[root@node01 ~]# cd /opt/yjx/sqoop-1.4.7/conf/
[root@node01 conf]# cp sqoop-env-template.sh sqoop-env.sh
[root@node01 conf]# vim sqoop-env.sh
export HADOOP_COMMON_HOME=/opt/yjx/hadoop-3.1.2
export HADOOP_MAPRED_HOME=/opt/yjx/hadoop-3.1.2
export HIVE_HOME=/opt/yjx/apache-hive-3.1.2-bin
export HBASE_HOME=/opt/yjx/hbase-2.2.5
export ZOOKEEPER_HOME=/opt/yjx/zookeeper-3.4.5
export ZOOCFGDIR=/opt/yjx/zookeeper-3.4.5/conf
修改configure-sqoop
[root@node01 ~]# vim /opt/yjx/sqoop-1.4.7/bin/configure-sqoop
删除掉HCatalog,Accumulo检查(切记从后向前删除)
179-196 18dd
134-143 10dd
82-100 19dd
验证
[root@node01 ~]# sqoop version[root@node01 ~]# sqoop version
[root@node01 ~]# sqoop list-databases -connect jdbc:mysql://node01:3306/ -username root -password 123456
Sqoop使用
- 官网:http://sqoop.apache.org/docs/1.4.7/SqoopUserGuide.html
导入数据
在Sqoop中,“导入”概念指:从非大数据集群(RDBMS)向大数据集群(HDFS,HIVE,HBASE)中传 输数据,叫做:导入,即使用import关键字。
-
从RDBMS到HDFS全部导入
sqoop import \ --connect jdbc:mysql://node01:3306/scott \ --username root \ --password 123456 \ --table emp \ --target-dir /sqoop/empall \ --delete-target-dir \ --num-mappers 1 \ --fields-terminated-by "\t";
-
从RDBMS到HDFS查询导入
sqoop import \ --connect jdbc:mysql://node01:3306/scott \ --username root \ --password 123456 \ --target-dir /sqoop/empquery \ --delete-target-dir \ --num-mappers 1 \ --fields-terminated-by "\t" \ --query 'select empno,ename from emp where hiredate <= 1987-07-13 and $CONDITIONS;' 提示:must contain '$CONDITIONS' in WHERE clause. 如果query后使用的是双引号,则$CONDITIONS前必须加转移符,防止shell识别为自己的变量。
-
从RDBMS到HDFS导入指定列
sqoop import \ --connect jdbc:mysql://node01:3306/scott \ --username root \ --password 123456 \ --target-dir /sqoop/empcolumn \ --delete-target-dir \ --num-mappers 1 \ --fields-terminated-by "\t" \ --columns "empno,ename" \ --table emp;提示:columns中如果涉及到多列,用逗号分隔,分隔时不要添加空格
-
从RDBMS到HDFS关键字导入
sqoop import \ --connect jdbc:mysql://node01:3306/scott \ --username root \ --password 123456 \ --target-dir /sqoop/empkeyword \ --delete-target-dir \--num-mappers 1 \ --fields-terminated-by "\t" \ --table emp \ --where "deptno=30"
-
RDBMS到Hive
sqoop import \ --connect jdbc:mysql://node01:3306/scott \ --username root \ --password 123456 \ --table emp \ --num-mappers 1 \ --hive-import \ --fields-terminated-by "," \ --hive-overwrite \ --hive-table hive_emp; 提示:该过程分为两步第一步将数据导入到HDFS ,默认路径为 /user/root 第二步将导入到HDFS的数据迁移到Hive仓库
-
RDBMS到Hbase
sqoop import \ --connect jdbc:mysql://node01:3306/scott \ --username root \--password 123456 \ --table emp \--columns "empno,ename,deptno" \ --column-family "info" \ --hbase-create-table \ --hbase-row-key "empno" \ --hbase-table "emp" \ --num-mappers 1 \ --split-by empno;
提示:sqoop1.4.7只支持HBase1.0.1之前的版本的自动创建HBase表的功能
- 解决方案:手动创建HBase表
hbase> create 'emp','info'
- 在HBase中scan这张表
hbase> scan ‘emp’
导出数据
在Sqoop中,“导出”概念指:从大数据集群(HDFS,HIVE,HBASE)向非大数据集群(RDBMS)中传 输数据,叫做:导出,即使用export关键字。
- HIVE/HDFS到RDBMS(提示:Mysql中如果表不存在,不会自动创建)
sqoop export \
--connect jdbc:mysql://node01:3306/scott \
--username root \--password 123456 \
--table emp \
--num-mappers 1 \
--export-dir /sqoop/empall \
--input-fields-terminated-by "\t"
脚本打包
使用opt格式的文件打包sqoop命令,然后执行<