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