2014-09-29 62 views
3

我在4节点集群上运行相当大的任务。我正在阅读来自单个表格的4 GB过滤数据,并运行NaïveBaye的培训和预测。尽管HDFS在所有机器上运行,但我的HBase地区服务器运行在与公平调度模式下运行的火花群集分离的单台机器上。带火花的任务调度

执行时,根据群集上活动任务的数量,我正在经历奇怪的任务分配。我发现只有一个活动任务或至多两个任务在任何时间点在一台/两台机器上运行,而另一台机器处于空闲状态。我的期望是,RDD中的数据将在所有节点上进行划分和处理,以进行诸如count和distinct等操作。为什么所有节点都不能用于单个作业的大型任务?在单独的机器上安装HBase与这有什么关系?

回答

1

有些事情要检查:

  1. 想必你在你的数据使用hadoopFile()hadoopRDD()阅读:考虑设置[可选] minPartitions参数,以确保分区的数量等于节点的数量,您想用。
  2. 当您在您的应用程序中创建其他RDD时,请检查这些RDD的分区数量以及数据在它们之间的均匀分布情况。 (有时一个操作可以创建一个带有相同分区数的RDD,但可以使其中的数据非常不平衡。)您可以通过调用glom()方法来检查该操作,打印生成的RDD(分区数)的元素数量,然后遍历它并打印每个数组的元素数量。 (这会引入通信,因此请勿将其留在您的生产代码中。)
  3. RDD上的许多API调用都具有用于设置分区数量的可选参数,然后有像repartition()coalesce()这样的调用可以更改分区。使用它们来解决使用上述技术发现的问题(但有时它会暴露出需要重新考虑算法的问题。)
  4. 检查您是否实际使用了所有大数据的RDD s,并且没有意外结束在master上有一些大数据结构。

所有这些都假设你有数据倾斜问题,而不是更险恶的东西。这并不保证是真实的,但是在寻找复杂的东西之前,你需要检查你的数据倾斜情况。数据倾斜很容易蔓延,特别是考虑到Spark的灵活性,它可能会造成混乱。