您的位置:首页 > 数码常识数码常识
解析Spark读取hdfs的文件如何分区(spark读取hdfs文件)
2025-05-13人已围观
解析Spark读取hdfs的文件如何分区(spark读取hdfs文件)
spark读取hdfs的文件是怎么分区的,读取代码如下:
spark读取hdfs文件
闪闪发光的星星灰尘散景背景上的足迹
一.分析
spark读取hdfs的文件分区跟hadoop的分区完全相同,因为底层使用的就是Hadoop的TextInputFormat,考虑两内容:
1)关于文件分区数量计算:
指定的预分区数量是最小分区数量,如:代码中的参数3。
真正的分区计算: 每个分区字节数=文件字节数/预分区数量
如果没有整除,判断余数是否大于分区字节数 * 0.1,如果大于则会新增一个分区,剩余的放在这个分区。否则不会新加分区,把余数放到最后一个分区里。
2)分区数据如何读取:
分区读取数据是按行读取,但是会考虑文件的偏移量(offset)的设置。虽然第一个分区字节数不包含一整行,但是会读取一整行。当某个分区的偏移量全被之前的分读走了,这个分区就是空的。
注意:
1.当位移量读取了回撤换行,会把下一行的数据也会读取。
2.当读取多个文件时,会把所有文件字节加起来计算分区,但是读取的时候不会夸文件读取。
二.代码分析
1)读取文件数据时,数据是按照Hadoop文件读取的规则进行切片分区,而切片规则和数据读取的规则有些差异,具体Spark核心源码如下,FileInputFormat类中的方法:
public InputSplit[] getSplits(JobConf job, int numSplits)
throws IOException {
long totalSize=0; // compute total size
for (FileStatus file: files) {// check we have valid files
if (file.isDirectory()) {
throw new IOException("Not a file: "+ file.getPath());
}
totalSize +=file.getLen();
}
long goalSize=totalSize / (numSplits==0 ? 1 : numSplits);
long minSize=Math.max(job.getLong(org.apache.hadoop.mapreduce.lib.input.
FileInputFormat.SPLIT_MINSIZE, 1), minSplitSize);
...
for (FileStatus file: files) {
...
if (isSplitable(fs, path)) {
long blockSize=file.getBlockSize();
long splitSize=computeSplitSize(goalSize, minSize, blockSize);
...
}
protected long computeSplitSize(long goalSize, long minSize,long blockSize) {
return Math.max(minSize, Math.min(goalSize, blockSize));
2) 分区数据读取的代码LineReader
三案例分析
案例:读取文件重新分区,再写入到文件
代码:
四.总结
spark读取hdfs文件分区比较复杂,需要仔细研究研究。
上面就是小居数码小编今天给大家介绍的关于(spark读取hdfs文件)的全部内容,希望可以帮助到你,想了解更多关于数码知识的问题,欢迎关注我们,并收藏,转发,分享。
94%的朋友还想知道的:
分割pdf文件最简单的方法(怎样分割pdf文件)
pdf文件里面的文字修改方法(pdf里面的文字如何修改)
教你5招解决方法(微信文件过期怎么办)
微信聊天记录电脑文件夹位置说明(微信聊天记录在电脑哪个文件夹)
154768
spark读取hdfs的文件是怎么分区的,读取代码如下:
spark读取hdfs文件
闪闪发光的星星灰尘散景背景上的足迹
一.分析
spark读取hdfs的文件分区跟hadoop的分区完全相同,因为底层使用的就是Hadoop的TextInputFormat,考虑两内容:
1)关于文件分区数量计算:
指定的预分区数量是最小分区数量,如:代码中的参数3。
真正的分区计算: 每个分区字节数=文件字节数/预分区数量
如果没有整除,判断余数是否大于分区字节数 * 0.1,如果大于则会新增一个分区,剩余的放在这个分区。否则不会新加分区,把余数放到最后一个分区里。
2)分区数据如何读取:
分区读取数据是按行读取,但是会考虑文件的偏移量(offset)的设置。虽然第一个分区字节数不包含一整行,但是会读取一整行。当某个分区的偏移量全被之前的分读走了,这个分区就是空的。
注意:
1.当位移量读取了回撤换行,会把下一行的数据也会读取。
2.当读取多个文件时,会把所有文件字节加起来计算分区,但是读取的时候不会夸文件读取。
二.代码分析
1)读取文件数据时,数据是按照Hadoop文件读取的规则进行切片分区,而切片规则和数据读取的规则有些差异,具体Spark核心源码如下,FileInputFormat类中的方法:
public InputSplit[] getSplits(JobConf job, int numSplits)
throws IOException {
long totalSize=0; // compute total size
for (FileStatus file: files) {// check we have valid files
if (file.isDirectory()) {
throw new IOException("Not a file: "+ file.getPath());
}
totalSize +=file.getLen();
}
long goalSize=totalSize / (numSplits==0 ? 1 : numSplits);
long minSize=Math.max(job.getLong(org.apache.hadoop.mapreduce.lib.input.
FileInputFormat.SPLIT_MINSIZE, 1), minSplitSize);
...
for (FileStatus file: files) {
...
if (isSplitable(fs, path)) {
long blockSize=file.getBlockSize();
long splitSize=computeSplitSize(goalSize, minSize, blockSize);
...
}
protected long computeSplitSize(long goalSize, long minSize,long blockSize) {
return Math.max(minSize, Math.min(goalSize, blockSize));
2) 分区数据读取的代码LineReader
三案例分析
案例:读取文件重新分区,再写入到文件
代码:
四.总结
spark读取hdfs文件分区比较复杂,需要仔细研究研究。
上面就是小居数码小编今天给大家介绍的关于(spark读取hdfs文件)的全部内容,希望可以帮助到你,想了解更多关于数码知识的问题,欢迎关注我们,并收藏,转发,分享。
94%的朋友还想知道的:
分割pdf文件最简单的方法(怎样分割pdf文件)
pdf文件里面的文字修改方法(pdf里面的文字如何修改)
教你5招解决方法(微信文件过期怎么办)
微信聊天记录电脑文件夹位置说明(微信聊天记录在电脑哪个文件夹)
154768
很赞哦! ()
下一篇:返回列表