Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.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 2.7 Pyspark应用程序仅部分利用dataproc群集资源_Python 2.7_Apache Spark_Hadoop_Google Cloud Dataproc - Fatal编程技术网

Python 2.7 Pyspark应用程序仅部分利用dataproc群集资源

Python 2.7 Pyspark应用程序仅部分利用dataproc群集资源,python-2.7,apache-spark,hadoop,google-cloud-dataproc,Python 2.7,Apache Spark,Hadoop,Google Cloud Dataproc,我的pyspark应用程序在一个106,36 MB的数据集(817.270条记录)上运行一个UDF,使用常规python lambda函数大约需要100小时。我已经生成了一个GoogleDataProc集群,它有20个工作节点,每个节点有8个vCPU。但是,在执行时,总共只使用3个节点和3个vCPU。显然,我希望集群使用我提供的所有资源 生成的数据帧的默认分区数是8。我尝试将其重新分区为100,但集群始终只使用3个节点和3个vCPU。另外,当我运行一个命令来检查spark看到的执行者数量时,它只

我的pyspark应用程序在一个106,36 MB的数据集(817.270条记录)上运行一个UDF,使用常规python lambda函数大约需要100小时。我已经生成了一个GoogleDataProc集群,它有20个工作节点,每个节点有8个vCPU。但是,在执行时,总共只使用3个节点和3个vCPU。显然,我希望集群使用我提供的所有资源

生成的数据帧的默认分区数是8。我尝试将其重新分区为100,但集群始终只使用3个节点和3个vCPU。另外,当我运行一个命令来检查spark看到的执行者数量时,它只有3个

这是执行的pyspark代码:

from pyspark.sql.types import StringType, MapType
from pyspark.sql.functions import udf

customer_names = spark.createDataFrame(customer_names)

embargo_match_udf = udf(lambda x,y: embargoMatch(x,y), MapType(StringType(), StringType()))
customer_names = customer_names.withColumn('JaroDistance', embargo_match_udf('name','customer_code'))



result = customer_names.withColumn('jaro_similarity', customer_names.JaroDistance['max_jaro'])

result.write.format("com.databricks.spark.csv").save('gs://charles-embargo-bucket/sparkytuesday')


这是我的jupyter笔记本上看到的一些火花输出

print(sc) -> <SparkContext master=yarn appName=PySparkShell>
print(result.rdd.getNumPartitions()) -> 8
result = result.repartition(100)
print(result.rdd.getNumPartitions()) -> 100
sc._jsc.sc().getExecutorMemoryStatus().size() -> 3
打印(sc)->
打印(result.rdd.getNumPartitions())->8
结果=结果。重新分区(100)
打印(result.rdd.getNumPartitions())->100
sc._jsc.sc().getExecutorMemoryStatus().size()->3

对于那些对我如何解决问题感兴趣的人:

默认情况下,我的spark上下文假定有两个工作节点,不管我在Google Cloud的Dataproc UI中生成了多少额外的节点。因此,我手动更改了Spark上下文,如下所示:

from pyspark.sql import SparkSession
from pyspark import SparkContext
from pyspark.conf import SparkConf

    sc.stop()
    SparkContext.setSystemProperty('spark.executor.cores', '4')
    SparkContext.setSystemProperty('spark.executor.instances', '5')
    sc = SparkContext("yarn", "embargotest")
    spark = SparkSession.builder.appName('embargotest').getOrCreate()
此外,在将.withColumn函数应用于此数据帧之前,我将customer_names数据集显式分区为20(4个核心x 5个实例)

customer_names = spark.createDataFrame(customer_names).repartition(20)

希望这可以帮助有类似问题的人

此外,您可能希望尝试以下方法,让PySpark通过以下方式动态调整应用程序中的执行器数量:

SparkContext.setSystemProperty("spark.dynamicAllocation.enabled", "true")