用于自定义jar步骤的AWS EMR(4.x-5.x)类路径

时间:2016-12-19 17:38:41

标签: amazon-web-services emr

为EMR集群添加自定义jar步骤时 - 如何将类路径设置为依赖jar(必需的库)?

假设我有我的jar文件 - myjar.jar但我需要一个外部jar来运行它 - dependency.jar。在创建群集时,您在哪里配置?我没有使用命令行,使用“高级选项”界面。

以为我会花费几个小时探索并阅读过时的文档后发布这个。

关于设置HADOOP_CLASSPATH的2.x / 3.x文档不起作用。他们指定这不适用于4.x及以上版本。您需要在某处指定--libjars选项。但是,在参数列表中指定它也不起作用。

例如:     步骤名称:MyCustomStep     Jar位置:s3://somebucket/myjar.jar     参数:     myclassname     选项1     选项2     --libjars dependentlib.jar

1 个答案:

答案 0 :(得分:2)

在引导操作中将所需的jar复制到/ usr / lib / hadoop-mapreduce /。不需要进行其他更改。其他信息如下:

以下命令可以复制特定的JDBC驱动程序版本:

sudo aws s3 cp s3://<your bucket>/mysql-connector-java-5.1.23-bin.jar /usr/lib/hadoop-mapreduce/

我还有其他依赖项,因此我需要为每个需要复制的jar启动一个引导操作,当然你可以将所有副本放在一个bash脚本中。下面是.net代码,用于获取运行复制脚本的引导操作。我正在使用.net SDK版本3.3。*并使用发布标签emr-5.2.0启动作业

public static BootstrapActionConfig CopyEmrJarDependency(string jarName)
{
    return new BootstrapActionConfig()
    {
        Name = $"Copy jars for EMR dependency: {jarName}",
        ScriptBootstrapAction = new ScriptBootstrapActionConfig()
        {
            Path = $"s3n://{Config.AwsS3CodeBucketName}/EMR/Scripts/copy-thirdPartyJar.sh",
            Args = new List<string>()
                {
                    $"s3://{Config.AwsS3CodeBucketName}/EMR/Java/lib/{jarName}",
                    "/usr/lib/hadoop-mapreduce/"
                }
        }
    };
}

请注意,ScriptBootstrapActionConfig Path属性使用协议“s3n://”,但aws cp命令的协议应为“s3://”

我的脚本copy-thirdPartyJar.sh包含以下内容:

#!/bin/bash
# $1 = location of jar
# $2 = attempted magic directory for java classpath
sudo aws s3 cp $1 $2
相关问题