CadoInputFormat中的Hadoop Cassandra宽行

时间:2015-03-08 23:15:46

标签: hadoop cassandra cassandra-2.0

我正在编写一个使用Cassandra(v2.0.11)作为其输入和输出的hadoop作业。

在我的hadoop作业中,我定义了输入列族:

ConfigHelper.setInputColumnFamily(job.getConfiguration(), KEYSPACE, INPUT_COLUMN_FAMILY, WIDE_ROWS);

其中WIDE_ROWS=true。我还将CqlInputFormat设置为阅读课程:

job.setInputFormatClass(CqlInputFormat.class);

CqlInputFormat使用CqlRecordReader撰写的内容(link):

// Because the old Hadoop API wants us to write to the key and value
// and the new asks for them, we need to copy the output of the new API
// to the old. Thus, expect a small performance hit.
// And obviously this wouldn't work for wide rows. But since ColumnFamilyInputFormat
// and ColumnFamilyRecordReader don't support them, it should be fine for now.
public boolean next(Long key, Row value) throws IOException
{
    if (nextKeyValue())
    {
        ((WrappedRow)value).setRow(getCurrentValue());
        return true;
    }
    return false;
}

我完全不明白......当我检查ColumnFamilyRecordReader代码(link)时,它似乎是使用宽行...
CqlInputFormat真的支持宽行吗?你能解释一下吗?

1 个答案:

答案 0 :(得分:0)

我对它进行了调查并意识到CQL“转置”了很宽的行,以便每个列分别被送到map函数(CqlInputFormat运行CQL查询以从cassandra节点获取数据)。

这种方法在处理非常宽的行时不会导致OOM异常,因为CqlInputFormat使用CQL中可用的分页机制。每页只需CqlConfigHelper.getInputCQLPageRowSize列。

不幸的是,在我的情况下,它效率不高,因为我想对每个行键执行“分组依据”操作来计算列。在几千列的循环中递增计数器比仅仅columns.size()(如果存在这种可能性)慢。

更多关于它的内容:
http://www.datastax.com/dev/blog/cql3-for-cassandra-experts https://issues.apache.org/jira/browse/CASSANDRA-3264