Hadoop Storm-使用压缩写入HDFS

Hadoop Storm-使用压缩写入HDFS,hadoop,hdfs,apache-storm,Hadoop,Hdfs,Apache Storm,我想将进入storm拓扑的所有原始数据存储在HDFS集群中。 这是JSON或二进制数据,以2k/秒的速率传入 我试图使用HDFS螺栓(,但它不允许使用普通HDFS螺栓进行压缩 只能使用序列文件螺栓进行压缩。 我不想使用序列文件,因为我没有真正的密钥 另外,我已经有了Cassandra来存储我的关键/有价值的东西并满足我的请求。 使用Cassandra处理我的原始数据会占用太多的磁盘(开销)(这不是本文讨论的目标) 有人能帮我吗? 我可以用java Hadoop驱动程序客户端来实现吗? 有人有这方

我想将进入storm拓扑的所有原始数据存储在HDFS集群中。 这是JSON或二进制数据,以2k/秒的速率传入

我试图使用HDFS螺栓(,但它不允许使用普通HDFS螺栓进行压缩 只能使用序列文件螺栓进行压缩。 我不想使用序列文件,因为我没有真正的密钥

另外,我已经有了Cassandra来存储我的关键/有价值的东西并满足我的请求。 使用Cassandra处理我的原始数据会占用太多的磁盘(开销)(这不是本文讨论的目标)

有人能帮我吗? 我可以用java Hadoop驱动程序客户端来实现吗?
有人有这方面的代码片段吗?

好的,没有办法像我想要的那样动态压缩。 但我找到了一个解决方案,如果有人需要,我会在这里分享

这个问题不仅与Storm有关,而且是一个更一般的Hadoop问题

我的所有数据都使用HdfsBolt写入:

    RecordFormat format = new DelimitedRecordFormat().withFieldDelimiter("|");

    //Synchronize data buffer with the filesystem every 1000 tuples
    // Need to be configurable
    SyncPolicy syncPolicy = new CountSyncPolicy(1000);

    // Rotate data files when they reach five MB
    // need to be configuration
    FileRotationPolicy rotationPolicy = new FileSizeRotationPolicy(10.0f, FileSizeRotationPolicy.Units.MB);

    // Use default, Storm-generated file names
    FileNameFormat fileNameFormat = new DefaultFileNameFormat().withPath("/datadir/in_progress") ;

    // Instantiate the HdfsBolt
    HdfsBolt bolt = new HdfsBolt()
        .withFsUrl("hdfs://"+dfsHost+":"+dfsPort)
        .withFileNameFormat(fileNameFormat)
        .withRecordFormat(format)
        .withRotationPolicy(rotationPolicy)
        .withSyncPolicy(syncPolicy)
        .addRotationAction(new MoveFileAction().withDestination("/datadir/finished"));
这是给我的螺栓每个执行人一个文件…不容易处理,但没关系:)

然后,我计划使用hadoop流(在namenode上的cron中或类似的方式)进行自动压缩:

这里我还有一个问题: 将一个输入文件压缩到一个存档中。 因此,我的10MB输入文件(每个用于一个worker)正在压缩为一个1MB的gzip(或bzip)->这会产生很多小文件,这在hadoop中是一个问题

为了解决这个问题,我将尝试研究hadoop归档(HAR)功能

我还需要清除/datadir/finished中已经压缩的文件

希望你们能给我反馈 保持联系

问候,,
Bastien

我并不推荐序列文件,但缺少密钥不会阻止您。可以使用NullWritable作为键。
    hadoop jar share/hadoop/tools/lib/hadoop-streaming-2.7.3.jar \
        -Dmapred.reduce.tasks=0 \
        -Dmapred.output.compress=true \
        -Dmapred.compress.map.output=true \
        -Dmapred.output.compression.codec=org.apache.hadoop.io.compress.BZip2Codec \
        -input /datadir/finished \
        -output /datadir/archives \
        -mapper /bin/cat \
        -inputformat org.apache.hadoop.mapred.TextInputFormat \
        -outputformat org.apache.hadoop.mapred.TextOutputFormat