1.标题查看配置模板
Python代码:python datax.py -r mysqlreader -w hdfswriter
如未安装Python则直接从源码处获取相应reader和writer,如 :https://github.com/alibaba/DataX/blob/master/mysqlreader/doc/mysqlreader.md
{
"job": {
"content": [
{
"reader": {
"name": "mysqlreader",
"parameter": {
"column": [],
"connection": [
{
"jdbcUrl": [],
"table": []
}
],
"password": "",
"username": "",
"where": ""
}
},
"writer": {
"name": "hdfswriter",
"parameter": {
"column": [],
"compress": "",
"defaultFS": "",
"fieldDelimiter": "",
"fileName": "",
"fileType": "",
"path": "",
"writeMode": ""
}
}
}
],
"setting": {
"speed": {
"channel": ""
}
}
}
}
相关参数解析参考github里面的文档
2.数据准备
etl_trans_step_log(懒癌晚期的我,直接用的前段时间搞PDI的时候的日志表)
3.编写配置文件
{
"job": {
"content": [
{
"reader": {
"name": "mysqlreader",
"parameter": {
"column": [
"ID_BATCH", "STEPNAME", "TRANSNAME"
],
"connection": [
{
"jdbcUrl": [
"jdbc:mysql://127.0.0.1:3306/admin"
],
"table": [
"etl_trans_step_log"
]
}
],
"username": "root",
"password": "root"
}
},
"writer": {
"name": "hdfswriter",
"parameter": {
"column": [
{
"name": "ID_BATCH",
"type": "int"
},
{
"name": "STEPNAME",
"type": "string"
},
{
"name": "TRANSNAME",
"type": "string"
}
],
"defaultFS": "hdfs://127.0.0.1:8020",
"fieldDelimiter": "\t",
"fileName": "etl_trans_step_log.txt",
"fileType": "text",
"path": "/user/hdfs/etl_trans_step_log",
"writeMode": "append"
}
}
}
],
"setting": {
"speed": {
"channel": "2"
}
}
}
}
4.启动作业
有两种方式启动,如安装的Python2.X,可用
python datax3.py D:\work\datax\myjob\2mysql2hdfs.json
如未安装可以直接用java
java -server -Xms1g -Xmx1g -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:\work\datax\log -Xms1024m -Xmx1024m -Dloglevel=info -Dfile.encoding=GBK -Dlogback.statusListenerClass=ch.qos.logback.core.status.NopStatusListener -Djava.security.egd=file:/dev/./urandom -Ddatax.home=D:\work\datax -Dlogback.configurationFile=D:\work\datax\conf\logback.xml -classpath D:\work\datax\lib\* -Dlog.file.name=5ffabc799aec48f_conf com.alibaba.datax.core.Engine -mode standalone -jobid -1 -job D:\work\datax\myjob\2mysql2hdfs.json
出现以下统计则说明作业运行成功了,
可以到hdfs所在的机器上面,执行:
hadoop fs -ls /user/hdfs/etl_trans_step_log
即可看到相关文件了(实际文件名会有一串随机的字符作为后缀)。
5.关于HDFS高可用的配置
"hadoopConfig":{
"dfs.nameservices": "namespace",
"dfs.ha.namenodes.namespace": "nn1,nn2",
"dfs.namenode.rpc-address.namespace.nn1": "主机名:端口",
"dfs.namenode.rpc-address.namespace.nn2": "主机名:端口",
"dfs.client.failover.proxy.provider.namespace": "org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider"
}
6.注意
- HdfsWriter实现过程是:首先根据用户指定的path,创建一个hdfs文件系统上不存在的临时目录,创建规则:path_随机;然后将读取的文件写入这个临时目录;全部写入后再将这个临时目录下的文件移动到用户指定目录(在创建文件时保证文件名不重复); 最后删除临时目录。如果在中间过程发生网络中断等情况造成无法与hdfs建立连接,需要用户手动删除已经写入的文件和临时目录。所以实际执行时会在该文件名后添加随机的后缀作为每个线程写入实际文件名。
- Windows环境下执行该job会删除path里面配置的最后一层目录,即配置的为:/user/hdfs/etl_trans_step_log 则会删除etl_trans_step_log 文件夹以及包含的所有子文件。大致原因是:源码中HdfsWriter.java的buildTmpFilePath()方法最后拼接的都是‘\’,而HdfsHelper.java中renameFile()方法中的path.getParent()则是按照‘/’来分割URL取父级地址。修改HdfsWriter.java中拼接的path的字符重新编译后运行作业正常。