我正在使用livy服务器(0.6)在集群模式下将spark作业提交到spark hadoop集群(spark-2.3.2)。在输入json中提供档案时,档案不会被复制到驱动程序上的工作文件夹中。
归档是R库,未安装在工作程序节点中。因此,我需要将这些文件发送到工作文件夹并将其添加到R运行时。
使用--archives从边缘节点提交spark作业时,它已成功将库复制到执行程序中的工作文件夹中。但是,在使用--conf spark.yarn.dist.archives = rlibs.zip时,从边缘节点不会复制文件。我尝试此操作的原因是因为Livy还将存档输入转换为spark.yarn.dist.archives选项。无法指示livy将其添加为--archives而不是--conf
基本上,为什么--conf spark.yarn.dist.archives不能按预期方式工作,而当Spark作业以集群模式提交时,spark Submit的--archives cmd选项可以正常工作
下面是spark-sumbit命令尝试过的命令。将R库位置添加到--archives工作
spark-submit --conf spark.executor.instances=2 --conf spark.yarn.submit.waitAppCompletion=false --conf spark.submit.deployMode=cluster --conf spark.yarn.dist.archives=hdfs:///hdfs_location/rlib.zip#RLIBS --conf spark.master=yarn --conf spark.executor.cores=2 --conf spark.yarn.appMasterEnv.R_LIBS_USER=./RLIBS/rlib/ --conf spark.executorEnv.R_LIBS_USER=./RLIBS/rlib --conf spark.driver.extraLibraryPath=/shared_lib_path/ /home_folder/script.R
对应的livy API调用
import json, pprint, requests, textwrap
host = 'http://hostname:8998'
config_map = {
'spark.hadoop.yarn.timeline-service.enabled' : False,
'spark.executor.cores' : 2,
'spark.executor.instances' : 2,
'spark.dynamicAllocation.enabled' : False,
'spark.yarn.appMasterEnv.R_LIBS_USER' : './RLIBS/rlib/',
'spark.executorEnv.R_LIBS_USER' : './RLIBS/rlib/',
'spark.driver.extraLibraryPath' : '/usr/lib/shared_lib_path',
'spark.submit.deployMode' : 'cluster'
}
data = {
'file' : 'hdfs:///script.R',
'archives' : ['hdfs:///hdfs_location/rlib.zip#RLIBS'],
'conf' : config_map,
}
headers = {'Content-Type': 'application/json'}
r = requests.post(host + '/batches', data=json.dumps(data),
headers=headers)
r.json()