在我们的HBase表中,每一行都有一个名为crawl identifier的列。使用MapReduce作业,我们只想处理给定爬网中的任何一行。为了更有效地运行作业,我们为扫描对象提供了一个过滤器(我们希望)将删除除具有给定爬网标识符的行之外的所有行。但是,我们很快发现我们的工作没有处理正确的行数。
我编写了一个测试映射器来简单地计算具有正确爬网标识符的行数,而不使用任何过滤器。它迭代表中的所有行并计算正确的预期行数(~15000)。当我们完成同样的工作时,在扫描对象中添加了一个过滤器,计数下降到~3000。在这两个工作期间或之间没有对表本身的操纵。
由于添加扫描过滤器会导致可见行发生如此剧烈的变化,我们希望我们只是错误地构建过滤器。
我们的MapReduce作业只有一个映射器:
public static class RowCountMapper extends TableMapper<ImmutableBytesWritable, Put>{
public String crawlIdentifier;
// counters
private static enum CountRows {
ROWS_WITH_MATCHED_CRAWL_IDENTIFIER
}
@Override
public void setup(Context context){
Configuration configuration=context.getConfiguration();
crawlIdentifier=configuration.get(ConfigPropertyLib.CRAWL_IDENTIFIER_PROPERTY);
}
@Override
public void map(ImmutableBytesWritable legacykey, Result row, Context context){
String rowIdentifier=HBaseSchema.getValueFromRow(row, HBaseSchema.CRAWL_IDENTIFIER_COLUMN);
if (StringUtils.equals(crawlIdentifier, rowIdentifier)){
context.getCounter(CountRows.ROWS_WITH_MATCHED_CRAWL_IDENTIFIER).increment(1l);
}
}
}
过滤器设置如下:
String crawlIdentifier=configuration.get(ConfigPropertyLib.CRAWL_IDENTIFIER_PROPERTY);
if (StringUtils.isBlank(crawlIdentifier)){
throw new IllegalArgumentException("Crawl Identifier not set.");
}
// build an HBase scanner
Scan scan=new Scan();
SingleColumnValueFilter filter=new SingleColumnValueFilter(HBaseSchema.CRAWL_IDENTIFIER_COLUMN.getFamily(),
HBaseSchema.CRAWL_IDENTIFIER_COLUMN.getQualifier(),
CompareOp.EQUAL,
Bytes.toBytes(crawlIdentifier));
filter.setFilterIfMissing(true);
scan.setFilter(filter);
我们使用了错误的过滤器,还是我们配置错了?
编辑:我们正在考虑按照https://issues.apache.org/jira/browse/HBASE-2198手动添加所有列系列,但我非常确定默认情况下扫描包含所有系列。
答案 0 :(得分:0)
过滤器看起来是正确的,但在某些情况下,可能导致这种情况的一种情况与字符编码有关。您的过滤器使用的是Bytes.toBytes(String),它使用UTF8 [1],而您可能在HBaseSchema中使用本机字符编码,或者当您使用String.getBytes()时编写记录[2] ]。检查crawlIdentifier最初是否使用以下内容写入HBase,以确保过滤器在过滤扫描中比较类似过滤器。
Bytes.toBytes(crawlIdentifier)
[1] http://hbase.apache.org/apidocs/org/apache/hadoop/hbase/util/Bytes.html#toBytes(java.lang.String) [2] http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/String.html#getBytes()