知识点
相关文章
更多最近更新
更多Hadoop SequenceFile 文件写入及各式分析
2019-03-28 13:37|来源: 网络
Hadoop SequenceFile 是一个由二进制形式key/value的字节流组成的存储文件,SequenceFile可压缩可切分,非常适合hadoop文件存储特性,SequenceFile的写入由SequenceFile.Writer来实现, 根据压缩类型SequenceFile.Writer又派生出两个子类SequenceFile.BlockCompressWriter和SequenceFile.RecordCompressWriter, 压缩方式由SequenceFile类的内部枚举类CompressionType来表示,定义了三种方式
不采用压缩:
CompressionType.NONE
记录级别的压缩:
CompressionType.RECORD
块级别的压缩:
CompressionType.BLOCK
使用时可以通过参数: io.seqfile.compression.type=[NONE|RECORD|BLOCK] 来指定具体的压缩方式.
写入SequenceFile时通过创建一个SequenceFile.Writer来实现SequenceFile.Writer writer = SequenceFile.createWriter然后调用writer.append(key, value);方法进行数据写入, 根据指定的压缩方式不同,写入时SequenceFile组织内部结构也有所不同.
SequenceFile Header在三种压缩方式都是相同的,在创建SequenceFile.Writer对象时在构造函数中依次调用
initializeFileHeader(); writeFileHeader(); finalizeFileHeader();
来完成文件头的写入.
SequenceFile文件头格式如下:
SequenceFile 内容,根据指定的压缩方式不同,组织结构也有所不同,当压缩方式指定为CompressionType.NONE,CompressionType.RECORD时,文件内容由 同步标记+RECODE 组成,当压缩方式指定为CompressionType.BLOCK时,文件内容由 同步标记+BLOCK 组成
同步标记+RECODE:
输出流会维护一个上次插入同步点时的记录位置(lastSyncPos,初始为0),每次append(key, value)时都会检查当前输出流pos与上次同步点之间的距离是否大于等于SYNC_INTERVAL, 如果是, 就会插入一个同步点(sync)
CompressionType.NONE 时 记录信息不压缩
CompressionType.RECORD 时 记录信息压缩(单条记录压缩)
同步标记+BLOCK:
BlockCompressWriter内部维护keyBuffer,valBuffer,每次append(key, value)时会把key和value对象序列化到keyBuffer和valBuffer, 并判断keyBuffer和valBuffer相加后的size是否大于等于compressionBlockSize, 如果是则插入一个同步点,并刷出数据流成一个block.
每个block与block之间都会有一个同步点(sync)
一个block内会有多条记录组成,压缩是作用在block之上的,比RECODE方式能获得更好的压缩比
compressionBlockSize可以通过io.seqfile.compress.blocksize=size参数指定,默认值是1000000
相关问答
更多-
答案是将输入格式指定为Hadoop的命令行参数。 -inputformat SequenceFileAsTextInputFormat 很有可能你需要SequenceFile作为文本,但如果更合适的话,还有SequenceFileAsBinaryInputFormat 。 The answer to this is to specify the input format as a command line argument to Hadoop. -inputformat SequenceFileAsText ...
-
您不需要手动读取序列文件。 只需将输入格式类设置为序列文件即可: job.setInputFormatClass(SequenceFileInputFormat.class); 并将输入路径设置为包含序列文件的目录。 FileInputFormat.setInputPaths(
); 您需要注意Mapper类的参数化类型上输入的(Key,Value)类型,以匹配序列文件中的(键,值)元组。 You do not ... -
与任何其他InputStream一样,FSDataInputStream不是要序列化的。 什么序列化字节流上的“迭代器”应该做什么? 您最可能想要做的是将文件的内容存储为值。 例如,您可以将值类型从FsDataInputStream切换到BytesWritable,只需从FSDataInputStream中获取所有字节。 为此目的使用Key / Value SequenceFile的一个缺点是每个文件的内容必须适合内存。 对于小文件可能没什么问题,但你必须知道这个问题。 我不确定你到底想要实现什么,但也许你 ...
-
我也遇到了同样的问题,在我的情况下它给出了异常,因为我还没有关闭SequenceFile.Writer对象。 在我的代码中添加了sequenceFileWriter.close()语句时,问题得到了解决。 此外,如果MapReduce程序中的输入是某些先前MapReduce程序的输出,那么您必须显式编写代码以忽略_SUCCESS文件。 PS:我正在使用CHD4 Cloudera Hadoop配置 I got it right. Infact it was not filtering _SUCCESS fil ...
-
SequenceFile.Writer的sync和syncF是什么意思?(What does the sync and syncFs of SequenceFile.Writer means?)[2023-05-22]
应该是。 sync()创建一个同步点。 正如Tom White(Cloudera)的“Hadoop- The Definitive Guide”一书中所述 同步点是流中的一个点,如果读取器“丢失”,可以用来与记录边界重新同步 - 例如在寻找流上的任意位置之后。 现在syncFS()的实现非常简单: public void syncFs() throws IOException { if (out != null) { out.sync(); ... -
好吧,最终我不可能做我想做的事。 所以我切换到HBase ,我将文件存储为表中的行。 现在表现还可以,而且一切似乎都是以正确的方式进行的。 Well, in the end it's not possible to do what I wanted. So I switched to HBase and I'm storing files as rows in a table. Now the performance are ok and all seems to go in the right way.
-
生成SequenceFile(Generating a SequenceFile)[2023-09-14]
您只需要一个SequenceFile.Writer ,在链接#4中有解释。 这使您可以将键值对写入文件。 当然,关键和价值取决于您的使用案例。 对于聚类与矩阵分解与协同过滤相比,它完全不相同。 没有一种 SequenceFile格式。 有可能是关键或值将是Mahout Vector 。 知道如何编写Vector是VectorWritable 。 这是用于包装Vector并使用SequenceFile.Writer编写它的类。 你需要查看将消耗它的工作,以确保你传递它所期望的。 例如,对于聚类,我认为键被忽略 ... -
必须为org.apache.commons.configuration.Configuration类包含hadoop-common - * .jar。 把jar作为依赖项。 The hadoop-common-*.jar has to be included for the org.apache.commons.configuration.Configuration class. Put the jar as dependencies.
-
冲突在技术上是可行的,但实际上它们极不可能。 来自http://search-hadoop.com/m/VYVra2krg5t1 : 给定的随机16字节字符串出现在PB级(均匀分布的)数据中的概率约为10 ^ -23。 您的数据中心更有可能被陨石消灭( http://preshing.com/20110504/hash-collision-probabilities )。 Clashes are technically possible, but in reality they are incredibly ...
-
在hadoop中排序sequenceFile时是否有classcastException?(classcastException when sorting sequenceFile in hadoop?)[2022-02-02]
这可能是因为您正在使用旧的map / reduce序列文件类。 而不是使用 -inFormat org.apache.hadoop.mapred.SequenceFileInputFormat -outFormat org.apache.hadoop.mapred.SequenceFileOutputFormat 尝试使用 -inFormat org.apache.hadoop.mapreduce.lib.input.SequenceFileInputFormat; -outFormat org.apac ...