hadoop-hdfs-fuse的陷阱一例:不能更新太频繁

笔者使用的版本是 hadoop-hdfs-fuse-2.0.0+960-1.cdh4.2.1.p0.9.el6.x86_64 ,将使用fuse导数据时出现大量IO错误,大体有2类:

fuse_dfs: ERROR /data/1/jenkins/workspace/generic-package-rhel64-6-0/topdir/BUILD/hadoop-2.0.0-cdh4.2.1/src/hadoop-hdfs-project/hadoop-hdfs/src/main/native/fuse-dfs/f
use_impls_open.c:128 Could not open file /hive/2012-12-12/10-31.log (errno=255)
fuse_dfs: ERROR /data/1/jenkins/workspace/generic-package-rhel64-6-0/topdir/BUILD/hadoop-2.0.0-cdh4.2.1/src/hadoop-hdfs-project/hadoop-hdfs/src/main/native/fuse-dfs/f
use_impls_write.c:57 User trying to random access write to a file 774318412 != 770588846 for /hive/2012-12-12/05-16.log

挂载信息如下:

$ df -Th /data/mount_hadoop/
文件系统    类型      容量  已用  可用 已用%% 挂载点
fuse_dfs
     fuse.fuse_dfs     14T  427G   13T   4% /mnt/hadoop

脚本如下:

#!/bin/bash
# mkdir -pv $(ls /log/startup/)
sDir=/log/startup/
tDir=/mnt/hadoop/hive/
for Date in $(ls ${sDir})
do
    for Path in $(find ${sDir}${Date}/ -type f -name "*-open-*.parsed.gz")
    do
        Type=$(file --uncompress --mime-type ${Path} | cut -d' ' -f 2)
        if [[ "X${Type}" = "Xtext/plain" ]];then
            tag=$(echo ${Path} | awk -F'/' '{print $NF}' | cut -d '-' -f 1-2)
            tFile=${tDir}${Date}/${tag}.log
            gunzip -c ${Path} >> ${tFile}
            sleep 1
        fi
    done
done

这里的陷阱就是“sleep 1”。为什么要停顿?因为如果不停顿的话,你将收到大量IO错误。

如上全是单进程写入,不存在并发的问题。且在调试时过程,找到出错的语句手动执行都没有问题,加上Sleep之后,就基本不出错了。

posted @ 2013-05-31 10:02  higkoo  阅读(1411)  评论(0编辑  收藏  举报