必须用JDK 1.8和Python 2,DataX才能正常启动;JDK 9+因类加载机制不兼容会报错,python命令必须指向Python 2而非Python 3,且需确保datax.py有执行权限并从bin目录下运行验证。

DataX 在 Linux 下部署本身不复杂,但**环境不匹配时会卡在第一步就报错**。核心结论:必须用 JDK 1.8,且 python 版本需与 DataX 启动脚本兼容(默认只认 python2,不是 python 命令本身);否则执行 datax.py 会直接抛语法错误或找不到模块。
确认 JDK 1.8 是唯一可用的 Java 运行时
很多服务器装了多个 JDK(比如 OpenJDK 11 或 17),但 DataX 的 Java 类加载机制和反射逻辑在 JDK 9+ 上有兼容性断裂,datax.py 调用 java -cp ... com.alibaba.datax.core.Engine 会失败。
- 运行
java -version,输出必须是1.8.0_XXX形式;如果不是,别指望改JAVA_HOME就能蒙混过关——datax.py内部硬编码调用的是系统java命令,不读环境变量 - CentOS/RHEL:用
yum install java-1.8.0-openjdk-devel,再用alternatives --config java切换默认版本 - Ubuntu/Debian:用
apt-get install openjdk-8-jdk,然后update-alternatives --config java - 验证方式:直接执行
java -cp /dev/null com.alibaba.datax.core.Engine,应报NoClassDefFoundError(说明 Java 可用),而不是UnsupportedClassVersionError
解压后别急着跑 datax.py,先检查 python 调用链
DataX 的 bin/datax.py 是个 shell 包裹的 Python 脚本,它最终会 exec python datax.py(注意:是 python 命令,不是 python3 或 python2)。如果系统里只有 python3,而 python 命令不存在或指向 python3,就会在 import 语句上直接报错(比如 print 不是函数、urllib 拆包异常等)。
- 运行
which python,必须返回一个可执行路径;如果返回空,或指向python3,就得建软链:sudo ln -sf /usr/bin/python2 /usr/bin/python(注意路径以which python2为准) - 不要修改
datax.py文件头的#!/usr/bin/env python—— 它只是声明解释器,真正出问题的是脚本里后续用os.system("python ...")启动子进程的地方 - 常见错误现象:
SyntaxError: invalid syntax出现在第 1 行(即print或except Exception, e:),基本就是python命令实际调用了 Python3
配置 PATH 并验证 datax 命令是否真能用
很多人把 datax 的 bin 加进 PATH 后,以为 datax.py 就能全局执行了,其实不然:datax.py 内部会 cd 到自身所在目录再启动 Java,所以它依赖相对路径下的 lib/ 和 plugin/。PATH 只解决命令发现,不解决上下文路径。
- 正确做法:解压后进入
datax/bin目录,直接运行./datax.py ../job/job.json(用相对路径调用) - 加 PATH 是为了方便,但加完必须
source ~/.bashrc,再执行which datax.py确认命中的路径对不对 - 验证命令是否真正可用:运行
datax.py --version,应输出类似DataX (DATAX-OPENSOURCE-3.0);若报command not found,说明 PATH 没生效或文件没执行权限(chmod +x datax.py) - 别跳过
chmod +x—— 很多下载包解压后脚本权限是644,Linux 下无法执行
第一次同步前,务必手动试跑一个最简 job
官方文档给的 demo json(如 stream2stream.json)看着简单,但里面路径、插件名、参数大小写都极其敏感。不试跑,等到 Web 界面调度失败时,你根本分不清是配置错、插件缺,还是权限问题。
- 从
datax/job目录下找stream2stream.json,用sed -i 's/"column": \[/"column": [{"value":"hello world"}]/' stream2stream.json简化 column 配置(避免因字段类型引发 writer 报错) - 执行
./datax.py stream2stream.json,观察终端输出是否有TaskGroupContainer启动日志、最后是否出现total 10000 records和Cost 1s - 关键看退出码:
echo $?应为0;非零值(尤其是1或255)代表底层 Java 进程已崩溃,不是数据问题,而是环境或 classpath 错误 - 如果卡在
Starting Job...不动,大概率是 JVM 内存不足或 MySQL 驱动缺失(lib/下没放对应 JDBC jar)
datax.py 成功跑通一个 job 并拿到 0 退出码——这一步绕不开,也藏不住问题。后面所有 Web 化、调度、增量逻辑,都是在这个基础上叠上去的。


















