1

HBaseをスタンドアロンモードで実行していますが、JavaAPIを使用してテーブルをクエリするといくつかの問題が発生しました。このテーブルには数百万のエントリがあり(ただし、数十億に増える可能性があります)、次の行キーメトリックがあります。

<UUID>-<Tag>-<Timestamp>

2つの比較操作フィルターを使用して、時間間隔を表す特定の行範囲をクエリします。

Scan scan = new Scan();
RowFilter upperRowFilter = new RowFilter(CompareOp.LESS,
    new BinaryComparator(securityId + eventType + intervalEnd)
        .getBytes()));

RowFilter lowerRowFilter = new RowFilter(CompareOp.GREATER_OR_EQUAL,
    new BinaryComparator(securityId + eventType + intervalStart)
        .getBytes()));

FilterList filterList = new FilterList();
filterList.addFilter(lowerRowFilter);
filterList.addFilter(upperRowFilter);

scan.setFilter(filterList);
scanner = table.getScanner(scan);
result = scanner.next();

ResultScanner#next()メソッドを呼び出すと、フィルターで指定されたキー範囲の最後の行に到達するまで、すべてが正常に機能します。ResultScannerが最後の行を返すまでに最大40秒かかります。これは、行の範囲の上限よりも字句的に小さいものです。

filterList内のフィルターの順序をから変更すると

filterList.addFilter(lowerRowFilter);
filterList.addFilter(upperRowFilter);

filterList.addFilter(upperRowFilter);
filterList.addFilter(lowerRowFilter);

スキャナーが結果を返し始めるまで最大40秒かかりますが、最後の行を返すのにそれ以上の遅延はないので、遅延はCompareOp.LESS-フィルターに起因すると考えました。

この遅延を回避するために私が知っている唯一の方法は、upperRowFilterを省略し、行キーが範囲外にあるかどうかを手動で確認することですが、インターネットの検索で問題が見つからなかったため、何か問題があるはずです。

私もすでにキャッシュでそれを取り除こうとしましたが、返される行数よりも小さいキャッシュサイズを使用しても何も変更されず、返される行数よりも大きいキャッシュサイズを使用すると遅延が返されますまだそこにありますが、結果が返される前にもう一度。

何がそのような行動を引き起こす可能性があるのか​​、あなたは何か考えがありますか?私はそれを間違っているのですか、それとも私が見逃しているものがありますか?

前もって感謝します!

4

1 に答える 1

1

問題は、スキャナーがテーブル全体をスキャンし、クエリと一致しない結果を破棄していることです。(securityId + eventType + intervalEnd)の停止行を明示的に設定する必要があります。(securityId + eventType + intervalStart)の対応する開始行を設定すると、フィルターはまったく必要なくなり、データセットのサイズに関係なくスキャンが効率的になります。

于 2011-08-24T22:48:38.187 に答える