ETL数据导入导出工具HData使用

database

注:近期因朋友的请求协助了解Hdata工具的使用,抽空进行了摸索,特整理此文;该ETL数据交换工具开发者已经有三、四年没有更新维护记录了,不确定该项目是否会继续维护,因此选择该工具应用于项目时,请考虑后续的技术支持与问题处理等所需要的解决方案成本;

1、介绍(转载官方)

HData是一个异构的ETL数据导入/导出工具,致力于使用一个工具解决不同数据源(JDBC、Hive、HDFS、HBase、MongoDB、FTP、Http、CSV、Excel、Kafka等)之间数据交换的问题。HData在设计上同时参考了开源的Sqoop、DataX,却与之有不同的实现。HData采用“框架+插件”的结构,具有较好的扩展性,框架相当于数据缓冲区,插件则为访问不同的数据源提供实现。

【HData特性】

1、异构数据源之间高速数据传输;

2、跨平台下独立运行;

3、数据传输过程全内存操作,不读写磁盘;

4、插件式扩展。

 

【HData设计】

配置文件:XML格式,配置Reader、Writer的参数(如:并行度、数据库连接地址、账号、密码等);

Reader:数据读取模块,负责从数据源读取数据并写入RingBuffer;

Splitter:根据配置文件中Reader的并行度构造相应数据的ReaderConfig对象供Reader使用,以实现数据的并行读取;

RingBugffer:来自Disruptor的高性能环形数据缓冲区,基于事件监听模式的异步实现,采用无锁方式针对CPU缓存优化,在此用于Reader和Writer的数据交换;

Writer:数据写入模块,负责从RingBuffer中读取数据并写入目标数据源。

HData框架通过配置读取解析、RingBugffer 缓冲区、线程池封装等技术,统一处理了数据传输中的基本问题,并提供Reader、Splitter、Writer插件接口,基于此可以方便地开发出各种插件,以满足各种数据源访问的需求。

 

【编译&运行】

编译

执行 mvn clean package -Pmake-package 命令,执行成功后将会生成压缩包 ./build/hdata.tar.gz ,然后解压即可。

编译时也可以夹带自己的配置, 如:mvn clean package -Pcdh5 -Pmake-package

运行

1、命令行配置方式

./bin/hdata --reader READER_NAME -Rk1=v1 -Rk2=v2 --writer WRITER_NAME -Wk1=v1 -Wk2=v2

READER_NAME、WRITER_NAME分别为读/写插件的名称,例如:jdbc、hive Reader插件的参数配置以-R为前缀,Writer插件的参数配置以-W为前缀。

例子(Mysql -> Hive):

 

./bin/hdata --reader jdbc -Rurl="jdbc:mysql://127.0.0.1:3306/testdb" -Rdriver="com.mysql.jdbc.Driver" -Rtable="testtable" -Rusername="username" -Rpassword="password" -Rparallelism=3 --writer hive -Wmetastore.uris="thrift://127.0.0.1:9083" -Whdfs.conf.path="/path/to/hdfs-site.xml" -Wdatabase="default" -Wtable="testtable" -Whadoop.user="hadoop" -Wparallelism=2

2、XML配置方式

job.xml

<?xml version="1.0" encoding="UTF-8"?>

<job id="job_example">

<reader name="jdbc">

<url>jdbc:mysql://127.0.0.1:3306/testdb</url>

<driver>com.mysql.jdbc.Driver</driver>

<table>testtable</table>

<username>username</username>

<password>password</password>

<parallelism>3</parallelism>

</reader>

<writer name="hive">

<metastore.uris>thrift://127.0.0.1:9083</metastore.uris>

<hdfs.conf.path>/path/to/hdfs-site.xml</hdfs.conf.path>

<database>default</database>

<table>testtable</table>

<hadoop.user>hadoop</hadoop.user>

<parallelism>2</parallelism>

</writer>

</job>

运行命令

./bin/hdata -f /path/to/job.xml

2、使用实战

【github下载】

https://github.com/uptonking/hdata

 

【编译环境】

jdk1.7(只能是1.7)

maven 3+

 

【配置maven】

建议用独立setting.xml配置,不影响项目工程开发

hdata-settting.xml

<?xml version="1.0" encoding="UTF-8"?>

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">

<localRepository>D:/apache-maven-3.5.4/repository</localRepository>

<pluginGroups></pluginGroups>

<proxies></proxies>

<servers></servers>

<mirrors>

<!--

<mirror>

<id>alimaven</id>

<mirrorOf>*</mirrorOf>

