风暴 - 使用压缩写入HDFS

时间:2017-04-18 12:57:54

标签: hadoop hdfs apache-storm

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

我试图使用HDFS螺栓(http://storm.apache.org/releases/0.10.0/storm-hdfs.htmlà,但它不允许使用普通的hdfs螺栓进行压缩 只能使用序列文件螺栓进行压缩。 我不想使用序列文件,因为我没有真正的密钥。

另外,我已经有Cassandra存储我的键/值的东西并提供我的请求。 它只需要使用Cassandra为我的原始数据占用太多磁盘(开销)(而不是这个帖子目标来讨论这个)。

任何人都可以帮助我吗? 我可以使用java Hadoop驱动程序客户端来实现吗? 有没有人的代码片段?

1 个答案:

答案 0 :(得分:0)

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

这个问题不仅与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或类似的东西)安排自动压缩:

    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

这里我还有一个问题: 一个输入文件压缩到一个存档中。 所以我的10MB输入文件(每个工作一个)压缩成1MB的一个gzip(或bzip) - >这产生了很多小文件,这在hadoop中是个问题

要解决这个问题,我将尝试查看hadoop存档(HAR)功能。

我还需要清除/ datadir / finished

中已压缩的文件

希望我能得到你们的反馈 保持联系

此致 巴斯蒂安