跨集群分布分区

Posted

技术标签:

【中文标题】跨集群分布分区【英文标题】:Distributing partitions across cluster 【发布时间】:2018-05-08 07:49:40 【问题描述】:

apache spark 中,允许从许多不同来源加载数据集。据我了解spark 集群的计算节点可能与hadoop 用于存储数据的节点不同(我说的对吗?)。更重要的是,我们甚至可以将本地文件加载到spark 作业中。这是主要问题:即使我们将同一台计算机用于hdfsspark 目的,spark 在创建RDD 期间是否总是会洗牌所有数据?或者spark 只会尝试以利用现有数据局部性的方式加载数据?

【问题讨论】:

【参考方案1】:

您可以使用HDFS 作为MapReduce (Hadoop)Spark 引擎的通用底层存储,并使用YARN 之类的集群管理器来执行资源管理。 Spark 将尝试利用数据局部性,并尽可能靠近数据执行任务。

它是这样工作的:如果节点上有数据可以处理,但是CPU没有空闲,Spark会等待一定的时间(由配置参数决定:@ 987654327@ 秒,默认为 3 秒)使 CPU 可用。

如果经过配置的时间后 CPU 仍然没有空闲,Spark 会将任务切换到较低的位置级别。然后它将再次等待spark.locality.wait 秒,如果再次发生超时,它将切换到更低的位置级别。

位置级别定义如下,按从最接近数据到最远数据的顺序排列 (https://spark.apache.org/docs/latest/api/scala/index.html#org.apache.spark.scheduler.TaskLocality$):

PROCESS_LOCAL (data is in the same JVM as the running code)
NODE_LOCAL (data is on the same node)
NO_PREF (data is accessed equally quickly from anywhere and has no locality preference)
RACK_LOCAL (data is on the same rack of servers)
ANY (data is elsewhere on the network and not in the same rack)

也可以单独配置位置级别的等待时间。对于较长的作业,等待时间可以增加到比默认值 3 秒更大的值,因为 CPU 可能会占用更长的时间。

【讨论】:

以上是关于跨集群分布分区的主要内容,如果未能解决你的问题,请参考以下文章

Kafka集群扩展以及重新分布分区

分布式缓存技术redis学习系列——redis高级应用(集群搭建集群分区原理集群操作)

Kafka内核中的分布式机制实现

RabbitMQ集群出现网络分区,可能会丢数据

Apache Flink,逻辑或物理运算符中的Keyby数据分布?

Spark和Java API分区