如何使用python多处理在Spark中运行多个并发作业

时间:2015-11-09 17:12:42

标签: python-2.7 apache-spark yarn pyspark

我已经在笔记本电脑上在YARN群集上设置了Spark,并且使用python多处理在Spark中运行多个并发作业时出现问题。我正在使用纱线客户端模式。我尝试了两种方法来实现这一目标:

  • 设置单个SparkContext并创建多个进程以提交作业。此方法不起作用,程序崩溃。我猜单个SparkContext不支持python多进程
  • 对于每个流程,设置SparkContext并提交作业。在这种情况下,作业已成功提交给YARN,但作业是串行运行的,一次只运行一个作业,而其余作业在队列中。是否可以同时启动多个作业?

    更新设置

    YARN:

  • yarn.nodemanager.resource.cpu-vcores 8

  • yarn.nodemanager.resource.memory-mb 11264
  • yarn.scheduler.maximum-allocation-vcores 1

    火花:

  • SPARK_EXECUTOR_CORES = 1

  • SPARK_EXECUTOR_INSTANCES = 2
  • SPARK_DRIVER_MEMORY = 1G
  • spark.scheduler.mode = FAIR
  • spark.dynamicAllocation.enabled = true
  • spark.shuffle.service.enabled = true

纱线一次只能运行一个工作,使用3个容器,3个vcores,3GB ram。所以有足够的vcores和rams可用于其他工作,但它们没有运行

3 个答案:

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