我有6台服务器,每台都包含很多日志.我想通过rsync将这些日志放到hadoop fs上.现在我正在使用fuse和rsync直接写入熔丝安装的fs/mnt/hdfs.但是有一个大问题.大约一天后,保险丝守护程序占用5 GB的RAM,并且无法对安装的fs做任何事情.所以我必须重新安装保险丝,一切都很好,但只是一段时间.Rsync命令是
rsync --port=3360 -az --timeout=10 --contimeout=30 server_name::ap-rsync/archive /mnt/hdfs/logs
Run Code Online (Sandbox Code Playgroud)
一段时间后,Rsync会生成错误消息:
rsync error: timeout in data send/receive (code 30) at io.c(137) [sender=3.0.7]
rsync: connection unexpectedly closed (498784 bytes received so far) [receiver]
rsync error: error in rsync protocol data stream (code 12) at io.c(601) [receiver=3.0.7]
rsync: connection unexpectedly closed (498658 bytes received so far) [generator]
rsync error: error in rsync protocol data stream (code 12) at io.c(601) [generator=3.0.7]
Run Code Online (Sandbox Code Playgroud)
小智 5
Fuse-hdfs 不支持O_RDWR
and O_EXCL
,因此 rsync 会收到 EIO 错误。如果你想在fuse-hdfs中使用rsync,则需要对代码进行patch。你有两种修改方式,每一种都可以。我建议使用第二种方法。
补丁保险丝-hdfs,它可以在hadoop中找到。
修补 rsync(版本 3.0.8)。
diff -r rsync-3.0.8.no_excl/syscall.c rsync-3.0.8/syscall.c
234a235,252
> #if defined HAVE_SECURE_MKSTEMP && defined HAVE_FCHMOD && (!defined HAVE_OPEN64 || defined HAVE_MKSTEMP64)
> {
> int fd = mkstemp(template);
> if (fd == -1)
> return -1;
> if (fchmod(fd, perms) != 0 && preserve_perms) {
> int errno_save = errno;
> close(fd);
> unlink(template);
> errno = errno_save;
> return -1;
> }
> #if defined HAVE_SETMODE && O_BINARY
> setmode(fd, O_BINARY);
> #endif
> return fd;
> }
> #else
237c255,256
< return do_open(template, O_WRONLY|O_CREAT, perms);
---
> return do_open(template, O_RDWR|O_EXCL|O_CREAT, perms);
> #endif
Run Code Online (Sandbox Code Playgroud)我不知道问题到底是什么,但我认为要正确解决将日志移动到 HDFS 的一般问题,您可以考虑使用 Flume:https: //github.com/cloudera/flume - http://www.cloudera .com/resource/hw10_flume_reliable_distributed_streaming_log_collection
归档时间: |
|
查看次数: |
8539 次 |
最近记录: |