跨集群分布分区
Posted
技术标签:
【中文标题】跨集群分布分区【英文标题】:Distributing partitions across cluster 【发布时间】:2018-05-08 07:49:40 【问题描述】:在apache spark
中,允许从许多不同来源加载数据集。据我了解spark
集群的计算节点可能与hadoop
用于存储数据的节点不同(我说的对吗?)。更重要的是,我们甚至可以将本地文件加载到spark
作业中。这是主要问题:即使我们将同一台计算机用于hdfs
和spark
目的,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 可能会占用更长的时间。
【讨论】:
以上是关于跨集群分布分区的主要内容,如果未能解决你的问题,请参考以下文章
分布式缓存技术redis学习系列——redis高级应用(集群搭建集群分区原理集群操作)