rsync файлы для hadoop - PullRequest
       2

rsync файлы для hadoop

5 голосов
/ 23 июня 2011

У меня есть 6 серверов, и каждый содержит много журналов. Я хотел бы поместить эти журналы в hadoop fs через rsync. Сейчас я использую fuse и rsync пишет напрямую в fs / mnt / hdfs, смонтированный на fuse. Но есть большая проблема. Примерно через день, fuse deamon занимает 5 ГБ оперативной памяти, и с подключенной файловой системой ничего не поделаешь. Поэтому я должен перемонтировать предохранитель, и все в порядке, но только на некоторое время. Команда Rsync -

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]

Ответы [ 3 ]

4 голосов
/ 28 июля 2012

Fuse-hdfs не поддерживает O_RDWR и O_EXCL, поэтому rsync получает ошибку EIO. Если вы хотите использовать rsync с fuse-hdfs, необходимо исправить код. У вас есть два способа изменить, каждый в порядке. Я рекомендую использовать второй метод.

  1. патч 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
    
0 голосов
/ 24 июня 2011

Я бы использовал hadoop fs -copyFromLocal / path / to / logs hdfs: /// path / to / logs / $ DATE .Нет необходимости в rsync, поскольку вы помещаете журналы в устаревшие каталоги.Также не требуется FUSE, что хорошо для создания прототипов, но, как вы видели, ненадежно.

0 голосов
/ 23 июня 2011

Я не знаю, в чем именно заключается вопрос, но я думаю, что для правильного решения общей проблемы переноса журналов в HDFS вы можете рассмотреть возможность использования Flume: https://github.com/cloudera/flume - http://www.cloudera.com/resource/hw10_flume_reliable_distributed_streaming_log_collection

...