C++ HDFS Client


概念(掃盲)

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM