为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
答案 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