閱讀與幾百HBase表記錄沒有保存(刷新)HDFS並不出現在火花。然而,被迫衝洗後記錄變得可見通過Hbase殼或係統引發衝洗(當Memstore穿過配置閾值的大小),和任何書麵初始衝洗後立即可見的火花。此外,記錄在衝洗前Memstore Hbase-client掃描的api是立即可見的。
注意:我們不能使用spark-hbase連接器作為模式預先是未知的。因此,我們采取使用newAPIHadoopRDD API
引發閱讀API
@transient val配置:配置= HBaseConfiguration.create () conf.set (“hbase.zookeeper。法定人數”,ZOOKEEPER_QUORUM);conf.set (“hbase.zookeeper.property。clientPort”, ZOOKEEPER_PORT);conf.set (TableInputFormat。spark.sparkContext INPUT_TABLE,“測試”)。名為[TableInputFormat], classOf newAPIHadoopRDD(參看,名為[ImmutableBytesWritable], classOf名為[結果])classOf
我們已經嚐試通過自定義掃描對象設置/取消幾個旗幟但沒有人工作。下麵,我們試圖迫使Hbase掃描Api來讀取replica-0但無濟於事。
/ /函數將掃描對象base64字符串def convertScanToString(掃描:掃描):字符串= {val原型= ProtobufUtil.toScan(掃描)Base64.encodeBytes (proto.toByteArray)} @transient val掃描= new掃描()scan.setReplicaId (0) @transient val scanStr = convertScanToString(掃描)@transient val配置:配置= HBaseConfiguration.create () conf.set (“hbase.zookeeper。法定人數”,ZOOKEEPER_QUORUM);conf.set (“hbase.zookeeper.property。clientPort”, ZOOKEEPER_PORT);conf.set (TableInputFormat。spark.sparkContext INPUT_TABLE,“測試”)。名為[TableInputFormat], classOf newAPIHadoopRDD(參看,名為[ImmutableBytesWritable], classOf名為[結果])classOf
Hbase後客戶端閱讀API檢索記錄存儲在Memstore前衝。
val表= connection.getTable (TableName.valueOf (Bytes.toBytes(“測試”)))= val掃描表。scan.asScala getScanner(新掃描())。foreach(結果= > {println(結果)})
@Manjunath Shettar:
看來,相關的問題是事實,HBase表中的記錄尚未刷新到HDFS,仍然存儲在Memstore。火花的newAPIHadoopRDD API從HBase表讀取數據通過HBase的TableInputFormat,它隻讀取數據持久化(刷新)HDFS。
記錄成為可見的原因被迫衝洗後通過HBase殼或system-triggered平現在是數據持久化到HDFS, TableInputFormat可以讀取。同樣,任何數據寫在最初的衝洗是立即可見的火花,因為它是堅持TableInputFormat HDFS,可以閱讀。
HBase-client的掃描API可以從Memstore讀取數據之前衝洗,因為它直接訪問服務器Memstore HBase地區,繞過需要數據持久化到HDFS。
對於試圖強迫HBase掃描API來讀取replica-0,目前尚不清楚如何replica-0 HBase集群配置設置,是否正確配置和運行。如果replica-0沒有正確配置,然後設置replicaId 0在掃描對象可能沒有任何效果。如果replica-0正確配置,然後還可能需要配置HBase端讀取replica-0, HBase文檔中描述。
至於問題無法使用Spark-HBase連接器,因為模式預先是未知的,一種選擇是動態地推斷出前幾行數據的模式使用火花的DataFrame API。一旦推斷的模式,它可以用來閱讀剩下的數據從HBase表。另一個選擇是手動使用火花的StructType API指定模式,基於已知的HBase表的結構。