Sqoop介绍
Sqoop的作用
Sqoop在Hadoop生态圈中的位置
Sqoop 的架构非常简单,其整合了 Hive、HBase 等,通过 map 任务来传输数据,map 负责数据的加载、转换,然后存储到 HDFS、HBase 或者 Hive 中。
对于不同的角度来看待Sqoop
从工作模式角度看待
从 Map Reduce 角度看待
从安全角度看待
由前面的 Sqoop 框架,可以知道 Sqoop 是通过 MapReduce 作业进行导入操作的。在导入过程中,Sqoop 从表中读取数据行,将其写入 HDFS。反之就是导出过程
Sqoop的导入过程
是指从关系型数据库(RDBMS)向Hadoop集群(HDFS,Hive,HBase)中导入数据,使用import关键字
Sqoop的导出过程
是指从Hadoop集群(HDFS,Hive,HBase)向关系型数据库(RDBMS)中导入数据,使用export关键字
[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
[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
[root@node01 ~]# vim /opt/yjx/sqoop-1.4.7/bin/configure-sqoop
删除掉HCatalog,Accumulo检查(切记从后向前删除)
验证
官网:http://sqoop.apache.org/docs/1.4.7/SqoopUserGuide.html
数据的导入导出都是以大数据集群为中心的
在Sqoop中,“导入”概念指:从非大数据集群(RDBMS)向大数据集群(HDFS,HIVE,HBASE)中传输数据(以大数据集群为中心),叫做:导入,即使用import关键字。
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";
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识别为自己的变量
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中如果涉及到多列,用逗号分隔,分隔时不要添加空格
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"
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仓库(原来的导入到HDFS的数据会消失,默认是内部表)
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关键字。
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"
提示:Mysql中如果表不存在,不会自动创建
使用opt格式的文件打包sqoop命令,然后执行
创建一个.opt文件
mkdir opt
touch opt/sqoop.opt
编写sqoop脚本,脚本里面可以写一些导入导出数据的命令,
vim opt/sqoop1.opt
export
--connect
jdbc:mysql://node01:3306/scott
--username
root
--password
123456
--table
emp
--num-mappers
1
--export-dir
/sqoopdb/emp
--input-fields-terminated-by
"\t"
执行该脚本
bin/sqoop --options-file opt/sqoop1.opt
import 将数据导入到集群
export 将集群数据导出
codegen 获取数据库中某张表数据生成Java并打包Jar
create-hive-table 创建Hive表
eval 查看SQL执行结果
import-all-tables 导入某个数据库下所有表到HDFS中
job 用来生成一个sqoop的任务,生成后,该任务并不执行,除非使用命令执行该任务。
list-databases 列出所有数据库名
list-tables 列出某个数据库下所有表
merge 将HDFS中不同目录下面的数据合在一起,并存放在指定的目录中
metastore 记录sqoop job的元数据信息,如果不启动metastore实例,则默认的元数据存储目录为:~/.sqoop,如果要更改存储目录,可以在配置文件sqoop-site.xml中进行更改。
help 打印sqoop帮助信息
version 打印sqoop版本信息
Github主页地址:https://github.com/alibaba/DataX
DataX 是一个异构数据源离线同步工具,致力于实现包括关系型数据库(MySQL、Oracle等)、HDFS、Hive、ODPS、HBase、FTP等各种异构数据源之间稳定高效的数据同步功能
为了解决异构数据源同步问题,DataX将复杂的网状的同步链路变成了星型数据链路,DataX作为中间传输载体负责连接各种数据源。
当需要接入一个新的数据源的时候,只需要将此数据源对接到DataX,便能跟已有的数据源做到无缝数据同步。
数据收集系统(包括流式,文件,hdfs)
Sqoop是一个用于在Hadoop和关系型数据库之间流转数据的一个工具
数据导入导出速度不同
支持的数据源同步不同
Sqoop只可以在关系型数据库和Hadoop组件(HDFS,Hive,HBase)之间进行数据转移,而在Hadoop组价之间,比如Hive和Hbase之间就无法使用Sqoop相互导入导出数据
同时在关系型数据库之间,比如MySQL和Oracle之间也无法通过Sqoop导入导出数据,
与之相反,DataX能够分别实现数据库和Hadoop组件之间、关系型数据库之间、Hadoop组件之间的数据迁移
对于Hadoop生态的支持不同
Sqoop是专门为Hadoop而生,对Hadoop支持度好,而DataX可能会出现不支持高版本Hadoop的现象
Sqoop只支持官方提供的指定几种关系型数据库和Hadoop组件之间的数据转换,而在DataX中,用户只需根据自己需求修改文件,生成相应的rpm包,自行安装之后就可以使用自己定制的插件
经过几年积累,DataX目前已经有了比较全面的插件体系,主流的RDBMS数据库、NOSQL、大数据计算系统都已经接入。DataX目前支持数据如下
类型 | 数据源 | Reader(读) | Writer(写) | 文档 |
---|---|---|---|---|
RDBMS 关系型数据库 | MySQL | √ | √ | 读 、写 |
Oracle | √ | √ | 读 、写 | |
OceanBase | √ | √ | 读 、写 | |
SQLServer | √ | √ | 读 、写 | |
PostgreSQL | √ | √ | 读 、写 | |
DRDS | √ | √ | 读 、写 | |
通用RDBMS(支持所有关系型数据库) | √ | √ | 读 、写 | |
阿里云数仓数据存储 | ODPS | √ | √ | 读 、写 |
ADS | √ | 写 | ||
OSS | √ | √ | 读 、写 | |
OCS | √ | 写 | ||
NoSQL数据存储 | OTS | √ | √ | 读 、写 |
Hbase0.94 | √ | √ | 读 、写 | |
Hbase1.1 | √ | √ | 读 、写 | |
Phoenix4.x | √ | √ | 读 、写 | |
Phoenix5.x | √ | √ | 读 、写 | |
MongoDB | √ | √ | 读 、写 | |
Hive | √ | √ | 读 、写 | |
Cassandra | √ | √ | 读 、写 | |
无结构化数据存储 | TxtFile | √ | √ | 读 、写 |
FTP | √ | √ | 读 、写 | |
HDFS | √ | √ | 读 、写 | |
Elasticsearch | √ | 写 | ||
时间序列数据库 | OpenTSDB | √ | 读 | |
TSDB | √ | √ | 读 、写 | |
TDengine | √ | √ | 读 、写 |
DataX Framework提供了简单的接口与插件交互,提供简单的插件接入机制,只需要任意加上一种插件,就能无缝DataX3.0核心架构
DataX 3.0 开源版本支持单机多线程模式完成同步作业运行,下面按一个DataX作业生命周期的时序图,从整体架构设计非常简要说明DataX各个模块相互关系
核心模块介绍
DataX调度
DataX调度流程
举例来说,用户提交了一个DataX作业,并且配置了20个并发,目的是将一个200张分表的mysql数据同步到odps里面。 DataX的调度决策思路是
和sqoop一样,从结构化数据库中抽取数据,最后需要根据数据库表和数据总量,每日数据变化做抽取策略选择
小表——全量抽取
大表——增量抽取
安装Python依赖:
下载Python3
[root@node01 ~]# yum -y install wget
[root@node01 ~]# wget https://www.python.org/ftp/python/3.7.1/Python-3.7.1.tgz
安装Python3
[root@node01 ~]# mkdir -p /usr/local/python3
[root@node01 ~]# tar -zxvf Python-3.7.1.tgz
[root@node01 ~]# rm -rf Python-3.7.1.tgz
[root@node01 ~]# cd Python-3.7.1
[root@node01 Python-3.7.1]# ./configure --prefix=/usr/local/python3 --enable-optimizations --with-ssl
[root@node01 Python-3.7.1]# make (双核16G内存 过程大概持续15分钟,害怕慢上一步可以去掉 --enable-optimizations --with-ssl )
[root@node01 Python-3.7.1]# make install
配置Python3
[root@node01 ~]# /usr/local/python3/bin/python3.7
[root@node01 ~]# ln -s /usr/local/python3/bin/python3 /usr/bin/python3
[root@node01 ~]# ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3
添加环境变量
[root@node01 ~]# vim /etc/profile
export PYTHON_HOME=/usr/local/python3
export PATH=$PATH:$PYTHON_HOME/bin
[root@node01 ~]# source /etc/profile
检查效果
[root@node01 ~]# python3 -V
[root@node01 ~]# pip3 -V
安装dataX有两种方式,一种是tar.gz直接安装,一种是用源码自行编译安装
方法一、直接下载DataX工具包:DataX下载地址
方法二、下载DataX源码,自己编译:DataX源码
下载DataX源码:
$ git clone [email protected]:alibaba/DataX.git
通过maven打包:通过maven打包:
$ cd {DataX_source_code_home}
$ mvn -U clean package assembly:assembly -Dmaven.test.skip=true
打包成功,日志显示如下:
[INFO] BUILD SUCCESS
[INFO] -----------------------------------------------------------------
[INFO] Total time: 08:12 min
[INFO] Finished at: 2015-12-13T16:26:48+08:00
[INFO] Final Memory: 133M/960M
[INFO] -----------------------------------------------------------------
打包成功后的DataX包位于 {DataX_source_code_home}/target/datax/datax/ ,结构如下
$ cd {DataX_source_code_home}
$ ls ./target/datax/datax/
bin conf job lib log log_perf plugin script tmp
DataX Web是在DataX之上开发的分布式数据同步工具,提供简单易用的 操作界面,降低用户使用DataX的学习成本,缩短任务配置时间,避免配置过程中出错。用户可通过页面选择数据源即可创建数据同步任务,RDBMS数据源可批量创建数据同步任务,支持实时查看数据同步进度及日志并提供终止同步功能,集成并二次开发xxl-job可根据时间、自增主键增量同步数据。
任务"执行器"支持集群部署,支持执行器多节点路由策略选择,支持超时控制、失败重试、失败告警、
任务依赖,执行器CPU.内存.负载的监控等等。后续还将提供更多的数据源支持、数据转换UDF、表结构同步、数据同步血缘等更为复杂的业务场景。
分为两种部署方式:
1)使用tar.gz包直接在linux上部署
https://github.com/WeiYe-Jing/datax-web/blob/master/doc/datax-web/datax-web-deploy.md
2)使用源码在idea中编译使用
https://github.com/WeiYe-Jing/datax-web/blob/master/userGuid.md
使用tar.gz直接部署在linux服务器上
环境准备
基础软件安装
DataX Web安装包准备
获取jar包有两种方式,一种是自己从git上拉取下来之后进行打包,一种是直接使用官方提供好的
tar.gz包。两 种选择其一就可,这边直接使用官方打包好的版本包。详情请看DataX_Web官网.
开始部署
下载上传解压
[root@node01 ~]# tar -zxvf datax-web-2.1.2.tar.gz
[root@node01 ~]# rm -rf datax-web-2.1.2.tar.gz
[root@node01 ~]# mv datax-web-2.1.2 /opt/yjx/
执行一键安装脚本
[root@node01 ~]# cd /opt/yjx/datax-web-2.1.2/bin
[root@node01 ~]# ./install.sh --force
数据库初始化
如果你的服务上安装有mysql命令,在执行安装脚本的过程中则会出现以下提醒:
按照提示输入数据库地址,端口号,用户名,密码以及数据库名称,大部分情况下即可快速完成初始化。 如果服务上并没有安装mysql命令,则可以取用目录下/bin/db/datax-web.sql脚本去手动执行,完成后修改相关配置文件
vim /opt/yjx/datax-web-2.1.2/modules/datax-admin/conf/bootstrap.properties
#Database
DB_HOST=127.0.0.1
DB_PORT=3306
DB_USERNAME=root
DB_PASSWORD=123456
DB_DATABASE=dataxwe
按照具体情况配置对应的值即可。
修改application.yml文件
[root@node01 ~]# vim /opt/yjx/datax-web-2.1.2/modules/datax-executor/conf/application.yml
#修改datax.py地址
#pypath: F:\tools\datax\bin\datax.py
pypath: /opt/yjx/datax/bin/datax.py
安装完成之后,启动服务
查看服务(注意!注意!)
运行
部署完成后,在浏览器中输入 http://node01:9527/index.html 就可以访问对应的主界面输入用户名 admin 密码 123456 就可以直接访问系统
Azkanban介绍
Azkaban是由Linkedin开源的一个批量工作流任务调度器。用于在一个工作流内以一个特定的顺序运行一组工作和流程。Azkaban定义了一种KV文件格式来建立任务之间的依赖关系,并提供一个易于使用的web用户界面维护和跟踪你的工作流
Azkaban是在LinkedIn(领英)上创建的用于运行Hadoop作业的批处理工作流作业调度程序。
Azkaban通过工作依赖性解决订购问题,并提供易于使用的Web用户界面来维护和跟踪您的工作流程
Azkanban出现的原因