2012-04-26 72 views
0

我有幾個HBase表。它們的鍵都不同,但每個鍵都有32位整數所有者ID作爲鍵的一部分。它對每張表格都有不同的抵消,但我知道這些抵消。 現在,我傳入了一個ID集合,我需要將與傳入的所有者有關的數據轉儲到該文件中。即我需要做一些等同於以下SQL語句:在Java中自定義篩選HBase表

SELECT * FROM table WHERE substr(key_field, offset, length) IN (...); 

努力實現我寫了這樣的事情:

public class SubKeyComparator extends BinaryComparator { 

    private Set<Integer> idSet; 
    private int   idLength = 4; 
    private int   idOffset = 0; 

    // getters/setters are here 

    @Override 
    public int compareTo(byte[] value) { 
     return idSet.contains(Bytes.toInt(value, offset, length))? 0 : 1; 
    } 
} 

如預期似乎不工作。 它實際上根本不工作。我打開表,當我試圖讓

ResultScanner scanner = htable.getScanner(scan); 

它等待了一下,然後在 組織拋出顯示java.io.EOFExceptions十幾的org.apache.hadoop.hbase.client.RetriesExhaustedException .apache.hadoop.hbase.client.HConnectionManager $ HConnectionImplementation.getRegionServerWithRetries(HConnectionManager.java:1231)

嘗試在網上找到解決方案或瞭解HBase源代碼出了什麼問題並沒有產生任何顯着結果。 如果我不把我的過濾器插入掃描對象,一切工作正常。

如果有人知道什麼是錯的或做了類似的事情,您的幫助將不勝感激。

+0

你知道,即使你得到這個工作,它將是非常低效的 - 即通過所有者ID不是密鑰最左邊部分的表中的每一行 – 2012-04-27 04:46:33

+0

是的,我知道它。不幸的是,它仍然需要完成。 – Gary 2012-04-27 16:27:35

回答

2

首先要注意的是,你已經實現了一個比較器,不是過濾器。如果你真的想要一個過濾你需要做的是延長org.apache.hadoop.hbase.filter.FilterBase

如果你看看HBase的日誌,您可能會看到類似以下內容:

2012-09-20 16:55:27,913 ERROR org.apache.hadoop.hbase.io.HbaseObjectWritable: Can't find class com.mycompany.project.MyCustomComparator 
java.lang.ClassNotFoundException: com.mycompany.project.MyCustomComparator 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202) 
    {lines removed for brevity} 
2012-09-20 16:55:27,913 ERROR org.apache.hadoop.hbase.io.HbaseObjectWritable: Error in readFields 
java.io.IOException: Can't find class com.mycompany.project.MyCustomComparator 
    at org.apache.hadoop.hbase.io.HbaseObjectWritable.readObject(HbaseObjectWritable.java:514) 
    {lines removed for brevity} 
Caused by: java.lang.ClassNotFoundException: com.mycompany.project.MyCustomComparator 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202) 
    {lines removed for brevity} 
    at org.apache.hadoop.hbase.io.HbaseObjectWritable.getClassByName(HbaseObjectWritable.java:549) 
    at org.apache.hadoop.hbase.io.HbaseObjectWritable.readObject(HbaseObjectWritable.java:511) 
    ... 15 more 

這是因爲比較類不是可在HBase服務器的類路徑中找到。

在任何一種情況下,自定義類都需要編譯並部署到所有區域服務器(可能在JAR中)並添加到HBase類路徑中。

+0

是否可以將自定義過濾器與Job jar捆綁在一起(即具有我的映射器,縮減器和主類的相同jar)? – 2014-02-14 20:39:27