我已经在笔记本电脑上在YARN群集上设置了Spark,并且使用python多处理在Spark中运行多个并发作业时出现问题。我正在使用纱线客户端模式。我尝试了两种方法来实现这一目标:
对于每个流程,设置SparkContext并提交作业。在这种情况下,作业已成功提交给YARN,但作业是串行运行的,一次只运行一个作业,而其余作业在队列中。是否可以同时启动多个作业?
更新设置
YARN:
yarn.nodemanager.resource.cpu-vcores 8
yarn.scheduler.maximum-allocation-vcores 1
火花:
SPARK_EXECUTOR_CORES = 1
纱线一次只能运行一个工作,使用3个容器,3个vcores,3GB ram。所以有足够的vcores和rams可用于其他工作,但它们没有运行
答案 0 :(得分:1)
您拥有多少个CPU以及每个工作需要多少个CPU? YARN将安排作业并在您的群集上分配它们:如果您的作业需要8CPU,而您的系统只有8CPU,那么其他作业将排队并连续运行。
如果您要求每个作业4个,那么您将在任何时间看到并行运行2个作业。
答案 1 :(得分:0)
我找到了解决方案lh-refactor
对于单机群集,
在文件
中/etc/hadoop/conf/capacity-scheduler.xml
更改了属性
yarn.scheduler.capacity.maximum-am-resource-percent从0.1到0.5。
答案 2 :(得分:0)
我遇到了与您相同的问题,我通过在pyspark中设置.config(“ spark.executor.cores”,'1')解决了这个问题。 这是我的代码:
import os,sys
import numpy as np
import pyspark
from multiprocessing import Pool
from pyspark.sql import SparkSession
import time
def train(db):
print(db)
spark = SparkSession \
.builder \
.appName("scene_"+str(db)) \
.config("spark.executor.cores", '1') \
.getOrCreate()
print(spark.createDataFrame([[1.0],[2.0]],['test_column']).collect())
if __name__ == '__main__':
p = Pool(10)
for db in range(10):
p.apply_async(train,args=(db,))
p.close()
p.join()
#train(4)