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