<url>http://maven.aliyun.com/nexus/content/groups/public</url>

</mirror>

<mirror>

<id>aliyunmaven</id>

<mirrorOf>*</mirrorOf>

<name>阿里云spring插件仓库</name>

<url>http://maven.aliyun.com/repository/spring-plugin</url>

</mirror>

-->

<mirror>

<mirrorOf>*</mirrorOf>

<name>mirror-all</name>

<url>http://mirrors.cloud.tencent.com/nexus/repository/maven-public/</url>

<id>custom</id>

</mirror>

<!--

<mirror>

<id>repo2</id>

<name>Mirror from Maven Repo2</name>

<url>http://repo.spring.io/plugins-release/</url>

<mirrorOf>central</mirrorOf>

</mirror>

-->

</mirrors>

<profiles>

<profile>

<profile>

<id>jdk-1.7</id>

<activation>

<activeByDefault>true</activeByDefault>

<jdk>1.7</jdk>

</activation>

<properties>

<maven.compiler.source>1.7</maven.compiler.source>

<maven.compiler.target>1.7</maven.compiler.target>

<maven.compiler.compilerVersion>1.7</maven.compiler.compilerVersion>

</properties>

</profile>

<profile>

<id>maven-home</id>

<repositories>

<repository>

<id>central</id>

<url>https://repo1.maven.org/maven2</url>

<releases>

<enabled>true</enabled>

<checksumPolicy>warn</checksumPolicy>

</releases>

<snapshots>

<enabled>false</enabled>

</snapshots>

</repository>

</repositories>

<pluginRepositories>

<pluginRepository>

<id>central</id>

<url>http://repo1.maven.org/maven2</url>

</pluginRepository>

</pluginRepositories>

</profile>

</profiles>

</settings>

注意:因为部份依赖包无法从中央仓库下载,aliyun镜像仓库也无法下载成功,因此配了多个mirror配置,那个能下载成功就用那个,多试几次,自已手动切换;

 

【执行打包】

mvn clean package -Pmake-package --settings D:apache-maven-3.5.4confhdata-settings.xml -Dmaven.test.skip=true

打包过程执行的有些久,因为要下载大量依赖包,稍等片刻,直到最后打包完成

....

....

.....

[INFO] Reading assembly descriptor: src/build/package.xml

[INFO] Building tar: D:Workspacesidea_2HData-masterassembly..uildhdata-0.2.8.tar.gz

[INFO] ------------------------------------------------------------------------

[INFO] Reactor Summary:

[INFO]

[INFO] HData 0.2.8 ........................................ SUCCESS [ 18.604 s]

[INFO] hdata-api .......................................... SUCCESS [ 14.069 s]

[INFO] hdata-core ......................................... SUCCESS [ 4.442 s]

[INFO] hdata-console ...................................... SUCCESS [ 0.234 s]

[INFO] hdata-csv .......................................... SUCCESS [ 0.632 s]

[INFO] hdata-jdbc ......................................... SUCCESS [ 1.343 s]

[INFO] hdata-ftp .......................................... SUCCESS [ 0.753 s]

[INFO] hdata-http ......................................... SUCCESS [ 0.234 s]

[INFO] hdata-kafka ........................................ SUCCESS [ 6.452 s]

[INFO] hdata-hdfs ......................................... SUCCESS [ 20.008 s]

[INFO] hdata-hive ......................................... SUCCESS [ 30.733 s]

[INFO] hdata-hbase ........................................ SUCCESS [ 35.710 s]

[INFO] hdata-mongodb ...................................... SUCCESS [ 3.634 s]

[INFO] hdata-excel ........................................ SUCCESS [ 14.700 s]

[INFO] hdata-wit .......................................... SUCCESS [ 4.037 s]

[INFO] hdata-assembly 0.2.8 ............................... SUCCESS [ 17.239 s]

[INFO] ------------------------------------------------------------------------

[INFO] BUILD SUCCESS

[INFO] ------------------------------------------------------------------------

[INFO] Total time: 02:53 min

[INFO] Finished at: 2020-06-16T12:12:33+08:00

[INFO] ------------------------------------------------------------------------

【查看目录结构】

D:Workspacesidea_2HData-master>dir

...

2020/06/16 12:12 <DIR> .

2020/06/16 12:12 <DIR> ..

2018/01/11 19:22 14 .gitignore

2020/06/16 15:45 <DIR> .idea

2020/06/16 12:12 <DIR> assembly

2020/06/15 13:49 <DIR> bin

2020/06/16 14:06 <DIR> build

2020/06/15 13:49 <DIR> conf

