概念(掃盲)
google three paper
- Google File System(2003)
- 存儲 - MapReduce(2004)
- 計算 - BigTable(2006)
- 查詢
HDFS
Hadoop Distributed File System,分布式文件系統,它是GFS的開源實現
Hbase
Hadoop database,它是Google Bigtable的開源實現,它是一個適合於非結構化數據存儲的數據庫。類似Google Bigtable利用GFS作為其文件存儲系統,HBase利用HDFS作為其文件存儲系統
MapReduce
占位符,Hadoop MapReduce
Hive
基於Hadoop構建的數據倉庫系統,簡而言之,Apache Hive為Spark / Hadoop數據提供了SQL功能(MapReduce的Java API並不十分容易使用)
HDFS Client C/C++ 實現
C/C++ 版本的 HDFS Client 的使用場景在推薦系統業務中並不多,其主要應用在下載算法模型文件以及參數文件等。
- 官方 libhdfs
- 基於 JNI
- 需要部署 hadoop 安裝包,安裝 JAVA 並配置環境等 - 純 C++ 實現:libhdfs3
- 常用 API 已實現,但如 hdfsCopy 函數沒有實現 - tensorflow 中的實現:hadoop_file_system.cc
- 封裝和綁定了 libhdfs.so 中的 API
- copy、move 相關函數沒有實現 - paddle 中的實現:fs.cc
- 使用 vfork 重新實現了系統調用 popen,然后封裝了調用 hdfs shell 命令
C++ 代碼中執行 hdfs shell 命令時通常使用 system 或者 popen 系統調用,它們會創建新的進程或線程,這(如動態更新模型與參數)對線上運行的服務可能會產生一些性能壓力(具體影響的量化指標與分析待補充)
相比於 JAVA 版 HDFS Client 和 HDFS Shell 命令,官方的 libhdfs 庫只提供了最基本的一些 API,因此基於官方libhdfs庫,hdfs-client 項目實現了如 CopyToLocal 函數,支持拉取單個文件或整個目錄到本地;此外還實現了自動選取 Active 狀態的 NameNode 進行連接
注意 libhdfs.so 是基於 JNI 技術開發,其內部會使用到 libjvm.so,后者在運行過程中會產生一些信號如(SIGSEGV),如果服務中也有注冊信號處理函數則要考慮是否需要鏈接 libjsig.so,可參考:What does “consider using jsig library” mean?;當使用 GDB 調試運行時這些信號也會被捕獲到,解決辦法是設置 "handle SIGSEGV nostop"
參考
Big Data and Google's Three Papers I - GFS and MapReduce
Hadoop vs. HDFS vs. HBase vs. Hive
數據庫與數據倉庫的本質區別是什么
如何用形象的比喻描述大數據的技術生態
HBase 和 Hive 的差別是什么
popen函數的實現
fork+exec 與system,popen區別
fork()、vfork()、clone()的區別
Libhdfs 使用過程中遇到的坑
Strange sigsegv while calling java code from c++ through jni