FileSplit

WholeFileInputFormat 和WholeFileRecordReader合并小文件

独自空忆成欢 提交于 2020-02-03 14:43:03
如果不希望文件被切分,例如判断文件中记录是否有序,可以让minimumSize值大于最大文件的大小,但是文件的大小不能超过blockSize,或者重写FileInputFormat方法isSplitable()返回为false。下面介绍将多个小文件合成一个大的序列文件的例子: 1) 自定义完整文件输入处理类如下: Public class WholeFileInputFormat extends FileInputFormat<NullWritable, ByteWritable> { @override//不得分片 protected boolean isSplitable(JobContext context,Path file){return false;} @override public RecordReader<NullWritable,BytesWritable> createRecordReader ( InputSplit split,TaskAttemptContext context )throws IOException,InterruptedException { WholeFileRecordReader reader=new WholeFileRecordReader(); reader.initialize(split,context);

通过SequenceFile实现合并小文件(调优技能)

时间秒杀一切 提交于 2019-12-31 02:07:01
文章目录 0x00 文章内容 0x01 通过SequenceFile合并小文件 1. 准备工作 2. 完整代码 0x02 检验结果 1. 启动HDFS和YARN 2. 执行作业 3. 查看执行结果 0xFF 总结 0x00 文章内容 通过SequenceFile合并小文件 检验结果 说明:Hadoop集群中,元数据是交由NameNode来管理的,每个小文件就是一个split,会有自己相对应的元数据,如果小文件很多,则会对内存以及NameNode很大的压力,所以可以通过合并小文件的方式来进行优化。合并小文件其实可以有两种方式:一种是通过Sequence格式转换文件来合并,另一种是通过CombineFileInputFormat来实现。 此处选择SequeceFile类型是因为此格式为二进制格式,而且是key-value类型,我们在合并小文件的时候,可以利用此特性,将每个小文件的名称做为key,将每个小文件里面的内容做为value。 0x01 通过SequenceFile合并小文件 1. 准备工作 a. 我的HDFS上有四个文件: [ hadoop - sny @master ~ ] $ hadoop fs - ls / files / Found 4 items - rw - r -- r -- 1 hadoop - sny supergroup 39 2019 - 04 - 18

Hadoop 中 FileSplit (文件分割器)的简单使用

让人想犯罪 __ 提交于 2019-12-11 09:34:24
FileSplit 分析 FileSplit类继承于InputSplit 属性和方法: 代码使用详解: package com.njbdqn.test ; import org.apache.hadoop.mapred.SplitLocationInfo ; import org.apache.hadoop.mapreduce.lib.input.FileSplit ; import java.io.IOException ; /** * @Author: Stephen * @Date: 2019/12/10 23:16 * @Content: */ public class FileSplitTest { public static void main ( String [ ] args ) throws IOException { FileSplit fs = new FileSplit ( ) ; String pathname = fs.getPath ( ) .getName ( ) ; //获取目录名字 int depth = fs.getPath ( ) .depth ( ) ; //获取目录深度 fs.getClass ( ) ; //获取当前类 long length = fs.getLength ( ) ; //获取文件长度 SplitLocationInfo

Shell学习五-分割文件和提取文件名扩展名

橙三吉。 提交于 2019-12-07 00:19:39
临时文件命名与随机数 mktemp -d -u 分割文件和数据 split只能根据文件大小和行数分割文件 将文件分割成20k大小的文件块 split -b 20k testsplit.file 指定文件前缀名 split [COMMAND_ARGS] PREFIX split -b 20k testsplit.file split_file 文件行数指定-l no_of_lines split -l 100000 testsplit.file 删除临时文件 find ./ -type f -name "split_file*" -print0 | xargs -0 rm -f csplit是split工具的一个变体。split只能够根据数据大小或行数分割文件,而csplit 可以根据文本自身的特点进行分割 切分文件名 名称.扩展名 %操作符 提取名称 操作符%使用.*从右向左执行非贪婪匹配(.txt) 操作符%%则用.*从右向左执行贪婪匹配(.fun.book.txt) file_jpg="sample.jpg" name=${file_jpg%.*} echo File name is :$name # 操作符 提取后缀 操作符#用*.从左向右执行非贪婪匹配(hack)。 extension=${file_jpg#*.} echo Extension is: jpg VAR

Spark Parquet file split

时间秒杀一切 提交于 2019-12-04 14:02:58
在实际使用 spark + parquet 的时候, 遇到了两个不解的地方: 我们只有一个 parquet 文件(小于 hdfs block size), 但是 spark 在某个 stage 生成了4个 tasks 来处理. 4个 tasks 中只有一个 task 处理了所有数据, 其他几个都没有处理数据. 这两个问题牵涉到对于 parquet spark 是如何来进行切分 partitions, 以及每个 partition 要处理哪部分数据的. 先说结论 , spark 中, parquet 是 splitable 的, 代码见 ParquetFileFormat#isSplitable . 那会不会把数据切碎? 答案是不会, 因为是以 spark row group 为最小单位切分 parquet 的, 这也会导致一些 partitions 会没有数据, 极端情况下, 只有一个 row group 的话, partitions 再多, 也只会一个有数据. 接下来开始我们的源码之旅: 处理流程 1. 根据 parquet 按文件大小切块生成 partitions: 在 FileSourceScanExec#createNonBucketedReadRDD 中, 如果文件是 splitable 的, 会按照 maxSplitBytes 把文件切分, 最后生成的数量, 就是