2020/06/15 13:49 <DIR> doc

2020/06/16 12:10 <DIR> hdata-api

2020/06/16 12:10 <DIR> hdata-console

2020/06/16 12:10 <DIR> hdata-core

2020/06/16 12:10 <DIR> hdata-csv

2020/06/16 12:12 <DIR> hdata-excel

2020/06/16 12:10 <DIR> hdata-ftp

2020/06/16 12:11 <DIR> hdata-hbase

2020/06/16 12:10 <DIR> hdata-hdfs

2020/06/16 12:11 <DIR> hdata-hive

2020/06/16 12:10 <DIR> hdata-http

2020/06/16 12:10 <DIR> hdata-jdbc

2020/06/16 12:10 <DIR> hdata-kafka

2020/06/16 12:11 <DIR> hdata-mongodb

2020/06/16 12:12 <DIR> hdata-wit

2020/06/15 13:52 574 hdata.iml

2020/06/16 11:44 5,337 pom.xml

2018/01/11 19:22 13,774 README.md

2020/06/16 12:10 <DIR> target

...

多了一个build,即为编译后的目录,在该目录下有一个

hdata-0.2.8.tar.gz压缩文件,即打包后的可执行程序包;解压该包,进入到根目录即可执行命令;

 

【执行同步】

hdata-0.2.8.tar.gz压缩文件解压,复制到D:/test/目录下。

D: esthdata-0.2.8>dir

....

2020/06/16 16:06 <DIR> .

2020/06/16 16:06 <DIR> ..

2020/06/16 14:06 <DIR> bin

2020/06/16 16:17 <DIR> conf

2020/06/16 14:06 <DIR> lib

2020/06/16 14:06 <DIR> plugins

...

bin:存放hdata和hdata.bat脚本,分别用于linux和windows下运行的起始脚本;

conf:存放hdata的配置,如:缓冲区大小、线程等待策略等..

lib:存放hdata核心框架jar程序

plugins:存放hdata的各种插件与依赖jar程序

 

  • 【执行mysql到mysql的数据库同步】

说明:输入端和输出端,必需存在指定数据库和表,否则数据同步将失败;

命令行参数

java -Xss256k -Xms1G -Xmx1G -Xmn512M -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -XX:+CMSParallelRemarkEnabled -XX:+DisableExplicitGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -XX:+HeapDumpOnOutOfMemoryError -XX:SoftRefLRUPolicyMSPerMB=0 -Dhdata.conf.dir="D: esthdata-0.2.8conf" -Dlog4j.configurationFile=file:///D: esthdata-0.2.8conflog4j2.xml -classpath ".;D: esthdata-0.2.8lib*" "com.github.stuxuhai.hdata.CliDriver" -Dhttps.protocols=TLSv1.2 -Dfile.encoding="UTF-8" --reader jdbc -Rurl="jdbc:mysql://127.0.0.1:3306/gateway?characterEncoding=utf8&useSSL=false" -Rdriver="com.mysql.jdbc.Driver" -Rtable="client" -Rusername="root" -Rpassword="123456" --writer jdbc -Wurl="jdbc:mysql://192.168.1.35:3306/gateway?characterEncoding=utf8&useSSL=false" -Wdriver="com.mysql.jdbc.Driver" -Wtable="client" -Wusername="root" -Wpassword="root_it_123465"

执行xml配置参数

hdata.bat -f D:/test/hdata-0.2.8/conf/mysqlToMysql.xml

mysqlToMysql.xml

<?xml version="1.0" encoding="UTF-8"?>

<job id="job_example">

<reader name="jdbc">

