当更多可用时,Spark仅使用一台工作机器

Ans*_*ari 13 python apache-spark pyspark

我正在尝试通过Spark并行化机器学习预测任务.我之前已经成功地使用过Spark多次其他任务,之前并没有遇到过并行化的问题.

在此特定任务中,我的群集有4个工作人员.我在一个带有4个分区的RDD上调用mapPartitions.map函数从磁盘加载一个模型(一个bootstrap脚本分配执行此操作所需的所有内容;我已经验证它存在于每个从属机器上)并对RDD分区中的数据点执行预测.

代码运行,但只使用一个执行程序.其他执行程序的日志说"Shutdown hook called".在不同的代码运行中,它使用不同的机器,但一次只使用一台.

如何让Spark一次使用多台机器?

我通过Zeppelin笔记本在Amazon EMR上使用PySpark.代码片段如下.

%spark.pyspark

sc.addPyFile("/home/hadoop/MyClassifier.py")
sc.addPyFile("/home/hadoop/ModelLoader.py")

from ModelLoader import ModelLoader
from MyClassifier import MyClassifier

def load_models():
    models_path = '/home/hadoop/models'
    model_loader = ModelLoader(models_path)

    models = model_loader.load_models()
    return models

def process_file(file_contents, models):
    filename = file_contents[0]
    filetext = file_contents[1]
    pred = MyClassifier.predict(filetext, models)
    return (filename, pred)

def process_partition(file_list):
    models = load_models()
    for file_contents in file_list:
        pred = process_file(file_contents, models)
        yield pred


all_contents = sc.wholeTextFiles("s3://some-path", 4)
processed_pages = all_contents.mapPartitions(process_partition)
processedDF = processed_pages.toDF(["filename", "pred"])
processedDF.write.json("s3://some-other-path", mode='overwrite')
Run Code Online (Sandbox Code Playgroud)

预期有四个任务,但它们都在同一个执行程序上运行!

我正在运行集群,并且可以在资源管理器中提供可用的日志.我只是不知道在哪里看.

lon*_*tar 3

该进程具有与您指定的分区一样多的分区,但它以序列化方式进行。

\n\n

执行者

\n\n

该进程可能会启动默认数量的执行程序。这可以在yarn资源管理器中看到。在您的情况下,所有处理均由一名执行者完成。如果执行器有多个核心,它将并行化工作。在 emr 中,您必须进行此更改才能为执行程序提供超过 1 个核心。

\n\n

在我们的例子中具体发生的是,数据很小,因此所有数据都在一个执行器中读取(即使用一个节点)。如果没有以下属性,执行器仅使用单核。因此,所有任务都是序列化的。

\n\n

设置属性

\n\n
sudo  vi /etc/hadoop/conf/capacity-scheduler.xml\n
Run Code Online (Sandbox Code Playgroud)\n\n

设置以下属性,如图所示

\n\n
"yarn.scheduler.capacity.resource-calculator": "org.apache.hadoop.yarn.util.resource.DominantResourceCalcul\xe2\x80\x8c\xe2\x80\x8bator"\n
Run Code Online (Sandbox Code Playgroud)\n\n

为了使此属性适用,您必须重新启动纱线

\n\n
 sudo  hadoop-yarn-resourcemanager stop\n
Run Code Online (Sandbox Code Playgroud)\n\n

重新启动纱线

\n\n
 sudo  hadoop-yarn-resourcemanager start \n
Run Code Online (Sandbox Code Playgroud)\n\n

当你的作业提交后,可以看到yarn和spark-ui

\n\n

在 Yarn 中你会看到更多的执行器核心

\n