0

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に従ってすべての列ファミリを手動で追加することを検討していますが、スキャンにはデフォルトですべてのファミリが含まれていると確信しています。

4

1 に答える 1

0

フィルタは正しいように見えますが、特定の条件下では、これを引き起こすシナリオの 1 つが文字エンコーディングに関連しています。Filter は UTF8 を使用する Bytes.toBytes(String) を使用しています [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 ()

于 2012-06-08T11:11:56.087 に答える