繁体   English   中英

来自 Elasticsearch 的 Spark 负载:执行程序和分区的数量

[英]Spark load from Elasticsearch: number of executor and partitions

我正在尝试将数据从 Elasticsearch 索引加载到 Spark 中的数据帧中。 我的机器有 12 个 CPU 和 1 个内核。 我在具有以下 Spark 配置的 Jupyter Notebook 上使用 PySpark:

pathElkJar = currentUserFolder+"/elasticsearch-hadoop-"+connectorVersion+"/dist/elasticsearch- spark-20_2.11-"+connectorVersion+".jar"

spark = SparkSession.builder \
    .appName("elastic") \
    .config("spark.jars",pathElkJar) \
    .enableHiveSupport() \
    .getOrCreate()

现在我是否这样做:

df = es_reader.load()

或者:

df = es_reader.load(numPartitions=12)

我从以下打印中得到相同的输出:

print('Master: {}'.format(spark.sparkContext.master))
print('Number of partitions: {}'.format(df.rdd.getNumPartitions()))
print('Number of executors:{}'.format(spark.sparkContext._conf.get('spark.executor.instances')))
print('Partitioner: {}'.format(df.rdd.partitioner))
print('Partitions structure: {}'.format(df.rdd.glom().collect()))

Master: local[*]
Number of partitions: 1
Number of executors: None
Partitioner: None

我期待 12 个分区,我只能通过在数据帧上执行 repartition repartition()来获得。 此外,我认为默认情况下执行器的数量等于 CPU 的数量。 但即使通过执行以下操作:

spark.conf.set("spark.executor.instances", "12")

我无法手动设置执行者的数量。 确实,我为 12 个 CPU 中的每一个都有 1 个内核,但是我应该怎么做呢?

我在创建 Spark 会话后修改了配置文件(没有重新启动这显然不会导致任何更改),通过指定执行程序的数量如下:

spark = SparkSession.builder \
    .appName("elastic") \
    .config("spark.jars",pathElkJar) \
    .config("spark.executor.instances", "12") \
    .enableHiveSupport() \
    .getOrCreate()

我现在正确地获得了 12 个执行者。 我仍然不明白为什么它不自动执行并且加载数据帧时的分区数仍然是 1。我希望它是 12 作为执行程序的数量,对吗?

关于执行程序和分区的问题源于我在本地模式下使用 spark 的事实,该模式允许最多一个执行程序。 使用 Yarn 或其他资源管理器如 mesos 解决了这个问题

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM