在集群中,spark从hdfs中是怎么加快读取数据的?另外spark分区在集群中是怎么分布的?
spark的数据源很多,比如本地磁盘,hdfs,mysql,nosql,hive等要说如何读取的,那就看源码吧。他的读取函数都是非常简单的。比如
[mw_shl_code=scala,true] val file = sc.textFile(args(0)) //如果是本地文件:file:///home/havstack/xxx 如果是HDFS:hdfs://slave2:9000/data/test/xxx
[/mw_shl_code]
sc.textFile就是读取函数,你说他是怎么读取的,看textFile是如何的实现的。
spark是没有分区的,spark的rdd是有分区的。一般来讲是三个副本,分布三台,当然也可以一台或则两台。
#################
详细看下图
RDD会被划分成很多的分区分布到集群的多个节点上。分区是个逻辑概念,变换前后的新旧分区在物理上可能是同一块内存存储。举例如果是从HDFS上读取文件过来的话,那么默认一个文件就是一个RDD,但是如果这个文件比较大,那么它在HDFS上就会分布式的存储到集群的各个节点,并以64M为物理块存储,那么该RDD默认会将该文件的物理块数量作为RDD的逻辑分区数量既Partition。 如下图所示为RDD数据管理分布图,
在上图中,RDD1具有五个分区,并且分布在四个节点上,RDD2含有三个分区,分布在三个节点上。在物理上,RDD对象实质上是一个元数据结构,存储着Block、Node等的映射信息,以及其他的一些元数据信息。一个RDD就是一组分区,在物理数据存储上,RDD的每个分区对应的就是一个Block,而物理存储的Block可以存储在内存,当内存不够的时候可以存储在磁盘上。
每个Block中存储着RDD中的一部分数据,而对RDD的操作也可以是针对Block的操作例如:mapPartitions()也可以是针对这一整个RDD数据进行操作如:map()操作。
1、spark从hdfs中读取数据是从各个节点读取各自需要计算的数据块吗?
计算块是啥意思?一般来讲,读取先看是否本地有,如果有优先从本地读取
2、spark对数据分区机制是什么呢,是在master上首先获取到所有数据,然后对数据分区分发到各个slave上吗?还是在slaves上对本机读取的数据块进行分区?
数据分区,其实就是把连续的数据划分开来,容易分布式存储。spark是内存存储,楼主是否问的是hadoop的。
我主要是想弄清楚,在spark的分布式集群中,数据传输或者网络开销主要在哪个部分!!!
网络开销shuffle消耗比较大一些。当然还有读取数据,输出也是有的。
|