首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >火花纱簇仍未得到充分利用

火花纱簇仍未得到充分利用
EN

Stack Overflow用户
提问于 2018-05-25 04:49:07
回答 1查看 481关注 0票数 0

使用Microsoft,我有一个包含2个主节点和50个工作节点的集群。所有节点都有8个核心和64 GB内存。

我正在运行一个火花-提交的工作使用电火花。我的Python代码中最相关的部分是创建长度为72的元组的Python arg_list。(每个元组大约有6个元素,没有两个元组是相同的。)然后我创建了一个RDD,它有72个分区,

代码语言:javascript
复制
sc = spark.sparkContext
rdd = sc.parallelize(arg_list, len(arg_list))

我的目标是同时处理所有72个分区。处理分区涉及以下内容:

  1. 根据接收到的元组元素的值,从Blob (HDFS)存储中读取两个文件。
  2. 运行一个名为gensim的Python包,使用读取的两个文件的内容执行NLP任务。

为了做到这一点,我提交我的火花-提交工作如下,

代码语言:javascript
复制
spark-submit --master yarn --num-executors 100 --executor-cores 3 --executor-memory 19G /path/to/my/file.py

其思路如下。对两个执行者使用每个工作节点。每个执行器得到3个核,因此每个节点都有8-2*3=2核,用于节点管理器和任何其他开销任务。因为我每个节点可以得到两个执行者,而且我有50个节点,所以我可以得到100个执行者。(我承认集群比本例中需要的要大一些。)

当我运行这段代码时,我可以使用Ambari监视工作节点的活动。我曾预计72/2 =36个工作节点将繁忙(如平均负载所示),而50-36=14个节点将空闲。相反,我看到只有12个节点处于繁忙状态,似乎每个节点都在运行6个进程。

也许这不是巧合,6*12=72,任务的数量。就好像火花/纱线决定忽略我的参数,把我的分区处理塞进尽可能少的节点。

我还注意到,72项任务中的任何一项似乎都需要很长时间才能完成。我说这是因为看到一个典型的任务在串行模式下运行需要3个小时,并且看到我的星火作业运行了6个小时,根本没有输出。

问题

  1. 为什么我只使用50个工作节点中的12个?
  2. 为什么我的代码运行这么慢?

我已经阅读了关于火花提交/亚恩参数的指南,并认为我所写的内容是有意义的。是否有额外的参数设置,我错过了?

EN

回答 1

Stack Overflow用户

发布于 2018-05-25 06:22:23

Spark将根据您正在运行的作业可用的核心总数来处理每个分区。

假设你的火花作业有100个执行器,每个执行器有3个核心。这意味着,假设spark.task.cpus设置为1,您将能够同时处理100x3=300个分区。

spark.task.cpus是为每个任务分配的核数,--executor-cores指定每个执行器的核数。

包含两个执行器的worker节点,进程2x3=6个分区。默认的spark.default.parallelism =12.so 6x12 = 72。

Spark中用于在运行时优化分区数量的两个配置属性如下:

增加默认的并行性

代码语言:javascript
复制
--conf spark.default.parallelism=36 --conf spark.default.parallelism=36

设置spark.task.cpus=2--executor-cores 4 (在submit命令中)。因此,每个节点只处理(4/2 =) 2个分区。在这种情况下,将使用36个节点并行处理数据。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50521738

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档