HData是一个异构的ETL数据导入/导出工具,致力于使用一个工具解决不同数据源(JDBC、Hive、HDFS、HBase、MongoDB、FTP、Http、CSV、Excel、Kafka等)之间数据交换的问题。HData在设计上同时参考了开源的Sqoop、DataX,却与之有不同的实现。HData采用“框架+插件”的结构,具有较好的扩展性,框架相当于数据缓冲区,插件则为访问不同的数据源提供实现。
![HData](https://raw.githubusercontent.com/jinhang/HData/master/./doc/img/1.png)
1、异构数据源之间高速数据传输;
2、跨平台独立运行;
3、数据传输过程全内存操作,不读写磁盘;
4、插件式扩展。
![HData Design](https://raw.githubusercontent.com/jinhang/HData/master/./doc/img/2.png)
-
配置文件: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 |
无配置参数,一般仅用于测试