分享

在集群中,spark从hdfs中是怎么加快读取数据的,另外spark分区在集群中是怎么分布的

在集群中,spark从hdfs中是怎么加快读取数据的?另外spark分区在集群中是怎么分布的?
1、spark从hdfs中读取数据是从各个节点读取各自需要计算的数据块吗?
2、spark对数据分区机制是什么呢,是在master上首先获取到所有数据,然后对数据分区分发到各个slave上吗?还是在slaves上对本机读取的数据块进行分区?

我主要是想弄清楚,在spark的分布式集群中,数据传输或者网络开销主要在哪个部分!!!

已有(2)人评论

跳转到指定楼层
NEOGX 发表于 2018-5-24 13:35:37
在集群中,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数据管理分布图,

rdd.png

在上图中,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消耗比较大一些。当然还有读取数据,输出也是有的。
回复

使用道具 举报

星语心愿 发表于 2018-5-24 21:04:05
NEOGX 发表于 2018-5-24 13:35
在集群中,spark从hdfs中是怎么加快读取数据的?另外spark分区在集群中是怎么分布的?
spark的数据源很多 ...

谢谢你,讲的很透彻
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条