我的项目罐与EMR上的jar冲突,所以为了解决这个问题我已经通过bootstrap脚本将所有高级jar复制到节点的自定义位置。我已经验证了罐子被复制到所有执行器节点上。
它使用spark-submit工作正常,我的code
引用了所有节点的自定义文件夹中的新jar。
/usr/bin/spark-submit --conf="spark.driver.extraClassPath=/usr/customJars/*" --conf="spark.executor.extraClassPath=/usr/customJars/*"
同样的事情我想通过更新sparkconf对象在代码中以编程方式实现。
sparkConf.set("spark.driver.extraClassPath", "/usr/customJars/*");
sparkConf.set("spark.executor.extraClassPath", "/usr/customJars/*");
当我想以编程方式实现时,它无法正常工作。我的code
没有在自定义位置引用更新的罐子。
有什么建议吗?
在Spark中的运行时无法更改大多数属性。
您可以看到SparkConf的文档:SparkConf
将SparkConf传递给SparkContext构造函数后,将克隆这些值,并且无法更改这些值。这是一个Spark限制。
在测试新的属性更改之前,您需要确保停止并启动Spark会话。
作为文档的补充评论:Spark Configuration
对于spark.executor.extraClassPath
:
额外的类路径条目,它们位于执行程序的类路径之前。这主要是为了向后兼容旧版本的Spark。用户通常不需要设置此选项。
您可以使用会影响驱动程序和执行程序的spark.jars
:
以逗号分隔的jar列表,包含在驱动程序和执行程序类路径中。允许使用全球。
确保您的罐子在执行器中可用。