Hadoop 使用map reduce在cassandra中执行批量加载

Hadoop 使用map reduce在cassandra中执行批量加载,hadoop,mapreduce,cassandra,bulk-load,datastax-enterprise,Hadoop,Mapreduce,Cassandra,Bulk Load,Datastax Enterprise,我没有太多与卡桑德拉合作的经验,所以如果我采用了错误的方法,请原谅 我正在尝试使用map reduce在cassandra中进行批量加载 基本上是单词计数示例 参考: 我已经给出了简单的Hadoop Wordcount映射器示例,并根据上面的示例稍微修改了驱动程序代码和reducer 我也成功地生成了输出文件。现在我的疑问是如何加载到cassandra零件?我的方法有什么不同吗? 请给我一些建议 这是驱动程序代码的一部分 Job Job=新作业(); job.setJobName(getClas

我没有太多与卡桑德拉合作的经验,所以如果我采用了错误的方法,请原谅

我正在尝试使用map reduce在cassandra中进行批量加载

基本上是单词计数示例

参考:

我已经给出了简单的Hadoop Wordcount映射器示例,并根据上面的示例稍微修改了驱动程序代码和reducer

我也成功地生成了输出文件。现在我的疑问是如何加载到cassandra零件?我的方法有什么不同吗?

请给我一些建议

这是驱动程序代码的一部分

Job Job=新作业();
job.setJobName(getClass().getName());
job.setJarByClass(CassaWordCountJob.class);
Configuration=job.getConfiguration();
conf.set(“cassandra.output.keyspace”、“test”);
conf.set(“cassandra.output.columnfamily”、“words”);
conf.set(“cassandra.output.partitioner.class”,“org.apache.cassandra.dht.RandomPartitioner”);
conf.set(“cassandra.output.thrift.port”,“9160”);//违约
conf.set(“cassandra.output.thrift.address”,“localhost”);
conf.set(“mapreduce.output.bulkoutputformat.streamthrottlembits”,“400”);
setMapperClass(CassaWordCountMapper.class);
job.setMapOutputKeyClass(Text.class);
setMapOutputValueClass(IntWritable.class);
setInputPaths(作业,新路径(args[0]);
job.setReducerClass(CassaWordCountReducer.class);
setOutputPath(作业,新路径(“/home/user/Desktop/test/cassandra”);
MultipleOutputs.addNamedOutput(作业“reducer”、BulkOutputFormat.class、ByteBuffer.class、List.class);
返回作业。等待完成(true)?0 : 1;
映射器与普通的wordcount映射器相同,它只是标记并发出单词1

减速器类的形式为

公共类CassaWordCountReducer扩展
减速器{
@凌驾
公共void reduce(文本键、Iterable值、上下文)
抛出IOException、InterruptedException{
List columnsToAdd=new ArrayList();
整数字数=0;
for(可写入值:值){
wordCount+=value.get();
}
Column countCol=新列(ByteBuffer.wrap(“count.getBytes()));
countCol.setValue(ByteBuffer.wrap(wordCount.toString().getBytes());
countCol.setTimestamp(new Date().getTime());
ColumnOrSuperColumn wordCosc=新ColumnOrSuperColumn();
wordCosc.setColumn(countCol);
突变计数mut=新突变();
countMut.column_或_supercolumn=wordCosc;
columnsToAdd.add(countMut);
write(ByteBuffer.wrap(key.toString().getBytes()),columnsToAdd);
}
}

要批量装载到卡桑德拉,我建议查看。基本上,批量装载需要做两件事:

  • 您的输出数据本机不适合Cassandra,您需要将其转换为SSTables
  • 一旦有了SSTables,就需要能够将它们流式传输到Cassandra中。当然,您不想简单地将每个SSTable复制到每个节点,您只想将数据的相关部分复制到每个节点
在您使用
BulkOutputFormat
时,它应该在幕后使用
sstableloader
完成所有这些工作。我从未将它与
多输出一起使用过,但它应该可以正常工作

我认为您案例中的错误在于您没有正确使用
multipleoutput
:您仍然在执行
上下文。编写
,而此时您确实应该写入
multipleoutput
对象。按照您现在的操作方式,由于您正在写入常规的
上下文
,它将被默认的输出格式
TextOutputFormat
拾取,而不是您在
多输出
中定义的格式。有关如何在减速器中使用
多路输出的详细信息

一旦您按照定义写入正确的输出格式
BulkOutputFormat
,您的SSTables应该会被创建,并从集群中的每个节点流式传输到Cassandra—您不需要任何额外的步骤,输出格式将为您处理


此外,我还建议您看看,他们在哪里也解释了如何使用
BulkOutputFormat
,但他们使用的是
ConfigHelper
,您可能想看看它,以便更轻松地配置您的Cassandra端点。

上面的代码中有什么不起作用,您遇到了什么错误?嗨,Charles,我不确定对卡桑德拉的写操作。因为我已经指定了输出位置,所以我得到了一个文件输出。我的问题是-我们是否需要执行其他操作才能将此文件加载到cassandra?与HBase一样,我们也会-LoadIncrementalHFiles loadHfile=新的LoadIncrementalHFiles(配置);loadHfile.doBulkLoad(新路径(resourcePath),hTable);不,你不必将文件加载到cassandra。这就是OutputFormat的用途。您确定使用的是multiple outputformat吗?我已经根据前面的讨论对reducer进行了更改-multipleOutputs.write(ByteBuffer.wrap(key.toString().getBytes()),columnsToAdd,“reducer”);这就是新代码的样子。即使现在数据也没有被插入到Cassandra中,也没有显示任何错误或异常。虽然我没有执行任何上下文写入,但我在我的输出路径reducer-r-00000Words-r-00000中得到两个输出文件,第二个文件是空白文本文件,第一个文件是文本文件,内容如下java.nio.HeapByteBuffer[pos=0 lim=1 cap=1][Mutation(列或超级列:列或超级列(列:列(名称:63 6F 75 6E 74,值:31,时间戳:1360125545574))]java.nio.HeapByteBuffer[pos=0 lim=4 cap=4][Mutation(列或超级列:列(名称:63 6F 75 6E 74,值:31,时间戳:1360125545586))]