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

原文地址:https://www.cnblogs.com/wangzhiyi/p/13619707.html