HBase テーブルでは、各行にクロール識別子と呼ばれる列があります。MapReduce ジョブを使用して、特定のクロールからの行のみを一度に処理したいと考えています。ジョブをより効率的に実行するために、特定のクロール識別子を持つ行を除くすべての行を削除するフィルターをスキャン オブジェクトに与えました。しかし、ジョブが正しい数の行を処理していないことがすぐにわかりました。
フィルターを使用せずに、正しいクロール ID を持つ行数を単純にカウントするテスト マッパーを作成しました。テーブル内のすべての行を反復処理し、正しい予想される行数 (~15000) をカウントしました。同じジョブを取得してスキャン オブジェクトにフィルターを追加すると、カウントは 3000 まで減少しました。これら 2 つのジョブの間または実行中に、テーブル自体の操作は行われませんでした。
スキャン フィルターを追加すると、表示される行が劇的に変化したため、単純にフィルターを誤って作成したと考えられます。
私たちの MapReduce ジョブは、1 つのマッパーを備えています。
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に従ってすべての列ファミリを手動で追加することを検討していますが、スキャンにはデフォルトですべてのファミリが含まれていると確信しています。