Cassandra Hadoop map with wide rows忽略切片谓词

时间:2013-07-31 09:27:35

标签: hadoop mapreduce cassandra thrift

我有一个宽行列系列,我试图运行地图减少作业。 CF是按时间排序的事件集合,其中列名称基本上是时间戳。我需要针对CF中的特定日期范围运行MR作业。

当我将widerow属性设置为false运行作业时,预期的列切片将传递给mapper类。但是当我将widerow设置为true时,将处理整个列族,忽略切片谓词。

问题是我必须使用widerow支持,因为切片中的列数可能会变得非常大并且如果一次加载则消耗所有内存。

我发现这个JIRA任务概述了这个问题,但它已被关闭为“无法重现” - https://issues.apache.org/jira/browse/CASSANDRA-4871?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel

我正在运行cassandra 1.2.6并使用cassandra-thrift 1.2.4&在我的罐子里有hadoop-core 1.1.2。 CF已使用CQL3创建。

值得注意的是,无论我是使用SliceRange还是使用setColumn_names()指定列,都会发生这种情况 - 它仍会处理所有列。

任何帮助都将受到大力赞赏。

2 个答案:

答案 0 :(得分:2)

所以这似乎是设计的。在github的word_count示例中,存在以下注释:

// this will cause the predicate to be ignored in favor of scanning everything as a wide row
ConfigHelper.setInputColumnFamily(job.getConfiguration(), KEYSPACE, COLUMN_FAMILY, true);

Urrrrgh。那么公平。看起来很疯狂,但是在使用宽行时无法限制列。

<强>更新

显然,解决方案是使用新的apache.cassandra.hadoop.cql3库。请参阅github上的新示例以供参考:https://github.com/apache/cassandra/blob/trunk/examples/hadoop_cql3_word_count/src/WordCount.java

答案 1 :(得分:0)

很抱歉,要添加评论作为答案但是我们正在尝试做同样的事情,但是你提到你能够“当我在将widerow属性设置为false的情况下运行作业时,预期的一列列被传递到映射器类。“但是当我们将widerow属性设置为false时,我们仍然会遇到错误。你是如何在切片谓词中传递时间戳范围的。

我们使用的CF是事件的时间轴,其中uid为分区键,event_timestamp为复合列。等效的cql是,

CREATE TABLE testcf( uid varchar, evennt_timestamp时间戳, event varchar, PRIMARY KEY(uid,event_timestamp));

映射缩减代码 - 仅发送开始日期和结束日期内的事件(注意:我们可以从时间戳复合列上的cassandra-client和cqlsh进行查询并获取所需的事件)

// Settting widerow to false
        config.setInputColumnFamily(Constants.KEYSPACE_TRACKING, Constants.CF_USER_EVENTS, false); 
DateTime start = getStartDate(); // e.g., July 30th 2013  
        DateTime end = getEndDate();   // e.g., Aug 6th 2013

        SliceRange range = new SliceRange(
ByteBufferUtil.bytes(start.getMillis()),  
ByteBufferUtil.bytes(end.getMillis()), 
false, Integer.MAX_VALUE);
   SlicePredicate predicate = new SlicePredicate().setSlice_range(range);
   config.setInputSlicePredicate(predicate);


 But the above code doesn't work. We get the following error,
java.lang.RuntimeException: InvalidRequestException(why:Invalid bytes remaining after an end-of-component at component0)
at org.apache.cassandra.hadoop.ColumnFamilyRecordReader$StaticRowIterator.maybeInit(ColumnFamilyRecordReader.java:384)

想知道我们是否在切片范围内的开始和结束参数中发送了错误的数据。

任何提示或帮助都很有用。