AWS DataPipeline创建私有EMR集群如何跳过Install Task Runner步骤
首先说明软链接报错的根因:EMR 6.2.0的Hive lib目录自带opencsv-2.3.jar和opencsv-3.9.jar两个版本的包,官方TaskRunner安装脚本用find查找opencsv包时返回了两个结果,直接传入软链接命令后,多个源文件要求目标必须为目录,但脚本指定的目标是单个文件,因此触发报错。
解决方案
方案1:彻底跳过Install TaskRunner步骤(推荐)
你当前使用的ShellCommandActivity类型会触发DataPipeline默认逻辑,自动向EMR注入TaskRunner安装步骤,将活动类型替换为EmrActivity即可跳过该逻辑,直接向EMR提交自定义步骤,无需TaskRunner介入。
修改后的配置参考:
{ "name": "DefaultEmrActivity1", "maximumRetries" : 0, "runsOn": { "ref": "EmrClusterId_lKm9y" }, "id": "EmrActivityId_SRjHg", "type": "EmrActivity", "step": "spark-submit --deploy-mode cluster --conf spark.yarn.submit.waitAppCompletion=true --py-files s3://emr/script.py" }
仅需将原配置中的type改为EmrActivity,command字段替换为step即可,DataPipeline会直接将命令作为EMR步骤提交,不会触发TaskRunner安装流程。
方案2:修复TaskRunner安装逻辑(必须保留ShellCommandActivity时使用)
如果因业务逻辑无法更换活动类型,可以通过以下配置解决问题:
- 在你已配置的引导操作中提前删除一个opencsv版本,比如执行
rm -f /usr/lib/hive/lib/opencsv-2.3.jar,确保find命令仅返回一个结果,软链接命令即可正常执行 - 将安装脚本需要下载的
TaskRunner-1.0.zip、mysql-connector-java-bin.jar、csv-serde.jar提前上传到你的私有S3桶,配置活动参数时指定这三个资源的私有S3路径,避免公网访问:- 新增
--zipFile参数,值为你私有桶中TaskRunner压缩包的S3路径 - 新增
--mysqlFile参数,值为你私有桶中mysql连接器的S3路径 - 新增
--hiveCsvSerdeFile参数,值为你私有桶中csv-serde包的S3路径
- 新增
私有集群适配补充
- 提前为VPC配置S3、DataPipeline的内网端点,确保集群无需公网即可访问这两个服务
- 调试阶段将EMR失败动作改为
保留集群,方便登录排查问题,验证通过后再调整为终止即可。
内容的提问来源于stack exchange,提问作者vll1990
相关产品推荐
相关产品推荐

