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)
预期有四个任务,但它们都在同一个执行程序上运行!
我正在运行集群,并且可以在资源管理器中提供可用的日志.我只是不知道在哪里看.
该进程具有与您指定的分区一样多的分区,但它以序列化方式进行。
\n\n执行者
\n\n该进程可能会启动默认数量的执行程序。这可以在yarn资源管理器中看到。在您的情况下,所有处理均由一名执行者完成。如果执行器有多个核心,它将并行化工作。在 emr 中,您必须进行此更改才能为执行程序提供超过 1 个核心。
\n\n在我们的例子中具体发生的是,数据很小,因此所有数据都在一个执行器中读取(即使用一个节点)。如果没有以下属性,执行器仅使用单核。因此,所有任务都是序列化的。
\n\n设置属性
\n\nsudo vi /etc/hadoop/conf/capacity-scheduler.xml\nRun 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"\nRun Code Online (Sandbox Code Playgroud)\n\n为了使此属性适用,您必须重新启动纱线
\n\n sudo hadoop-yarn-resourcemanager stop\nRun Code Online (Sandbox Code Playgroud)\n\n重新启动纱线
\n\n sudo hadoop-yarn-resourcemanager start \nRun Code Online (Sandbox Code Playgroud)\n\n当你的作业提交后,可以看到yarn和spark-ui
\n\n在 Yarn 中你会看到更多的执行器核心
\n