04.17 Spark Streaming如何讀Kafka數據 Hbase如何設計表

spark rdd 怎麼分區寬依賴和窄依賴

Spark Streaming如何讀Kafka數據 Hbase如何設計表

  • 寬依賴:父RDD的分區被子RDD的多個分區使用。例如 groupByKey、reduceByKey、sortByKey等操作會產生寬依賴,會產生shuffle。

  • 窄依賴:父RDD的每個分區都只被子RDD的一個分區使用。例如map、filter、union等操作會產生窄依賴

spark streaming如何讀取kafka的數據

Spark Streaming如何讀Kafka數據 Hbase如何設計表

有兩種方式讀取數據。分別是:

  1. Receiver-base方式:使用Kafka的高層次Consumer API來實現。receiver從Kafka中獲取的數據都存儲在Spark Executor的內存中,然後Spark Streaming啟動的job會去處理那些數據。然而,在默認的配置下,這種方式可能會因為底層的失敗而丟失數據。如果要啟用高可靠機制,讓數據零丟失,就必須啟用Spark Streaming的預寫日誌機制(Write Ahead Log,WAL)。該機制會同步地將接收到的Kafka數據寫入分佈式文件系統(比如HDFS)上的預寫日誌中。所以,即使底層節點出現了失敗,也可以使用預寫日誌中的數據進行恢復。

  2. Direct方式:Direct方式用來替代掉使用Receiver接收數據,這種方式會週期性地查詢Kafka,獲得每個topic+partition的最新的offset,從而定義每個batch的offset的範圍。當處理數據的job啟動時,就會使用Kafka的簡單consumer api來獲取Kafka指定offset範圍的數據。

Spark SQL 與 Hvie的關係

Spark SQL並不是直接全部替換Hive,而只是替換了Hive的查詢引擎部分,通過Spark SQL的查詢引擎去操作表或是HDFS上的目錄文件,從而提高了查詢速度。

Spark Streaming如何讀Kafka數據 Hbase如何設計表

Hbase如何設計表

設計原則是:

  1. 寬表指的是行少列多,如果一行數據量過大,可能造成一個HFile放不下。但寬表有行級原子性的優勢。高表指的是行多列少,Hbase只能按行分片,因此高表更有優勢。

  2. 最好不要定義過多的ColumnFamily,一般來說, 一張表一個ColumnFamily就好。因為Flushing和壓縮是基於Region的。當一個ColumnFamily所存儲的數據達到Flushing閥值時,該表中的其他ColumnFamily可能沒存儲多少數據,也要跟著進行Flushing操作,這將會帶來很多不必要的IO消耗。ColumFamily越多,對性能的影響也就越大。此外,同一個表中不同的ColumnFamily存儲的數據量差別也不要太大,不然有些數據會分散在太多的Region上,會影響檢索效率。

  3. Hbase rowkey的設計:幾個簡單的原則:rowkey唯一,長度一致,能短則短。 然後考慮幾個問題:a.讀取方便:儘可能的把檢索條件存儲於rowkey中,同時訪問的數據,rowkey儘量連接,即可以利用scan指定start和end rowkey直接訪問。 b.提高寫效率:評估業務場景,根據數據分佈情況進行預分區,提高併發度。有些情況下,可以加入散列值,使寫分散到各regionserver,避免單點過載。


分享到:


相關文章: