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