Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Spark只使用一台工人机器,如果有更多工人机器可用_Python_Apache Spark_Pyspark - Fatal编程技术网

Python Spark只使用一台工人机器,如果有更多工人机器可用

Python Spark只使用一台工人机器,如果有更多工人机器可用,python,apache-spark,pyspark,Python,Apache Spark,Pyspark,我正试图通过Spark将机器学习预测任务并行化。我曾经在其他任务中多次成功地使用Spark,并且以前没有遇到过并行化问题 在这个特定任务中,我的集群有4个worker。我在一个有4个分区的RDD上调用mapPartitions。map函数从磁盘加载一个模型(一个引导脚本分发了执行此操作所需的所有内容;我已经验证了它存在于每个从机上),并对RDD分区中的数据点执行预测 代码运行,但只使用一个执行器。其他执行者的日志显示“已调用关机挂钩”。在不同的代码运行中,它使用不同的机器,但一次只能使用一台 如

我正试图通过Spark将机器学习预测任务并行化。我曾经在其他任务中多次成功地使用Spark,并且以前没有遇到过并行化问题

在这个特定任务中,我的集群有4个worker。我在一个有4个分区的RDD上调用mapPartitions。map函数从磁盘加载一个模型(一个引导脚本分发了执行此操作所需的所有内容;我已经验证了它存在于每个从机上),并对RDD分区中的数据点执行预测

代码运行,但只使用一个执行器。其他执行者的日志显示“已调用关机挂钩”。在不同的代码运行中,它使用不同的机器,但一次只能使用一台

如何让Spark同时使用多台机器

我通过齐柏林飞艇笔记本在亚马逊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')
按预期有四个任务,但它们都在同一个执行器上运行


我已经运行了集群,并且可以在资源管理器中提供可用的日志。我只是不知道该去哪里找。

这里要提到两点(但不确定它们是否能解决您的问题):

  • WholeTextFileInputFormat
    使用扩展了
    CombineFileInputFormat
    WholeTextFileInputFormat
    ,并且由于
    CombineFileInputFormat
    ,它将尝试将小文件组合并到一个分区中。因此,例如,如果您将分区数设置为2,您“可能”会得到两个分区,但这并不保证,这取决于您正在读取的文件的大小
  • wholeTextFiles
    的输出是一个RDD,它在每个记录中包含一个完整的文件(并且每个记录/文件不能被分割,因此它将在单个分区/工作区中结束)。因此,如果您只读取一个文件,那么尽管您在示例中将分区设置为4,但最终还是会将完整文件放在一个分区中

  • 该进程的分区数与您指定的分区数相同,但它是以序列化方式进行的

    执行人

    进程可能会增加默认的执行者数量。这可以在纱线资源管理器中看到。在您的情况下,所有处理都由一个执行者完成。如果执行器有多个核心,它将对作业进行parellize。在emr中,您必须进行此更改,以便为执行器提供多个核心

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

    设置属性

    sudo  vi /etc/hadoop/conf/capacity-scheduler.xml
    
    如图所示设置以下属性

    "yarn.scheduler.capacity.resource-calculator": "org.apache.hadoop.yarn.util.resource.DominantResourceCalcul‌​ator"
    
    为了使此属性适用,必须重新启动纱线

     sudo  hadoop-yarn-resourcemanager stop
    
     sudo  hadoop-yarn-resourcemanager start 
    
    重新开始纺纱

     sudo  hadoop-yarn-resourcemanager stop
    
     sudo  hadoop-yarn-resourcemanager start 
    
    提交作业时,请查看纱线和spark ui


    在“纱线”中,您将看到更多executor的纤芯

    您是否正确设置齐柏林飞艇以使用纱线簇模式?远处,EMR中的齐柏林飞艇以本地模式启动。@Zouzias我以前从未做过任何特殊的事情来让它正确地使用多个工人。我认为模式是正确的。“master”配置值设置为“Thread client”。
    是否为“Thread.scheduler.capacity.resource calculator”:“org.apache.hadoop.Thread.util.resource.DominantResourceCalculator”
    根据需要在
    容量调度器中指定?否则,Thread将不会根据您的作业优化群集使用情况。请输入这一行,所有内容。getNumPartitions并查看有多少个分区available@Achyuth分区的数量是4(或者我传入wholeTextFiles的任何数量),谢谢你的回答。我正在阅读大约2000个文件,似乎有4个分区(至少根据getNumPartitions),我们可以聊一段时间吗,这将是固定的让我们在这里谈谈