我想将我的风暴拓扑中传入的所有原始数据存储在HDFS群集中。 这是JSON或二进制数据,以2k / secs的速率传入。
我试图使用HDFS螺栓(http://storm.apache.org/releases/0.10.0/storm-hdfs.htmlà,但它不允许使用普通的hdfs螺栓进行压缩 只能使用序列文件螺栓进行压缩。 我不想使用序列文件,因为我没有真正的密钥。
另外,我已经有Cassandra存储我的键/值的东西并提供我的请求。 它只需要使用Cassandra为我的原始数据占用太多磁盘(开销)(而不是这个帖子目标来讨论这个)。
任何人都可以帮助我吗? 我可以使用java Hadoop驱动程序客户端来实现吗? 有没有人的代码片段?
答案 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
中已压缩的文件希望我能得到你们的反馈 保持联系
此致 巴斯蒂安