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

1、异构数据源之间高速数据传输;
2、跨平台独立运行;
3、数据传输过程全内存操作,不读写磁盘;
4、插件式扩展。

-
配置文件:XML格式,配置Reader、Writer的参数(如:并行度、数据库连接地址、账号、密码等);
-
Reader:数据读取模块,负责从数据源读取数据并写入RingBuffer;
-
Splitter:根据配置文件中Reader的并行度构造相应数据的ReaderConfig对象供Reader使用,以实现数据的并行读取;
-
RingBugffer:来自Disruptor的高性能环形数据缓冲区,基于事件监听模式的异步实现,采用无锁方式针对CPU缓存优化,在此用于Reader和Writer的数据交换;
-
Writer:数据写入模块,负责从RingBuffer中读取数据并写入目标数据源。
HData框架通过配置读取解析、RingBugffer 缓冲区、线程池封装等技术,统一处理了数据传输中的基本问题,并提供Reader、Splitter、Writer插件接口,基于此可以方便地开发出各种插件,以满足各种数据源访问的需求。
执行 ./bin/package-hdata.sh 命令,执行成功后将会生成压缩包 ./buildhdata.tar.gz ,然后解压即可。
./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为前缀。
其中,参数parallelism为读/写并行度,所有插件均有该参数,默认为1。
设置合理的parallelism参数可提高性能。
无配置参数,一般仅用于测试
| 参数 |
是否必选 |
描述 |
| driver |
是 |
JDBC驱动类名,如:com.mysql.jdbc.Driver |
| url |
是 |
JDBC连接地址,如: jdbc:mysql://localhost:3306/db |
| username |
是 |
数据库用户名 |
| password |
是 |
数据库密码 |
| table |
是 |
表名(包含数据库名或schema名),如:db.table,也支持分表,例如:table[001-100] |
| columns |
否 |
字段名,多个字段用逗号“,”分隔。不填则选取所有字段。 |
| exclude.columns |
否 |
排除的字段名,多个字段用逗号“,”分隔 |
| where |
否 |
查询条件,如:day=’20140418’ |
| sql |
否 |
自定义查询SQL |
| split.by |
否 |
并行读取切分的字段 |
| max.size.per.fetch |
否 |
单次执行SQL获取的最多记录数 |
| null.string |
否 |
替换当字符串类型的字段值为NULL时的值 |
| null.non.string |
否 |
替换当非字符串类型的字段值为NULL时的值 |
| field.wrap.replace.string |
否 |
若字符串字段中存在换行符时需要替换的值 |
| number.format |
否 |
小数类型字段的输出格式 |
| 参数 |
是否必选 |
描述 |
| metastore.uris |
是 |
Hive Metastore连接地址,如:thrift://localhost:9083 |
| database |
否 |
数据库名,默认:default |
| table |
是 |
表名 |
| partitions |
否 |
分区,例如: visit_date='2016-07-07' |
| hadoop.user |
否 |
具有HDFS读权限的用户名 |
| hdfs.conf.path |
否 |
hdfs-site.xml配置文件路径 |
| select.columns |
否 |
选择读取的字段 |
| convert.null |
否 |
设置值为NULL时对应的字符串,默认:"NULL" |
| 参数 |
是否必选 |
描述 |
| dir |
是 |
HDFS目录路径,如:hdfs://192.168.1.1:8020/user/dir1 |
| filename |
是 |
文件名,支持正则表达式 |
| schema |
否 |
输出的字段定义 |
| fields.separator |
否 |
字段分隔符,默认:\0001 |
| encoding |
否 |
文件编码,默认:UTF-8 |
| hadoop.user |
否 |
具有HDFS读权限的用户名 |
| hdfs.conf.path |
否 |
hdfs-site.xml配置文件路径 |
| 参数 |
是否必选 |
描述 |
| zookeeper.quorum |
是 |
Zookeeper连接地址,如:192.168.1.16,192.168.1.17 |
| zookeeper.client.port |
否 |
Zookeeper客户端端口,默认:2181 |
| table |
是 |
表名 |
| start.rowkey |
否 |
Rowkey起始值 |
| end.rowkey |
否 |
Rowkey结束值 |
| columns |
是 |
读取的列,如::rowkey,cf:start_ip,cf:end_ip |
| schema |
是 |
输出的字段定义,如:id,start_ip,end_ip |
| zookeeper.znode.parent |
否 |
hbase使用的Zookeeper根节点 |
| 参数 |
是否必选 |
描述 |
| url |
是 |
URL链接 |
| encoding |
否 |
编码,默认UTF-8 |
| 参数 |
是否必选 |
描述 |
| topic |
是 |
需要消费的topic |
| group.id |
是 |
consumer组id |
| zookeeper.connect |
是 |
Zookeeper连接地址,如:198.168.12.34:2181 |
| consumer.stream.count |
否 |
数据消费流的数量,默认为1 |
| encoding |
否 |
编码,默认UTF-8 |
| max.fetch.size |
否 |
最大fetch数,默认:100000 |
| max.wait.second |
否 |
最大等待时间(单位:秒),默认:300 |
| partition.id |
否 |
默认:0 |
| start.offset |
否 |
需要消费的起始offset |
| fields.separator |
否 |
字段分隔符,默认\t |
| schema |
否 |
输出的字段定义,如:id,start_ip,end_ip |
| 参数 |
是否必选 |
描述 |
| host |
是 |
FTP连接地址,如:192.168.1.1 |
| port |
否 |
FTP端口,默认:21 |
| username |
是 |
用户名 |
| password |
是 |
密码 |
| dir |
是 |
FTP目录,如:/input/dir |
| filename |
是 |
文件名,支持正则表达式 |
| recursive |
否 |
是否递归搜索文件,默认:false |
| encoding |
否 |
文件编码,默认:UTF-8 |
| fields.separator |
否 |
字段分隔符,默认:\t |
| schema |
否 |
输出的字段定义 |
| fields.count.filter |
否 |
符合的字段数,不符合则过滤记录 |
| 参数 |
是否必选 |
描述 |
| uri |
是 |
MongoDB连接地址,如:mongodb://localhost/test.ip |
| query |
否 |
查询语句,如:{"city":"XXX"} |
| 参数 |
是否必选 |
描述 |
| path |
是 |
本地文件路径 |
| start.row |
否 |
数据起始行数,默认:1 |
| encoding |
否 |
编码,默认:UTF-8 |
| 参数 |
是否必选 |
描述 |
| path |
是 |
文件路径 |
| include.column.names |
否 |
是否包含列名,默认:false |
| 参数 |
是否必选 |
描述 |
| driver |
是 |
JDBC驱动类名,如:com.mysql.jdbc.Driver |
| url |
是 |
JDBC连接地址,如: jdbc:mysql://localhost:3306/db |
| username |
是 |
数据库用户名 |
| password |
是 |
数据库密码 |
| table |
是 |
表名(包含数据库名或schema名),如:db.table |
| batch.insert.size |
否 |
批量插入的记录数,默认值:10000 |
| schema |
否 |
字段名配置,一般用于writer和reader的字段名不一致时 |
| 参数 |
是否必选 |
描述 |
| metastore.uris |
是 |
Hive Metastore连接地址,如:thrift://localhost:9083 |
| database |
否 |
数据库名,默认:default |
| table |
是 |
表名 |
| partitions |
否 |
分区条件,如:day='20140418' |
| hadoop.user |
否 |
具有HDFS写权限的用户名 |
| hdfs.conf.path |
否 |
hdfs-site.xml配置文件路径 |
| 参数 |
是否必选 |
描述 |
| path |
是 |
HDFS文件路径,如:hdfs://192.168.1.1:8020/user/1.txt |
| fields.separator |
否 |
字段分隔符,默认:\t |
| line.separator |
否 |
行分隔符,默认:\n |
| encoding |
否 |
文件编码,默认:UTF-8 |
| compress.codec |
否 |
压缩编码,如:org.apache.hadoop.io.compress.GzipCodec |
| hadoop.user |
否 |
具有HDFS写权限的用户名 |
| max.file.size.mb |
否 |
单个文件最大大小限制(单位:MB) |
| partition.date.index |
否 |
日期字段索引值,起始值为0 |
| partition.date.format |
否 |
日期格式,如:yyyy-MM-dd |
| hdfs.conf.path |
否 |
hdfs-site.xml配置文件路径 |
| 参数 |
是否必选 |
描述 |
| zookeeper.quorum |
是 |
Zookeeper连接地址,如:192.168.1.16,192.168.1.17 |
| zookeeper.client.port |
否 |
Zookeeper客户端端口,默认:2181 |
| table |
是 |
表名 |
| columns |
是 |
列名,如::rowkey,cf:start_ip |
| batch.insert.size |
否 |
批量插入的记录数,默认值:10000 |
| zookeeper.znode.parent |
否 |
hbase使用的Zookeeper根节点 |
| 参数 |
是否必选 |
描述 |
| topic |
是 |
需要消费的topic |
| fields.separator |
否 |
字段分隔符,默认\t |
| 参数 |
是否必选 |
描述 |
| host |
是 |
FTP连接地址,如:192.168.1.1 |
| port |
否 |
FTP端口,默认:21 |
| username |
是 |
用户名 |
| password |
是 |
密码 |
| path |
是 |
FTP保存目录 |
| encoding |
否 |
文件编码,默认:UTF-8 |
| fields.separator |
否 |
字段分隔符,默认:\t |
| line.separator |
否 |
行分隔符,默认\n |
| gzip.compress |
否 |
是否启用gzip压缩,默认:false |
| 参数 |
是否必选 |
描述 |
| uri |
是 |
MongoDB连接地址,如:mongodb://localhost/test.ip |
| query |
否 |
查询语句,如:{"city":"XXX"} |
| 参数 |
是否必选 |
描述 |
| path |
是 |
本地文件路径 |
| separator |
否 |
字段分隔符,默认逗号"," |
| encoding |
否 |
编码,默认:UTF-8 |
| 参数 |
是否必选 |
描述 |
| path |
是 |
文件路径 |
| include.column.names |
否 |
是否包含列名,默认:false |
无配置参数,一般仅用于测试