【问题标题】:Distributing partitions across cluster跨集群分布分区
【发布时间】:2018-05-08 07:49:40
【问题描述】:
在apache spark 中,允许从许多不同来源加载数据集。据我了解spark 集群的计算节点可能与hadoop 用于存储数据的节点不同(我说的对吗?)。更重要的是,我们甚至可以将本地文件加载到spark 作业中。这是主要问题:即使我们将同一台计算机用于hdfs 和spark 目的,spark 在创建RDD 期间是否总是会洗牌所有数据?或者spark 只会尝试以利用现有数据局部性的方式加载数据?
【问题讨论】:
标签:
apache-spark
hadoop
pyspark
bigdata
cluster-computing
【解决方案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 可能会占用更长的时间。