elasticsearch,pyspark,yarn,Python,Apache Spark,elasticsearch,Pyspark,Yarn" /> elasticsearch,pyspark,yarn,Python,Apache Spark,elasticsearch,Pyspark,Yarn" />

Python Spark任务仅在一个执行器上运行

Python Spark任务仅在一个执行器上运行,python,apache-spark,elasticsearch,pyspark,yarn,Python,Apache Spark,elasticsearch,Pyspark,Yarn,大家好首先,我知道这个线程的存在,。 但是,这不是我的情况,因为我正在数据帧上使用重新分区(n)。 基本上,我通过Spark从ElasticSearch索引中获取数据来加载数据帧,如下所示: spark = SparkSession.builder \ .appName("elastic") \ .master("yarn")\ .config('spark.submit.deployMode','client')\ .co

大家好首先,我知道这个线程的存在,。
但是,这不是我的情况,因为我正在数据帧上使用
重新分区(n)

基本上,我通过Spark从ElasticSearch索引中获取数据来加载数据帧,如下所示:

spark = SparkSession.builder \
    .appName("elastic") \
    .master("yarn")\
    .config('spark.submit.deployMode','client')\
    .config("spark.jars",pathElkJar) \
    .enableHiveSupport() \
    .getOrCreate()

es_reader = (spark.read
        .format("org.elasticsearch.spark.sql")
        .option("es.read.field.include",includeFieldsString)
        .option("es.query",q)
        .option("es.nodes",elasticClusterIP)
        .option("es.port",port)
        .option("es.resource",indexNameTable)
        .option("es.nodes.wan.only" , 'true')
        .option("es.net.ssl", 'true')
        .option("es.net.ssl.cert.allow.self.signed", "true")
        .option("es.net.http.auth.user" ,elkUser )
        .option("es.net.http.auth.pass" , elkPassword)
        .option("es.read.metadata", "false")
        .option("es.read.field.as.array.include","system_auth_hostname")
        #.option("es.mapping.exclude", "index")
        #.option("es.mapping.id", "_id")
        #.option("es.read.metadata._id","_id")
        #.option("delimiter", ",")
        #.option("inferSchema","true")
        #.option("first_row_is_header","true")
        )

df = es_reader.load()
默认情况下,纱线正确地将2个执行器添加到我的应用程序中,因为我没有指定其他执行器。从ElasticSearch加载数据时,DF没有分区,因此我运行以下命令来检查执行器的行为:

df = df.repartition(2)
print('Number of partitions: {}'.format(df.rdd.getNumPartitions()))
>> Number of partitions: 2
df.count()
我希望从Spark UI中看到两个执行者都在执行
count()
任务,但是我得到了一个奇怪的行为,我完成了三个任务,没有为一个操作重新划分两个任务,第一个和更长的任务只由一个执行者运行,如下图所示:

如果我从一个已分为两个部分的配置单元表(OS:linux/windows)中保存和加载数据,则一切正常:

在这种情况下,我得到以下结果:

其中,我获得了当前正在执行
count()任务的两个执行者的期望行为。
问题似乎在于
重新分区(n)
,我认为它正确地划分了DF,我使用
DF.rdd.getNumPartitions()
进行了检查,但是没有将执行者之间的工作并行化。
如有必要,我可以在附件中提供任务的详细信息。提前谢谢

df.write.mode('overwrite').format("parquet").partitionBy('OS').saveAsTable('test_executors')
df2 = spark.read.load("path")
df2.count()