用fuse挂载HDFS

2018-08-21  本文已影响0人  shengofbig

背景

在开发系统的时候,我们可能会有把数据备份到HDFS的需求。如果我们自身的系统是用Java开发的,那么直接用HDFS的Java API就可以了;而如果系统本身采用的是C++,那么使用HDFS的C接口就有些头疼了。主要原因在于HDFS的C接口是基于jni的,这意味着我们在部署的时候会不那么的直观。

在这种情况下,用Linux Fuse的功能将HDFS挂在到本地的文件系统下会是一个非常好的选择。在挂载成功后,我们就可以用原生的文件API来访问HDFS了。

此外,webhdfshttpfs也提供了http的方式来访问hdfs,但我觉得从易用性的角度而言,fuse仍旧应该是最好的选择。

如何部署使用fuse

首先,我们在本地起一个hdfs服务,然后用fuse对其进行挂载。

先下载hadoop的预编译包。我选取的是2.8.4,大家可以按照自己的需求选择其他版本。

然后可以参考Apache Hadoop的官方教程,在本地起一个简单的HDFS服务。

如果想利用fuse挂在该hdfs服务,我们需要先编译hdfs fuse的代码:

  1. 下载hadoop的源代码包,为了和刚才选择的预编译包保持一致,我也选择了2.8.4
  2. 解压后,按照解压根目录下的BUILDING.txt来安装编译环境。主要包括jdk, maven, protobuf-compiler, fuse
  3. 编译
mvn clean package -Pnative -DskipTests
  1. 编译好之后,fuse所用到的几个文件散落在几个不同的地方,需要手动把他们放到一起,这样方便使用:
mkdir output
cp hadoop-hdfs-project/hadoop-hdfs-native-client/src/main/native/fuse-dfs/fuse_dfs_wrapper.sh output
cp hadoop-hdfs-project/hadoop-hdfs-native-client/target/native/target/usr/local/lib/libhdfs.so* output
cp hadoop-hdfs-project/hadoop-hdfs-native-client/target/main/native/fuse-dfs/fuse_dfs output
  1. 把fuse编译好之后,就可以使用上面提到的fuse_dfs_wrapper.sh来进行挂载了,命令方式为:
./fuse_dfs_wrapper.sh dfs://127.0.0.1:9000 /mnt/hdfs

脚本的主要作用是设置一些jar包和动态链接库的加载路径,然后调用fuse_dfs的可执行程序。该脚本在使用上有几个点需要注意:

apt-get install fuse libfuse-dev
./fuse_dfs_wrapper.sh dfs://127.0.0.1:9000 /mnt/hdfs -d

如果hdfs开启了kerberos身份认证

上面的例子中,HDFS的服务端用的是simple的认证模式。如果server端开启了kerberos的身份认证,则利用fuse的过程会稍微复杂一些:

上一篇 下一篇

猜你喜欢

热点阅读