概念(扫盲)
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