<url><![CDATA[jdbc:mysql://127.0.0.1:3306/gateway?characterEncoding=utf8&useSSL=false]]></url>

<driver>com.mysql.jdbc.Driver</driver>

<table>client</table>

<username>root</username>

<password>123456</password>

<parallelism>3</parallelism>

</reader>

<writer name="jdbc">

<url><![CDATA[jdbc:mysql://192.168.1.35:3306/gateway?characterEncoding=utf8&useSSL=false]]></url>

<driver>com.mysql.jdbc.Driver</driver>

<table>client</table>

<username>root</username>

<password>123456</password>

<parallelism>3</parallelism>

</writer>

</job>

  • 【执行mysql到excel的数据同步】

说明:输入端和输出端,必需存在指定数据库和表,否则数据同步将失败,输出时自动创建excel文件;

命令行参数

java -Xss256k -Xms1G -Xmx1G -Xmn512M -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -XX:+CMSParallelRemarkEnabled -XX:+DisableExplicitGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -XX:+HeapDumpOnOutOfMemoryError -XX:SoftRefLRUPolicyMSPerMB=0 -Dhdata.conf.dir="D: esthdata-0.2.8conf" -Dlog4j.configurationFile=file:///D: esthdata-0.2.8conflog4j2.xml -classpath ".;D: esthdata-0.2.8lib*" "com.github.stuxuhai.hdata.CliDriver" -Dhttps.protocols=TLSv1.2 -Dfile.encoding="UTF-8" --reader jdbc -Rurl="jdbc:mysql://127.0.0.1:3306/gateway?characterEncoding=utf8&useSSL=false" -Rdriver="com.mysql.jdbc.Driver" -Rtable="client" -Rusername="root" -Rpassword="123456" --writer excel -Wpath="D://test//client.xlsx" -Winclude.column.names="true"

执行xml配置参数

hdata.bat -f D:/test/hdata-0.2.8/conf/mysqlToExcel.xml

mysqlToExcel.xml

<?xml version="1.0" encoding="UTF-8"?>

<job id="job_example">

<reader name="jdbc">

<url><![CDATA[jdbc:mysql://127.0.0.1:3306/gateway?characterEncoding=utf8&useSSL=false]]></url>

<driver>com.mysql.jdbc.Driver</driver>

<table>client</table>

<username>root</username>

<password>123456</password>

<parallelism>3</parallelism>

</reader>

<writer name="excel">

<path><![CDATA[D://test//client2.xlsx]]></path>

<include.column.names>true</include.column.names>

</writer>

</job>

  • 【执行http到excel的数据同步】

说明:输入端和输出端,必需存在URL所表示的http服务,否则数据同步将失败,输出时自动创建excel文件;

执行http到excel

java -Xss256k -Xms1G -Xmx1G -Xmn512M -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -XX:+CMSParallelRemarkEnabled -XX:+DisableExplicitGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -XX:+HeapDumpOnOutOfMemoryError -XX:SoftRefLRUPolicyMSPerMB=0 -Dhdata.conf.dir="D: esthdata-0.2.8conf" -Dlog4j.configurationFile=file:///D: esthdata-0.2.8conflog4j2.xml -classpath ".;D: esthdata-0.2.8lib*" "com.github.stuxuhai.hdata.CliDriver" -Dhttps.protocols=TLSv1.2 -Dfile.encoding="UTF-8" --reader http -Rurl="https://www.baidu.com/" --writer excel -Wpath="D://test//html2.xlsx" -Winclude.column.names="true"

执行xml配置参数

hdata.bat -f D:/test/hdata-0.2.8/conf/httpToExcel.xml

httpToExcel.xml

<?xml version="1.0" encoding="UTF-8"?>

<job id="job_example">

<reader name="http">

<url><![CDATA[https://www.baidu.com/]]></url>

</reader>

<writer name="excel">

<path><![CDATA[D://test//html2.xlsx]]></path>

<include.column.names>true</include.column.names>

</writer>

</job>

3、IDEA中查看代码

1.导入工程

 

2.配置启动参数

 

Configuration配置

VM Options: -Dhttps.protocols=TLSv1.2 -Dhdata.conf.dir="D:\Workspaces\idea_2\HData-master\conf"

Program arguments: --reader jdbc -Rurl="jdbc:mysql://127.0.0.1:3306/gateway?characterEncoding=utf8&useSSL=false" -Rdriver="com.mysql.jdbc.Driver" -Rtable="client" -Rusername="root" -Rpassword="123456" --writer jdbc -Wurl="jdbc:mysql://192.168.1.35:3306/gateway?characterEncoding=utf8&useSSL=false" -Wdriver="com.mysql.jdbc.Driver" -Wtable="client" -Wusername="root" -Wpassword="123456"

3.直接从hdata-core模块的CliDriver类中运行即可

 

4、问题

1.[Fatal Error] mysqlToMysql.xml:5:73: 对实体 "useSSL" 的引用必须以 ";" 分隔符结尾。

[Fatal Error] mysqlToMysql.xml:5:73: 对实体 "useSSL" 的引用必须以 ";" 分隔符结尾。

<url><![CDATA[jdbc:mysql://127.0.0.1:3306/gateway?characterEncoding=utf8&useSSL=false]]></url>

因为xml结构内有&=等特殊符号,xml解析失败,将内容以<![CDATA["xxxxxx"]]> 包装起来即可;

 

以上是 ETL数据导入导出工具HData使用 的全部内容, 来源链接: utcz.com/z/534175.html

回到顶部