1、ETL介绍

ETL(Extract, Transform, Load)工具是用于数据集成和处理的关键软件,它们能够从不同的数据源提取数据,进行必要的转换,然后将数据加载到目标数据仓库或其他存储系统中。

2、 Kettle

2.1 Kettle介绍

Kettle也叫PDI(Pentaho Data Integration),广泛用于数据提取、转换和加载(ETL)任务,它有以下特点:

  • 友好的图形用户界面GUI
  • 支持多种数据源之间的数据接入
  • 丰富的数据转换组件
  • 提供简单的作业调度功能

2.2 Kettle基本使用

版本:pdi-ce-8.2.0.0-11
场景:将Mysql表数据同步到Hdfs文件中,数据量为50W

  • 先从左侧栏"输入"中拉出"表输入"节点,编辑选择Mysql数据库,如下图
    image.png
  • 选择"获取SQL查询语句",自动生成查询语句
  • 点击预览可以查看实际数据
  • 从左侧栏"Big Data"中拉出"Hadoop File Output"节点,编辑选择hdfs,如下图
    image.png
  • 将节点连接
  • 选择Hadoop File Output节点的"字段"tab页,点击"获取字段",可获取到字段列表,点击"最小宽度",输出结果中会去掉每个字段多余的左右空格
    image.png
  • 点击"运行转换",就会开始进行数据的接入,可以看到50W条数据写入hdfs,过程花费了10秒,如下图
    image.png

3、Sqoop

3.1 Sqoop介绍

Sqoop 是一个用于在 Hadoop 和关系型数据库之间高效地传输数据的工具。它的名称来源于 "SQL to Hadoop" 的缩写,旨在简化从传统数据库到大数据平台(如 Apache Hadoop)的数据转移过程

3.2 Sqoop基本使用

版本:Sqoop-1.4.7
场景:将Mysql表数据同步到Hdfs文件中,数据量为50W

在服务器上,执行命令

sqoop import  \
    --connect jdbc:mysql://192.168.11.1:3306/test  \
    --username root \
    --password 123456 \
    --table faker_user \
    --where "1=1" \
    --target-dir /sqoop/ori_mysql3 \
    --delete-target-dir \
    --fields-terminated-by "\t"  \
    --num-mappers 5

执行日志如下,由于数据量并不是非常大,无法体现分布式计算的优势,且用的是MapReduce计算框架,所以总耗时81秒
image.png

这里我设置的并行度是5,结果数据如下
image.png

4、DataX

4.1 DataX介绍

DataX 是一个由阿里开源的数据同步工具,也是阿里Dataworks数据集成的开源版本,主要用于在不同数据源之间高效地进行数据传输和转换,旨在解决大规模数据迁移和数据同步的需求

4.2 DataX基本使用

版本:Sqoop-1.4.7
场景:将Mysql表数据同步到Hdfs文件中,数据量为50W

编写json配置文件,如下:

{
    "job": {
        "setting": {
            "speed": {
                "channel": 5
            }
        },
        "content": [
            {
                "reader": {
                    "name": "mysqlreader",
                    "parameter": {
                        "username": "root",
                        "password": "123456",
                        "splitPk": "id",
                        "column": ["id","name","age","gender","email","address","text","url","phone_number","country","city","job","ipv4","custom_data","registration_date"],
                        "connection": [
                            {
                                "jdbcUrl": [
                                    "jdbc:mysql://192.168.11.1:3306/test"
                                ],
                                "table": ["faker_user"]
                            }
                        ]
                    }
                },
                "writer": {
                    "name": "hdfswriter",
                    "parameter": {
                        "defaultFS": "hdfs://vm1:9000",
                        "fileType": "text",
                        "path": "/datax/",
                        "fileName": "mysql2hdfs.txt",
                        "writeMode": "append",
                        "column": [
                            {
                                "name": "id",
                                "type": "int"
                            },
                            {
                                "name": "name",
                                "type": "string"
                            },
                            {
                                "name": "age",
                                "type": "int"
                            },
                            {
                                "name": "gender",
                                "type": "string"
                            },
                            {
                                "name": "email",
                                "type": "string"
                            },
                            {
                                "name": "address",
                                "type": "string"
                            },
                            {
                                "name": "text",
                                "type": "string"
                            },
                            {
                                "name": "url",
                                "type": "string"
                            },
                            {
                                "name": "phone_number",
                                "type": "string"
                            },
                            {
                                "name": "country",
                                "type": "string"
                            },
                            {
                                "name": "city",
                                "type": "string"
                            },
                            {
                                "name": "job",
                                "type": "string"
                            },
                            {
                                "name": "ipv4",
                                "type": "string"
                            },
                            {
                                "name": "custom_data",
                                "type": "string"
                            },
                            {
                                "name": "registration_date",
                                "type": "string"
                            }
                        ],
                        "fieldDelimiter": "\t"
                    }
                }
            }
        ]
    }
}

执行命令 python bin/datax.py mysql2hdfs.json,结果如下,可以看到同步50W数据总耗时34s
image.png
hdfs结果数据如下(这里我们datax配置文件里虽然设置的并行度是5,但是如果单个表,datax默认会*5,所以最终并行度其实是25,即hdfs目录下最终会有25个文件)
image.png

5、三款数据同步工具的对比

特性Kettle (PDI)SqoopDataX
类型ETL 工具数据传输工具数据同步工具
用户界面图形化界面命令行JSON 配置
数据源支持多种数据源主要支持关系型数据库多种数据源
并行处理支持支持支持
学习曲线较高,需掌握图形化工具较低,基于命令行中等,需要了解 JSON 配置
最佳使用场景复杂的 ETL 和数据整合Hadoop 与 RDBMS 间的批量迁移异构数据源间的灵活同步

6、总结

选择 ETL 工具时需要考虑特定的业务需求数据源类型以及数据处理的规模等因素。每个工具都有其独特的优势和适用场景,因此了解这些工具的特点可以帮助我们做出更明智的选择。


kamier
1.5k 声望495 粉丝