笔者使用的版本是 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之后,就基本不出错了。