用hadoop中的libhdfs和fuse-dfs构建快速云存储
2011-12-28 17:57
363 查看
安装版本:
OS版本:CentOS 5.4Hadoop版本:0.20.203.0gcc:系统默认4.1.2Jdk:1.6.0.21FUSE:2.7.4
环境需求:automake,autoconf,m4,libtool,pkgconfig,fuse,fuse-devel,fuse-libs。
需要外部下载ant 1.8.2,在apache网站下载即可
安装过程:
#wget http://mirror.bjtu.edu.cn/apache//ant/binaries/apache-ant-1.8.2-bin.zip #unzip apache-ant-1.8.2-bin.zip
#export JAVA_HOME=/usr/java/jdk1.6.0_21
#export HADOOP_HOME=/opt/modules/hadoop/hadoop-0.20.203.0
#export OS_ARCH=amd64
###i386/amd64
#export OS_BIT=64
###32/64
#export ANT_HOME=/root/apache-ant-1.8.2
#export PATH=$PATH:$ANT_HOME/bin
#export LD_LIBRARY_PATH=$JAVA_HOME/jre/lib/$OS_ARCH/server:${HADOOP_HOME}/build/c++/Linux-$OS_ARCH-$OS_BIT/lib:/usr/local/lib:/usr/lib
#yum -y install fuse fuse-devel fuse-libs
#modprobe fuse
####设置环境变量,也可写入profile####
红字部分为其上只变量的选项,根据服务器操作系统版本进行变更。
一、编译libhdfs
然后进入hadoop安装路径运行以下命令
#/root/apache-ant-1.8.2/bin/ant compile-c++-libhdfs -Dlibhdfs=1 -Dcompile.c++=1
#ln -s c++/Linux-$OS_ARCH-$OS_BIT/lib build/libhdfs
这一步是编译libhdfs,因为libhdfs需要交叉编译,直接到src里面编译会报错,所以需要用ant编译。注意OS_ARCH和OS_BIT必须设置,否则会失败。
二、编译fuse-dfs
hadoop 0.20.203.0版本中fuse存在一个bug,需要先修改掉才能继续编译。
打开$HADOOP_HOME/src/contrib/fuse-dfs/src/fuse_connect.c
找到
hdfsFS fs = hdfsConnectAsUser(hostname, port, user, (const char **)groups, numgroups);
修改为
hdfsFS fs = hdfsConnectAsUser(hostname, port, user);
然后运行编译
#/root/apache-ant-1.8.2/bin/ant compile-contrib -Dlibhdfs=1 -Dfusedfs=1
如果编译失败,比较可能的原因是找不到libhdfs,请参看第一步的ln -s。
三、环境配置
然后编辑/etc/fuse.conf,写入以下内容user_allow_other
mount_max=100
编辑$HADOOP_HOME/build/contrib/fuse-dfs/fuse_dfs_wrapper.sh
if [ "$HADOOP_HOME" = "" ]; then
export HADOOP_HOME=/opt/modules/hadoop/hadoop-0.20.203.0
fi
export PATH=$HADOOP_HOME/build/contrib/fuse_dfs:$PATH
for f in ls $HADOOP_HOME/lib/*.jar $HADOOP_HOME/*.jar ; do
export CLASSPATH=$CLASSPATH:$f
done
if [ "$OS_ARCH" = "" ]; then
export OS_ARCH=amd64
fi
if [ "$JAVA_HOME" = "" ]; then
export JAVA_HOME=/usr/java/jdk1.6.0_21
fi
if [ "$LD_LIBRARY_PATH" = "" ]; then
export LD_LIBRARY_PATH=$JAVA_HOME/jre/lib/$OS_ARCH/server:/usr/local/share/hdfs/libhdfs/:/usr/local/lib
fi
./fuse_dfs $@
然后我的整体环境变量如下
#注意下面的用户,尽量不要用root
[hadoop@collect-wzlink-205 fuse-dfs]$export
declare -x G_BROKEN_FILENAMES="1"
declare -x HISTSIZE="1000"
declare -x HOME="/home/hadoop"
declare -x INPUTRC="/etc/inputrc"
declare -x LANG="en_US.UTF-8"
declare -x LESSOPEN="|/usr/bin/lesspipe.sh %s"
declare -x LOGNAME="hadoop"
declare -x LS_COLORS="no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=01;32:*.cmd=01;32:*.exe=01;32:*.com=01;32:*.btm=01;32:*.bat=01;32:*.sh=01;32:*.csh=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tz=01;31:*.rpm=01;31:*.cpio=01;31:*.jpg=01;35:*.gif=01;35:*.bmp=01;35:*.xbm=01;35:*.xpm=01;35:*.png=01;35:*.tif=01;35:"
declare -x MAIL="/var/spool/mail/root"
declare -x OLDPWD="/opt/modules/hadoop/hadoop-0.20.203.0/build/contrib"
declare -x PATH="/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin"
declare -x PWD="/opt/modules/hadoop/hadoop-0.20.203.0/build/contrib/fuse-dfs"
declare -x SHELL="/bin/bash"
declare -x SHLVL="2"
declare -x TERM="linux"
declare -x USER="hadoop"
然后尝试mount
$mkdir /tmp/dfs
$cd $HADOOP_HOME/build/contrib/fuse-dfs
$./fuse_dfs_wrapper.sh dfs://hadoopmaster:9000 /tmp/dfs
port=9000,server=hadoopmaster
fuse-dfs didn't recognize /tmp/dfs,-2(这个问题目前不知如何解决,但不影响使用。)
写出来觉得很简单,其实中间遇到了很多问题。
四、主要问题
1.编译libhdfs,centos5.4默认是ant 1.6.2,结果没编译成功,下载了新版的1.8.2才编译成功
2.编译fuse-dfs,一定要写ln -s c++/Linux-$OS_ARCH-$OS_BIT/lib build/libhdfs,否则就算你把libhdfs.so.0放到/usr/lib或者/usr/local/lib下,也照样会报找不到文件。
3.环境变量一定要设置齐全,否则会有很多莫名其妙的错误。
4.fuse启动过程中,可能会出现mount --no-canonicalize的一个错误,这个问题,对不起,目前我还无解,搞了大半天没搞出来,直接换了台服务器,正常了。
5.fuse启动过程中,出现找不到libjvm.so,需要设置CLASSPATH到jdk的tools.jar,lib/之类的
6.mount可能会出现fusermount: mount failed: Operation not permitted用root将/bin/fusermount和/usr/bin/fusermount用chmod 4777改掉。
7.其他问题可以在tail -f /var/log/messages | grep fuse查看
8.fuse-dfs的debug启动,后面加-d
这样mount的结果是,把HDFS当成本地硬盘使用,速度还是非常可以的。
再一个好处是文件在HDFS里面会保存3份,互为冗余,不会出现文件丢失的现象。
还有个就是访问速度快,HADOOP会将多个服务器上的数据拼成完整数据返回给用户,而服务器越多,每台服务器的访问量就越少,速度就越快。
如果数据交换量大,可以采用我之前写过的多网卡绑定方案增加服务器之间的数据交换。
本文出自 “实践检验真理” 博客,谢绝转载!
OS版本:CentOS 5.4Hadoop版本:0.20.203.0gcc:系统默认4.1.2Jdk:1.6.0.21FUSE:2.7.4
环境需求:automake,autoconf,m4,libtool,pkgconfig,fuse,fuse-devel,fuse-libs。
需要外部下载ant 1.8.2,在apache网站下载即可
安装过程:
#wget http://mirror.bjtu.edu.cn/apache//ant/binaries/apache-ant-1.8.2-bin.zip #unzip apache-ant-1.8.2-bin.zip
#export JAVA_HOME=/usr/java/jdk1.6.0_21
#export HADOOP_HOME=/opt/modules/hadoop/hadoop-0.20.203.0
#export OS_ARCH=amd64
###i386/amd64
#export OS_BIT=64
###32/64
#export ANT_HOME=/root/apache-ant-1.8.2
#export PATH=$PATH:$ANT_HOME/bin
#export LD_LIBRARY_PATH=$JAVA_HOME/jre/lib/$OS_ARCH/server:${HADOOP_HOME}/build/c++/Linux-$OS_ARCH-$OS_BIT/lib:/usr/local/lib:/usr/lib
#yum -y install fuse fuse-devel fuse-libs
#modprobe fuse
####设置环境变量,也可写入profile####
红字部分为其上只变量的选项,根据服务器操作系统版本进行变更。
一、编译libhdfs
然后进入hadoop安装路径运行以下命令
#/root/apache-ant-1.8.2/bin/ant compile-c++-libhdfs -Dlibhdfs=1 -Dcompile.c++=1
#ln -s c++/Linux-$OS_ARCH-$OS_BIT/lib build/libhdfs
这一步是编译libhdfs,因为libhdfs需要交叉编译,直接到src里面编译会报错,所以需要用ant编译。注意OS_ARCH和OS_BIT必须设置,否则会失败。
二、编译fuse-dfs
hadoop 0.20.203.0版本中fuse存在一个bug,需要先修改掉才能继续编译。
打开$HADOOP_HOME/src/contrib/fuse-dfs/src/fuse_connect.c
找到
hdfsFS fs = hdfsConnectAsUser(hostname, port, user, (const char **)groups, numgroups);
修改为
hdfsFS fs = hdfsConnectAsUser(hostname, port, user);
然后运行编译
#/root/apache-ant-1.8.2/bin/ant compile-contrib -Dlibhdfs=1 -Dfusedfs=1
如果编译失败,比较可能的原因是找不到libhdfs,请参看第一步的ln -s。
三、环境配置
然后编辑/etc/fuse.conf,写入以下内容user_allow_other
mount_max=100
编辑$HADOOP_HOME/build/contrib/fuse-dfs/fuse_dfs_wrapper.sh
if [ "$HADOOP_HOME" = "" ]; then
export HADOOP_HOME=/opt/modules/hadoop/hadoop-0.20.203.0
fi
export PATH=$HADOOP_HOME/build/contrib/fuse_dfs:$PATH
for f in ls $HADOOP_HOME/lib/*.jar $HADOOP_HOME/*.jar ; do
export CLASSPATH=$CLASSPATH:$f
done
if [ "$OS_ARCH" = "" ]; then
export OS_ARCH=amd64
fi
if [ "$JAVA_HOME" = "" ]; then
export JAVA_HOME=/usr/java/jdk1.6.0_21
fi
if [ "$LD_LIBRARY_PATH" = "" ]; then
export LD_LIBRARY_PATH=$JAVA_HOME/jre/lib/$OS_ARCH/server:/usr/local/share/hdfs/libhdfs/:/usr/local/lib
fi
./fuse_dfs $@
然后我的整体环境变量如下
#注意下面的用户,尽量不要用root
[hadoop@collect-wzlink-205 fuse-dfs]$export
declare -x G_BROKEN_FILENAMES="1"
declare -x HISTSIZE="1000"
declare -x HOME="/home/hadoop"
declare -x INPUTRC="/etc/inputrc"
declare -x LANG="en_US.UTF-8"
declare -x LESSOPEN="|/usr/bin/lesspipe.sh %s"
declare -x LOGNAME="hadoop"
declare -x LS_COLORS="no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=01;32:*.cmd=01;32:*.exe=01;32:*.com=01;32:*.btm=01;32:*.bat=01;32:*.sh=01;32:*.csh=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tz=01;31:*.rpm=01;31:*.cpio=01;31:*.jpg=01;35:*.gif=01;35:*.bmp=01;35:*.xbm=01;35:*.xpm=01;35:*.png=01;35:*.tif=01;35:"
declare -x MAIL="/var/spool/mail/root"
declare -x OLDPWD="/opt/modules/hadoop/hadoop-0.20.203.0/build/contrib"
declare -x PATH="/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin"
declare -x PWD="/opt/modules/hadoop/hadoop-0.20.203.0/build/contrib/fuse-dfs"
declare -x SHELL="/bin/bash"
declare -x SHLVL="2"
declare -x TERM="linux"
declare -x USER="hadoop"
然后尝试mount
$mkdir /tmp/dfs
$cd $HADOOP_HOME/build/contrib/fuse-dfs
$./fuse_dfs_wrapper.sh dfs://hadoopmaster:9000 /tmp/dfs
port=9000,server=hadoopmaster
fuse-dfs didn't recognize /tmp/dfs,-2(这个问题目前不知如何解决,但不影响使用。)
写出来觉得很简单,其实中间遇到了很多问题。
四、主要问题
1.编译libhdfs,centos5.4默认是ant 1.6.2,结果没编译成功,下载了新版的1.8.2才编译成功
2.编译fuse-dfs,一定要写ln -s c++/Linux-$OS_ARCH-$OS_BIT/lib build/libhdfs,否则就算你把libhdfs.so.0放到/usr/lib或者/usr/local/lib下,也照样会报找不到文件。
3.环境变量一定要设置齐全,否则会有很多莫名其妙的错误。
4.fuse启动过程中,可能会出现mount --no-canonicalize的一个错误,这个问题,对不起,目前我还无解,搞了大半天没搞出来,直接换了台服务器,正常了。
5.fuse启动过程中,出现找不到libjvm.so,需要设置CLASSPATH到jdk的tools.jar,lib/之类的
6.mount可能会出现fusermount: mount failed: Operation not permitted用root将/bin/fusermount和/usr/bin/fusermount用chmod 4777改掉。
7.其他问题可以在tail -f /var/log/messages | grep fuse查看
8.fuse-dfs的debug启动,后面加-d
这样mount的结果是,把HDFS当成本地硬盘使用,速度还是非常可以的。
再一个好处是文件在HDFS里面会保存3份,互为冗余,不会出现文件丢失的现象。
还有个就是访问速度快,HADOOP会将多个服务器上的数据拼成完整数据返回给用户,而服务器越多,每台服务器的访问量就越少,速度就越快。
如果数据交换量大,可以采用我之前写过的多网卡绑定方案增加服务器之间的数据交换。
本文出自 “实践检验真理” 博客,谢绝转载!
相关文章推荐
- 用hadoop中的libhdfs和fuse-dfs构建快速云存储(出自 实践检验真理 博客)
- Hadoop1.x中的libhdfs和fuse-dfs构建快速云存储
- fuse挂载hadoop2.0.0文件系统hdfs到本地(关于libhdfs和fuse-dfs的编译)
- hadoop 2.0.0 fuse 安装 libhdfs fuse-dfs 编译
- 利用cloudera hadoop 中的libhdfs和fuse-dfs将hdfs中的文件挂载到本地硬盘
- Cloudera Mountable HDFS (hadoop-fuse-dfs).
- hadoop fuse挂载问题 (fuse-dfs didn't recognize /tmp/hdfs, -2)
- hadoop-3.0.0-beta1运维手册(005):hdfs3.0.0分布式构建-hdfs配置、无密码登录
- CDH hadoop-hdfs-fuse的安装使用
- Hadoop fuse_dfs编译与安装
- 异常:hadoop 上传文件报错 WARN hdfs.DFSClient: DataStreamer Exception,hadoop datanode 启动不起来
- Linux上编译hadoop-2.7.1的libhdfs.so和libhdfs.a
- hadoop-3.0.0-beta1运维手册(006):hdfs3.0.0分布式构建-启动hdfs
- 【hadoop摸索系列】记录使用libhdfs访问hdfs的关键问题
- 编译hadoop的libhdfs.a
- Hadoop基础教程-第4章 HDFS的Java API(4.4 Windows+Eclipse+HDFS快速入门)
- Hadoop异常 hdfs.DFSClient: DataStreamer Exception: org.apache.hadoop.ipc.RemoteException
- hadoop fs、hadoop dfs与hdfs dfs的区别
- hadoop之libhdfs配置及使用(hadoop1.2.1 + eclipse CDT 使用libhdfs)
- hadoop fs、hadoop dfs与hdfs dfs命令