Sqoop
10.4 Sqoop的简介
10.4.1 Sqoop产生背景
- 对于工作中经常遇到的问题的提出
- 如何将关系型数据库中某张表的数据抽取到 Hadoop(HDFS/Hive/HBase)上;
- 如何将 Hadoop 上的数据导出到关系型数据库中
- 对于问题的传统的解决
- 通常情况下是通过开发 Map Reduce 来实现
- 导入:Map Reduce 输入为 DBInput Format 类型,输出为 Text Output Format。
- 导出:Map Reduce 输入为 Text Input Format 类型,输出为 DBOutput Format。
- Sqoop的产生
- 使用 Map Reduce 处理以上两个场景时存在如下问题:每次都需要编写 Map Reduce 程序,非常麻烦。在没有出现 Sqoop 之前,实际生产中有很多类似的需求,需要通过编写 Map Reduce 去实现,然后形成一个工具,后来慢慢就将该工具代码整理出一个框架并逐步完善,最终就有了 Sqoop 的诞生
10.4.2 Sqoop概述
-
Sqoop介绍
- 基于 Hadoop 之上的数据传输工具 Sqoop 是 Apache 的顶级项目,主要用于在 Hadoop 和关系数据库、数据仓库、No SQL 系统间传递数据
-
Sqoop的作用
- 通过 Sqoop 我们可以方便地将数据从关系数据库导入到HDFS、HBase、Hive
- 或者将数据从 HDFS 导出到关系数据库
- Sqoop 是连接传统关系型数据库和 Hadoop 的桥梁,它不需要开发人员编写相应的 Map Reduce 代码,只需要编写简单的配置脚本即可,大大提升了开发效率
Sqoop在Hadoop生态圈中的位置
10.4.3 Sqoop架构
Sqoop 的架构非常简单,其整合了 Hive、HBase 等,通过 map 任务来传输数据,map 负责数据的加载、转换,然后存储到 HDFS、HBase 或者 Hive 中。
对于不同的角度来看待Sqoop
-
从工作模式角度看待
- Sqoop 是基于客户端模式的,用户使用客户端模式,只需要在一台机器上即可完成。
-
从 Map Reduce 角度看待
- Sqoop 只提交一个 map 作业,数据的传输和转换都是使用 Mapper来完成的,而且该 Map Reduce 作业仅有 Mapper 并不需要 Reducer,在执行 Sqoop 时可以通过YARN 监控页面查看到。
-
从安全角度看待
- 需要在执行时将用户名或者密码显性指定,也可以在配置文件中配置,总的来说,安全性不是很高。
10.4.4 Sqoop的导入导出过程
由前面的 Sqoop 框架,可以知道 Sqoop 是通过 MapReduce 作业进行导入操作的。在导入过程中,Sqoop 从表中读取数据行,将其写入 HDFS。反之就是导出过程
-
Sqoop的导入过程
是指从关系型数据库(RDBMS)向Hadoop集群(HDFS,Hive,HBase)中导入数据,使用import关键字
-
Sqoop的导出过程
是指从Hadoop集群(HDFS,Hive,HBase)向关系型数据库(RDBMS)中导入数据,使用export关键字
10.5 Sqoop安装
10.5.1 下载地址(官网已不再维护)
- http://archive.apache.org/dist/sqoop/1.4.7/
10.5.2 上传并解压
[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
10.5.3 配置环境变量
-
[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
10.5.4 添加mysql连接包
- [root@node01 ~]# cp ~/mysql-connector-java-5.1.32-bin.jar /opt/yjx/sqoop-1.4.7/lib/
10.5.5 添加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/
10.5.6 修改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
10.5.7 修改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
10.6 Sqoop使用
官网:http://sqoop.apache.org/docs/1.4.7/SqoopUserGuide.html
数据的导入导出都是以大数据集群为中心的
10.6.1 导入数据
在Sqoop中,“导入”概念指:从非大数据集群(RDBMS)向大数据集群(HDFS,HIVE,HBASE)中传输数据(以大数据集群为中心),叫做:导入,即使用import关键字。
1. 从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";
2. 从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识别为自己的变量
3. 从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中如果涉及到多列,用逗号分隔,分隔时不要添加空格
4. 从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"
5. 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仓库(原来的导入到HDFS的数据会消失,默认是内部表)
6. 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'
10.6.2 导出数据
在Sqoop中,“导出”概念指:从大数据集群(HDFS,HIVE,HBASE)向非大数据集群(RDBMS)中传输数据,叫做:导出,即使用export关键字。
1. HIVE/HDFS到RDBMS
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中如果表不存在,不会自动创建
10.6.3 脚本打包
使用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
10.6.4 常用参数
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版本信息
3️⃣ DataX
10.7 DataX
Github主页地址:https://github.com/alibaba/DataX
10.7.1 DataX3.0概览
DataX 是一个异构数据源离线同步工具,致力于实现包括关系型数据库(MySQL、Oracle等)、HDFS、Hive、ODPS、HBase、FTP等各种异构数据源之间稳定高效的数据同步功能
1. 设计理念
为了解决异构数据源同步问题,DataX将复杂的网状的同步链路变成了星型数据链路,DataX作为中间传输载体负责连接各种数据源。
当需要接入一个新的数据源的时候,只需要将此数据源对接到DataX,便能跟已有的数据源做到无缝数据同步。
2. 产生背景
- 在大数据处理业务框架中,需要处理的数据一般是2个来源(行为日志和业务数据),有些公司如
果有python部门,就需要加上python数据这一个。 - python数据因为各个公司以及各个页面和接口中数据差异较大,一般需要针对公司和特定业务编写程序进行解析,然后存入HDFS或者其他分布式文件系统中。一般都是编写Spark程序(可以分布式进行处理,效率对比java程序要更高。当然,也可以使用java编写mapreduce程序)。
- 行为日志数据,此前已经说过,一般都是使用flume等分布式日志采集框架进行采集,因为这些框
架比较成熟,可以直接进行一些预处理,然后存入HDFS或者其他地方。 - 业务数据一般都是存放在关系型数据库如mysql或者oracle,或者windows server中。没错,后2
个都是需要花钱的,特别是oracle,一般公司用不起。这时候将数据从关系型数据库导出到大数据文件存放系统中,或者反过来,将数据从大数据文件存放系统中导出到关系型数据库中,目前使用datax做数据导入导出框架也逐渐增加。 - 不管是流量域数据(行为日志数据),还是业务域数据(存储在关系型数据库中业务数据),都是按照经典数仓分层进行处理,存储,以便于计算和分析,最后做展示。
- 经典数仓分层,一般是DIM维度层,再之上就是ODS贴源层,然后是DW层(一般划分为DWD数据明细层,DWS数据服务层),然后是ADS应用层。而不管是流量域还是业务域的数据,都是需要按照这个分层进行数据预处理,提取,处理,存储到这些层级的。
10.7.2 DataX 3.0六大核心优势
1. 可靠的数据质量监控
2. 丰富的数据转换功能
3. 精准的速度控制
4. 强劲的同步性能
5. 健壮的容错机制
6. 极简的使用体验
10.7.3 Datax,Flume,Sqoop工具对比 ⭐️
1. DATaX特点
- 异构数据库和文件系统之间的数据交换
- 简单的接口
- 采用Framework + plugin 架构构建, Framework处理了缓冲、控流、上下文加载等高速数据交换的大部分技术问题,提供了简单的接口和插件交互
- 数据传输过程中在单进程内完成,全内存操作,不读写磁盘,也没有IPC
- 开放式的框架,开发者可以在极短的时间开发一个新插件以快速支持新的数据库/文件系统
2. Flume
数据收集系统(包括流式,文件,hdfs)
3. Sqoop 特点
Sqoop是一个用于在Hadoop和关系型数据库之间流转数据的一个工具
- 数据导入导出
- 可以将关系型数据库中的数据导入hdfs、hive或者hbase等hadoop组件中,也可将hadoop组件中的数据导入到关系型数据库中
- 充分利用分布式MapReduce计算架构
- Sqoop在导入导出数据时,充分采用了MapReduce计算框架,根据输入条件生成一个MapReduce作业,在Hadoop集群中运行,采用MapReduce框架同时在多个节点进行导入或者导出操作,
- 利用分布式的MapReduce框架,速度比单节点运行多个并行导入导出效率高,同时提供了良好的并发性和容错性
- Sqoop在导入导出数据时,充分采用了MapReduce计算框架,根据输入条件生成一个MapReduce作业,在Hadoop集群中运行,采用MapReduce框架同时在多个节点进行导入或者导出操作,
- 支持insert、update模式,可以选择参数,若内存存在就更新,若不存在就插入
- 对国外的主流关系型数据库支持性更好
4. Sqoop和DataX之间的比较
-
数据导入导出速度不同
- Sqoop采用MapReduce计算框架进行导入和导出,而DataX仅仅运行DataX的单台机器上进行数据的抽取和加载,速度比Sqoop慢很多
-
支持的数据源同步不同
-
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包,自行安装之后就可以使用自己定制的插件
-
5. 总结
- Sqoop DataX等一般用于数据库和大数据文件存储框架之间的数据导入和导出(导入和导出是以大数据存储框架角度来说的)
- Sqoop和DataX的区别
- Sqoop采用MapReduce计算框架进行导入和导出,而DataX仅仅运行DataX的单台机器上进行数据的抽取和加载,速度比Sqoop慢很多
- Sqoop只可以在关系型数据库和Hadoop组件(HDFS,Hive,HBase)之间进行数据转移,而在Hadoop组价之间,比如Hive和Hbase之间就无法使用Sqoop相互导入导出数据
- 同时在关系型数据库之间,比如MySQL和Oracle之间也无法通过Sqoop导入导出数据,
- 与之相反,DataX能够分别实现数据库和Hadoop组件之间、关系型数据库之间、Hadoop组件之间的数据迁移
- Sqoop是专门为Hadoop而生,对Hadoop支持度好,而DataX可能会出现不支持高版本Hadoop的现象
- Sqoop只支持官方提供的指定几种关系型数据库和Hadoop组件之间的数据转换,而在DataX中,用户只需根据自己需求修改文件,生成相应的rpm包,自行安装之后就可以使用自己定制的插件
- flume是日志采集框架,用于日志文件等半结构化数据和大数据文件文件存储框架之间的数据导入和导出
10.7.4 DataX3.0插件体系
经过几年积累,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核心架构
10.7.5 DataX3.0 框架设计
- 对DataX框架的介绍
- DataX本身作为离线数据同步框架,采用Framework+plugin架构构建,将数据源读取和写入抽象为Reader/Writer插件,纳入到整个同步框架中
- Reader/Writer/Framework的介绍
- Reader
- Reader作为数据采集模块,负责采集数据源的数据,将数据发送给Framework
- Writer
- Writer作为数据写入模块,负责不断将Framework取数据,并将数据写入到目的端
- Framework(channel)
- Framework用于连接Reader和Writer,作为两者的数据传输通道,并处理缓冲、流控、并发和数据转换等核心技术问题
- Reader
DataX 3.0 开源版本支持单机多线程模式完成同步作业运行,下面按一个DataX作业生命周期的时序图,从整体架构设计非常简要说明DataX各个模块相互关系
-
核心模块介绍
- 数据同步作业Job模块
- DataX完成单个数据同步的作业,称之为Job
- 当DataX接收到一个Job后,将启动一个进程来完成整个作业同步过程
- DataX Job模块是单个作业的中枢管理节点,承担了数据清理、子任务切分(将单一作业计算转化为多个子Task)、TaskGroup管理等功能
- Task模块
- DataXJob启动后,会根据不同的源端切分策略,将Job切分成多个小的Task(子任务),以便于并发执行,
- Task是DataX作业的最小单元,每一个Task都会负责一部分数据的同步工作
- Scheduler模块
- 切分成多个Task后,DataX Job会调用Scheduler模块,根据配置的并发数据量,将拆分成的Task重新组合,组装成TaskGroup(任务组)
- 每一个TaskGroup负责以一定的并发运行完毕分配好的所有Task,默认单个任务组的并发数量为5
- 数据同步作业Job模块
-
DataX调度
- 每个Task都由TaskGroup负责启动,Task启动后,会固定启动Reader–>Channel–>Writer的线程来完成任务同步工作
- DataX作业运行起来之后,Job监控并等待多个TaskGroup模块任务完成,等待所有的TaskGroup任务完成后Job成功退出,否则,异常退出,进程退出值非0
-
DataX调度流程
举例来说,用户提交了一个DataX作业,并且配置了20个并发,目的是将一个200张分表的mysql数据同步到odps里面。 DataX的调度决策思路是
- DataXJob根据分库分表切分成了200个Task
- 根据20个并发,DataX计算共需要分配4个TaskGroup
- 4个TaskGroup平分切分好的200个Task,每一个TaskGroup负责以5个并发共计运行50个Task
10.7.6 数据抽取策略
和sqoop一样,从结构化数据库中抽取数据,最后需要根据数据库表和数据总量,每日数据变化做抽取策略选择
- 如果是实体表,如果数据量比较小,一般每天或者一周,一个月抽取一份全量的表.
如果是实体大表,一般每天抽取一份增量数据,然后按照分区表进行存储.这类数据都是先放到
ODS层.如果有需要,在DWD层每天做所有数据的滚动聚合,这时候DWD就有一份完整总数居. - 事实表,如订单,购物车等表.一般都是每天抽取一份增量数据,全量导入没必要,增量导入,然后每
天的数据以分区形式存储.也是存放到ODS贴源层.
如果需要做滚动合并,一般是在DWD层做每日数据滚动合并,这样DWD就会有一份完整的总数
居大表. - 维度表,和实体表也是一样,需要区分大表还是小表,一般10万条或者100万条以下算小表,具体
标准每个公司差异可能很大.毕竟对于大数据处理来说,百万条数据才到入门数据门槛.
小表——全量抽取
大表——增量抽取
10.7.7 DataX安装
- 系统要求
- Linux
- JDK(1.8以上,推荐1.8)
- Python(推荐Python2.6以上)
- Apache Maven 3.x (Compile DataX)
1. 安装Python3
-
安装Python依赖:
- [root@node01 ~]# yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel gcc make libffi-devel -y
-
下载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
2. 安装DataX
安装dataX有两种方式,一种是tar.gz直接安装,一种是用源码自行编译安装
-
方法一、直接下载DataX工具包:DataX下载地址
- 下载上传解压
[root@node01 ~]# tar -zxvf datax.tar.gz
[root@node01 ~]# rm -rf datax.tar.gz
[root@node01 ~]# mv datax /opt/yjx - 自检脚本:
[root@node01 ~]# python /opt/yjx/datax/bin/datax.py /opt/yjx/datax/job/job.json
- 下载上传解压
-
方法二、下载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
-
10.8 DataX-Web
10.8.1 DataX-Web的介绍
DataX Web是在DataX之上开发的分布式数据同步工具,提供简单易用的 操作界面,降低用户使用DataX的学习成本,缩短任务配置时间,避免配置过程中出错。用户可通过页面选择数据源即可创建数据同步任务,RDBMS数据源可批量创建数据同步任务,支持实时查看数据同步进度及日志并提供终止同步功能,集成并二次开发xxl-job可根据时间、自增主键增量同步数据。
任务"执行器"支持集群部署,支持执行器多节点路由策略选择,支持超时控制、失败重试、失败告警、
任务依赖,执行器CPU.内存.负载的监控等等。后续还将提供更多的数据源支持、数据转换UDF、表结构同步、数据同步血缘等更为复杂的业务场景。
10.8.2 架构
10.8.3 系统配置
- Language: Java 8(jdk版本建议1.8.201以上)
- Python2.7(支持Python3需要修改替换datax/bin下面的三个python文件,替换文件在doc/datax-
- web/datax-python3下)
- Environment: MacOS, Windows,Linux
- Database: Mysql5.7
10.8.4 安装
分为两种部署方式:
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服务器上
1.第一种方法
环境准备
-
基础软件安装
- MySQL (5.5+) 必选,对应客户端可以选装, Linux服务上若安装mysql的客户端可以通过部署脚本快速初始化数据库
- JDK (1.8.0_xxx) 必选
- DataX 必选
- Python (2.x) (支持Python3需要修改替换datax/bin下面的三个python文件,替换文件在doc/datax-web/datax-python3下) 必选
-
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
-
安装完成之后,启动服务
- 一键启动所有服务(注意要在datax的bin目录下完成)
./bin/start-all.sh - 一键取消所有服务
./bin/stop-all.sh
- 一键启动所有服务(注意要在datax的bin目录下完成)
-
查看服务(注意!注意!)
- 在Linux环境下使用JPS命令,查看是否出现DataXAdminApplication和
DataXExecutorApplication进程,如果存在这表示项目运行成功 - 如果项目启动失败,请检查启动日志:modules/datax-admin/bin/console.out或者
modules/datax-executor/bin/console.out - Tips: 脚本使用的都是bash指令集,如若使用sh调用脚本,可能会有未知的错误
- 在Linux环境下使用JPS命令,查看是否出现DataXAdminApplication和
-
运行
部署完成后,在浏览器中输入 http://node01:9527/index.html 就可以访问对应的主界面输入用户名 admin 密码 123456 就可以直接访问系统
4️⃣ Azkanban
10.9 Azkanban
10.9.1 Azkaban介绍
-
Azkanban介绍
-
Azkaban是由Linkedin开源的一个批量工作流任务调度器。用于在一个工作流内以一个特定的顺序运行一组工作和流程。Azkaban定义了一种KV文件格式来建立任务之间的依赖关系,并提供一个易于使用的web用户界面维护和跟踪你的工作流
-
Azkaban是在LinkedIn(领英)上创建的用于运行Hadoop作业的批处理工作流作业调度程序。
-
Azkaban通过工作依赖性解决订购问题,并提供易于使用的Web用户界面来维护和跟踪您的工作流程
-
-
Azkanban出现的原因
- 我们都知道大数据的计算、分析和处理,一般由多个任务单元组成(Hive、Sparksql、Spark、Shell等),每个任务单元完成特定的数据处理逻辑
- 多个任务单元之间往往有着强依赖关系,上游任务执行并成功,下游任务才可以执行。比如上游任务结束后拿到 A 结果,下游任务需结合 A 结果才能产出 B 结果,因此下游任务的开始一定是在上游任务成功运行拿到结果之后才可以开始。
- 而为了保证数据处理结果的准确性,就必须要求这些任务按照上下游依赖关系有序、高效的执行。一个较为基础的处理方式是,预估出每个任务处理所需时间,根据先后顺序,计算出每个任务的执行的起止时间,通过定时跑任务的方式,让整个系统保持稳定的运行
- 一个完整的数据分析任务最少执行一次,在数据量较少,依赖关系较为简单的低频数据处理过程中,这种调度方式完全可以满足需求。然而在企业级场景中,更多的是需要每天执行,如果任务数量较多,在任务启动的时间计算上就将耗费大量时间,另外如果出现上游任务执行时长超出原定预计时间或者运行异常的问题,上述的处理方式将完全无法应对,也会对人力物力造成重复损耗,因此,对于企业数据开发过程来说,一个完整且高效的工作流调度系统将起到至关重要的作用。
10.9.2 Azkanban特征
- 分布式多执行器
- MySQL重试
- 友好的用户界面
- 有条件的工作流程
- 数据触发
- 高安全性
- 支持插件扩展,从Web UI到作业执行
- 完整的作者管理系统
10.9.3 Azkanban架构
- mysql服务器:
- 存储元数据,如项目名称、项目描述、项目权限、任务状态、SLA规则等
- AzkabanWebServer:
- 对外提供web服务,使用户可以通过web页面管理。职责包括项目管理、权限授权、任务调度、监控executor。
- AzkabanExecutorServer:
- 负责具体的工作流的提交、执行