這幾天我嘗試了hadoop+spark+hive+mysql集成方案:
1. Hadoop: 提供HDFS服務
2. Spark: 實現map-reduce分析算法
3. Hive提供Spark計算的來源數據
4. Mysql存放Hive的元數據,以及計算的最終結果
首先,我把需要處理的原始數據文件臨時存放在hdfs上,文件名是隨機產生,以實現文件名的唯一性。
然後,我通過hive提供的接口,將數據導入到hive中。(注:其實hive是將數據保存在HDFS上自己特定目錄下)
最後,我用spark處理hive上數據,再將最終結果存放到mysql裏面。
這套方案已經可以工作。不過還有一些遺留問題:
Hive的效率:爲了提高hive的處理效率,需要將數據分區。hive分區的實現原理,與我們之前的想法是一致的。Hive也是在hdfs上創建了不同的目錄,來存放分區數據。
但是hive的分區對用戶不是透明的。也就是說,在我們查詢數據時,必須知道是要查詢哪幾個分區,在查詢條件中也必須顯式地指出分區的具體值。
這個與我之前理解的分區接口不太一樣。比如mysql的分區,用戶是不需要在查詢SQL中寫出分區條件的。另外, hive支持的SQL標準也有限。論壇說hive在處理大規模數據時,性能比較差。
Hive的性能比較差,主要是基於hadoop map-reduce方案的原因。Hadoop map-reduce在處理過程中,會把中間結果寫入hdfs,也就是磁盤上。IO效率會成爲系統瓶頸。
星環科技採用Spark來實現處理過程,大量中間結果保存在內存中,這個應該是影響效率最大的部分。
我看了星環科技的方案,他沒有用SparkSQL、Hive這樣的技術,而是自己實現SQL這一層。
參考了網上的一些資料,我們也可以按這個思路試一下:在上層封裝一層SQLParser,在下面可以基於Spark來實現具體動作。
我找了一個開源SQLParser: JSqlParser http://jsqlparser.sourceforge.net/
通過這個工具,可以對用戶提交的SQL進行解析,然後用map-reduce對源數據進行處理,得到用戶想要的結果。
我試用了一下這個工具,可以分析SQL文法。這個文法採用JavaCC描述,可以根據需要進行調整。