DATAX踩坑路
- 背景
- datax hdfs 支持parquet
- datax hbase11x 修改支持kerberos
- datax 与 hologres 结合
- datax配置hadoop HA(高可用)
- datax的限速
背景
需要离线异构数据库的同步工具,并且希望依赖尽量少的外部环境,最好能与阿里云产品相结合,经过调研发现datax比较满足需求所以决定使用datax
datax hdfs 支持parquet
datax hdfs读取和写出支持 textfile、csv、orc 而在我们的业务场景中经常使用parquet,故增加支持parquet功能
- pom.xml
<!-- 可不更改 注意看下边 -->
<hive.version>2.1.1</hive.version> -
<!-- https://mvnrepository.com/artifact/com.twitter/parquet-tools -->
<dependency>
<groupId>org.apache.parquet</groupId>
<artifactId>parquet-tools</artifactId>
<version>1.8.1</version>
</dependency>
修改hive version的原因是项目上使用的cdh版本较高,使用1.1.1解析parquet时报错如下故进行升级
Could not read footer: java.io.IOException: Could not read footer for file
- 升级hive version后,datax支持的kerberos校验会有问题导致报错,故在json配置中增加如下固定配置
"hadoopConfig":{
"mapreduce.framework.name":"classic",
"mapreduce.jobtracker.kerberos.principal":"xxxxx",
"mapreduce.jobtracker.keytab.file":"keytab path"
}
- 代码
将如下代码下载后解压压覆盖即可
– hdfswriter.zip
– hdfsreader.zip
datax hbase11x 修改支持kerberos
项目上需要kerberos验证,而datax不支持,故进行修改
- 修改后需增加配置如下
"parameter": {
"kerberos":"true",
"keyTabKey":"xxx.com",
"keyTabValue":"${keytab_path}",
"hbaseSiteXml":"hbase-site.xml path",
"system": {
"javax.security.auth.useSubjectCredsOnly": "false",
"java.security.krb5.conf": "${krb5.conf_path}",
"HADOOP_USER_NAME": "kerberos.principal"
},
"hbaseConfig": {
"hadoop.security.authentication": "Kerberos",
"hbase.client.ipc.pool.size": "20",
"hadoop.user.name": "xxx.com" ---xxx.com
},
.....
}
datax 与 hologres 结合
postgresql reader可以满足读取hologres的要求,但在使用postgresqlwriter写hologres时遇到了很大的瓶颈总是报错
具体实现方式请参考
holoclient for datax
datax配置hadoop HA(高可用)
defaultFS 只能配置一个namenode节点 当namenode为高可用时,挂掉配置的那个节点datax任务就会报错,文档上写不支持MA,但通过参数配置是可以支持的,故配置为HA模式。
- json配置如下
"hadoopConfig":{
"dfs.nameservices":"yournamespace",
"dfs.ha.namenodes.yournamespace":"namenode1,namenode2",
"dfs.namenode.rpc-address.yournamespace.namenode1":"xxxxx:8020",
"dfs.namenode.rpc-address.yournamespace.namenode2":"xxxxx:8020",
"dfs.client.failover.proxy.provider.yournamespace": "org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider",
"dfs.ha.automatic-failover.enabled.yournamespace":"true"
},
datax的限速
根据datax所提供的模板进行配置的话发现带宽占用量太大会特别轻易把带宽写满,如下
需要限制datax的速度,阅读文档发现如下描述片段
直接添加在配置文件job中报错
com.alibaba.datax.common.exception.DataXException: Code:[Framework-03], Description:[DataX引擎配置错误,该问题通常是由于DataX安装错误引起,请联系您的运维解决 .]. - 在有总bps限速条件下,单个channel的bps值不能为空,也不能为非正数
at com.alibaba.datax.common.exception.DataXException.asDataXException(DataXException.java:26) ~[datax-common-0.0.1-SNAPSHOT.jar:na]
at com.alibaba.datax.core.job.JobContainer.adjustChannelNumber(JobContainer.java:430) ~[datax-core-0.0.1-SNAPSHOT.jar:na]
at com.alibaba.datax.core.job.JobContainer.split(JobContainer.java:387) ~[datax-core-0.0.1-SNAPSHOT.jar:na]
at com.alibaba.datax.core.job.JobContainer.start(JobContainer.java:117) ~[datax-core-0.0.1-SNAPSHOT.jar:na]
at com.alibaba.datax.core.Engine.start(Engine.java:92) [datax-core-0.0.1-SNAPSHOT.jar:na]
at com.alibaba.datax.core.Engine.entry(Engine.java:171) [datax-core-0.0.1-SNAPSHOT.jar:na]
at com.alibaba.datax.core.Engine.main(Engine.java:204) [datax-core-0.0.1-SNAPSHOT.jar:na]
更改为如下配置正确
"core": {
"transport" : {
"channel": {
"speed": {
"byte": 2000000 //单个channel 2M
}
}
}
},
"job": {
"setting": {
"speed": {
"channel": 5, // 5个channel
"byte": 15000000 //总共15M
}
},