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