rsync文件到hadoop

问题描述:

我有6个服务器,每个都包含大量的日志。我想通过rsync将这些日志写入hadoop fs。现在我使用熔丝和rsync直接写入熔丝安装的fs/mnt/hdfs。 但是有一个很大的问题。大约一天后,熔丝deamon占用5 GB的RAM,并且无法对安装的fs进行任何操作。所以我必须重新安装保险丝,一切都可以,但只是一段时间。 rsync命令是rsync文件到hadoop

rsync --port=3360 -az --timeout=10 --contimeout=30 server_name::ap-rsync/archive /mnt/hdfs/logs 

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] 

我不知道究竟是什么问题,但我认为,妥善解决移动日志的一般问题HDFS你可以考虑使用Flume:https://github.com/cloudera/flume - http://www.cloudera.com/resource/hw10_flume_reliable_distributed_streaming_log_collection

+0

水槽是相当沉重的重量,有一堆的依赖。所以虽然它在移动日志方面做得非常出色,但它不会那么容易设置。 –

+0

谢谢,我看着水槽。但我希望将gzipped日志文件与其子目录一起传输。当我尝试传输的文件不完整。文本文件没问题,但gzip文件没有。 – Michal

我会用hadoop fs -copyFromLocal /path/to/logs hdfs:///path/to/logs/$DATE。由于您将日志放入日期过的目录,因此不需要使用rsync。不需要FUSE,这对于原型而言是有利的,但是如你所见,这是不可靠的。

+0

这个选项是我第一次尝试如何避免直接使用rsyng到hadoop保险丝。 首先我将新文件rsynced到本地目录,然后我用hadoop dfs -copyFromLocal。但我在复制到hdfs时遇到了问题。 http://*.com/questions/6449562/hadoop-copyfromlocal-problem-wit-copying-directory 如果可以使用这个命令,那就太好了。 – Michal

Fuse-hdfs不支持O_RDWRO_EXCL,所以rsync会得到一个EIO错误。 如果你想用fuse-hdfs使用rsync,需要修补代码。 你有两种修改方式,每一种都可以。我建议使用第二种方法。

  1. patch fuse-hdfs,它可以在hadoop中找到。

    https://issues.apache.org/jira/browse/HDFS-861

  2. 补丁的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