我在我的 4 节点集群上运行相当大的任务。我正在从一个表中读取大约 4 GB 的过滤数据并运行 Naïve Baye 的训练和预测。我的 HBase 区域服务器在一台机器上运行,它与以公平调度模式运行的 spark 集群分开,尽管 HDFS 在所有机器上运行。
执行时,我在集群上的事件任务数量方面遇到了奇怪的任务分配。我观察到,在任何时间点,只有一个事件任务或最多两个任务在一台/两台机器上运行,而另一台则处于空闲状态。我的期望是 RDD 中的数据将在所有节点上进行划分和处理,以进行计数和不同等操作。为什么所有节点都不用于单个作业的大型任务?在单独的机器上安装 HBase 与此有什么关系吗?
最佳答案
一些要检查的东西:
- 假设您正在使用
hadoopFile()
或hadoopRDD()
读取您的数据:考虑设置 [optional]minPartitions
参数使确保分区数等于您要使用的节点数。 - 当您在应用程序中创建其他
RDD
时,请检查这些RDD
的分区数以及数据在它们之间的分布情况。 (有时一个操作可以创建具有相同分区数的RDD
,但会使其中的数据严重不平衡。)您可以通过调用glom()
方法来检查这一点,打印结果RDD
的元素数(分区数),然后遍历它并打印每个数组的元素数。 (这会引入通信,所以不要将其留在您的生产代码中。) RDD
上的许多 API 调用都有用于设置分区数的可选参数,然后是repartition()
和coalesce() 等调用
可以改变分区。使用它们来解决您使用上述技术发现的问题(但有时它会暴露需要重新考虑您的算法。)- 检查您是否确实为所有大数据使用了
RDD
,并且没有意外地在 master 上使用一些大数据结构。
所有这些都假设您遇到的是数据倾斜问题,而不是更严重的问题。这不能保证是真的,但在寻找复杂的东西之前,你需要检查你的数据倾斜情况。数据倾斜很容易蔓延,特别是考虑到 Spark 的灵 active ,它会造成真正的困惑。
关于hadoop - 使用 spark 进行任务调度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26100082/