java - 仅一个文件中几个小文件的SequenceFile压缩器

标签 java hadoop hdfs sequencefile

HDFS和Hadoop中的Novell:
我正在开发一个程序,该程序应获取特定目录的所有文件,在这里我们可以找到几个任何类型的小文件。

获取每个文件并在压缩后的SequenceFile中追加,其中键必须是文件的路径,值必须是得到的文件,现在我的代码是:

    import java.net.*;

    import org.apache.hadoop.fs.*;
    import org.apache.hadoop.conf.*;
    import org.apache.hadoop.io.*;
    import org.apache.hadoop.io.compress.BZip2Codec;

public class Compact {
        public static void main (String [] args) throws Exception{
                try{
                        Configuration conf = new Configuration();
                        FileSystem fs =
                                FileSystem.get(new URI("hdfs://quickstart.cloudera:8020"),conf);
                        Path destino = new Path("/user/cloudera/data/testPractice.seq");//test args[1]

                        if ((fs.exists(destino))){
                            System.out.println("exist : " + destino);
                            return;
                        }
                        BZip2Codec codec=new BZip2Codec();

                        SequenceFile.Writer outSeq = SequenceFile.createWriter(conf
                                   ,SequenceFile.Writer.file(fs.makeQualified(destino))
                                   ,SequenceFile.Writer.compression(SequenceFile.CompressionType.BLOCK,codec)
                                   ,SequenceFile.Writer.keyClass(Text.class)
                                   ,SequenceFile.Writer.valueClass(FSDataInputStream.class));

                        FileStatus[] status = fs.globStatus(new Path("/user/cloudera/data/*.txt"));//args[0]
                        for (int i=0;i<status.length;i++){
                                FSDataInputStream in = fs.open(status[i].getPath());


                                outSeq.append(new org.apache.hadoop.io.Text(status[i].getPath().toString()), new FSDataInputStream(in));
                                fs.close();

                        }
                        outSeq.close();
                        System.out.println("End Program");
                }catch(Exception e){
                        System.out.println(e.toString());
                        System.out.println("File not found");
                }
        }
}

但是每次执行后,我都会收到此异常:
java.io.IOException: Could not find a serializer for the Value class: 'org.apache.hadoop.fs.FSDataInputStream'. Please ensure that the configuration 'io.serializations' is properly configured, if you're usingcustom serialization.

文件未找到

我知道错误一定是我正在创建的文件的类型以及我定义要添加到sequenceFile的对象的类型,但是我不知道应该添加哪一个,有人可以帮助我吗?

提前致谢

最佳答案

FSDataInputStream与任何其他InputStream一样,不打算序列化。在字节流上序列化“迭代器”应该做什么?

您最可能想做的是将文件的内容存储为值。例如,您可以将值类型从FsDataInputStream切换为BytesWritable,而只需从FSDataInputStream中获取所有字节即可。为此目的使用键/值序列文件的一个缺点是每个文件的内容必须适合内存。小文件可能很好,但是您必须意识到这一问题。

我不确定您真正要实现的目标,但也许可以避免使用Hadoop Archives这样的方法来重新发明轮子?

关于java - 仅一个文件中几个小文件的SequenceFile压缩器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29685548/

相关文章:

java - 为后台线程从 Hibernate 获取新 session

serialization - 如何将 Kryo 设置为 Writable 的替代品作为 HDFS/Hadoop 中的序列化框架

hadoop - 连接异常 : connect error: No such file or directory when trying to connect to '50010' using importtsv on hbase

java - Hive 在创建表 "Cannot validate serde: com.cloudera.hive.serde.JSONSerDe"时抛出错误

java - Spring 状态机: is it safe to user multiple actions on transition?

java - 带 FAB 的模态 Bottom Sheet

hadoop - 启动 Impala 的问题

hadoop - Datanode处于死状态,因为使用的DFS为100%

hadoop - 如何从HDFS hadoop中的blockName中查找文件

java - 将 JSON 中的多个项目解析为数组