比如:一个300MB的文件,其中包含6条记录,每条记录300/6=50MB,该文件在hdfs上分了3个block,每个block为128MB,如上图,第3、6个记录跨block了。如下图所示。
为了处理改文件,spark在每个数据节点上创建executor,这些executor负责读取自己的数据。
- Block 1 上的Executor 1 读取3条记录作为输入,其中本地读Line1、Line2,本地和远程读Line3
- Block 2 上的Executor 2 读取后3条记录作为输入,其中本地读Line4、Line5,本地和远程读Line5
- Block 3 上的Executor 3 不读取数据
上述的解释可以参考:
https://hadoopi.wordpress.com/2013/05/27/understand-recordreader-inputsplit/
https://www.ae.be/blog-en/ingesting-data-spark-using-custom-hadoop-fileinputformat/