Запись данных в Hadoop - PullRequest
       102

Запись данных в Hadoop

18 голосов
/ 07 октября 2009

Мне нужно записать данные в Hadoop (HDFS) из внешних источников, таких как окно Windows. Прямо сейчас я копирую данные в namenode и использую команду put HDFS, чтобы вставить их в кластер. В моем просмотре кода я не видел API для этого. Я надеюсь, что кто-то покажет мне, что я не прав, и есть простой способ кодирования внешних клиентов с использованием HDFS.

Ответы [ 8 ]

17 голосов
/ 27 октября 2009

В Java есть API. Вы можете использовать его, включив код Hadoop в свой проект. JavaDoc в целом довольно полезен, но, конечно, вы должны знать, что вы ищете * g * http://hadoop.apache.org/common/docs/

Для вашей конкретной проблемы посмотрите на: http://hadoop.apache.org/common/docs/current/api/org/apache/hadoop/fs/FileSystem.html (это относится к последней версии, обратитесь к другим JavaDocs для различных версий!)

Типичный вызов будет: Filesystem.get(new JobConf()).create(new Path("however.file")); Который возвращает вам поток, который вы можете обрабатывать с помощью обычного JavaIO.

13 голосов
/ 06 ноября 2009

Для решения проблемы загрузки данных, которые мне нужно было поместить в HDFS, я решил перевернуть проблему.

Вместо загрузки файлов в HDFS с сервера, на котором они находились, я написал задание Java Map / Reduce, в котором маппер считывает файл с файлового сервера (в данном случае через https), а затем записывает его непосредственно в HDFS ( через Java API ).

Список файлов читается из ввода. Затем у меня есть внешний сценарий, который заполняет файл списком файлов для извлечения, загружает файл в HDFS (используя hadoop dfs -put ), затем запускает карту / сокращение задания с приличным количеством картографов. .

Это дает мне отличную производительность передачи, так как несколько файлов читаются / записываются одновременно.

Может быть, не тот ответ, который вы искали, но, надеюсь, в любом случае полезен: -).

12 голосов
/ 22 января 2012

Примерно через 2 года после моего последнего ответа появились две новые альтернативы - Hoop / HttpFS и WebHDFS.

Что касается Hoop, он впервые был анонсирован в блоге Cloudera и может быть загружен из репозитория github . Мне удалось заставить эту версию успешно общаться, по крайней мере, с Hadoop 0.20.1, возможно, она может работать и с немного более старыми версиями.

Если вы используете Hadoop 0.23.1, который на момент написания еще не выпущен, Hoop вместо этого является частью Hadoop как своего собственного компонента, HttpFS. Эта работа была выполнена в рамках HDFS-2178 . Hoop / HttpFS может быть прокси не только для HDFS, но и для других Hadoop-совместимых файловых систем, таких как Amazon S3.

Hoop / HttpFS работает как отдельная служба.

Существует также WebHDFS , который работает как часть служб NameNode и DataNode. Он также предоставляет REST API, который, если я правильно понимаю, совместим с HttpFS API. WebHDFS является частью Hadoop 1.0, и одна из его основных функций заключается в том, что он обеспечивает локальность данных - когда вы делаете запрос на чтение, вы будете перенаправлены на компонент WebHDFS в датоде, где находятся данные.

Какой компонент выбрать, зависит немного от вашей текущей настройки и того, что вам нужно. Если вам нужен интерфейс HTTP REST для HDFS сейчас, и вы используете версию, которая не включает WebHDFS, запуск с Hoop из репозитория github кажется самым простым вариантом. Если вы работаете с версией, которая включает в себя WebHDFS, я бы пошел на это, если вам не нужны некоторые функции, которые есть у Hoop, которых нет в WebHDFS (доступ к другим файловым системам, ограничение пропускной способности и т. Д.)

11 голосов
/ 07 октября 2009

Установите Cygwin, установите Hadoop локально (вам нужны только двоичные файлы и конфиги, которые указывают на ваш NN - нет необходимости фактически запускать службы), запустите hadoop fs -copyFromLocal /path/to/localfile /hdfs/path/

Вы также можете использовать новый рабочий стол Cloudera для загрузки файла через веб-интерфейс, хотя это не может быть хорошим вариантом для гигантских файлов.

Существует также наложение WebDAV для HDFS, но я не знаю, насколько это стабильно / надежно.

3 голосов
/ 14 декабря 2012

Кажется, сейчас есть выделенная страница для этого на http://wiki.apache.org/hadoop/MountableHDFS:

Эти проекты (перечисленные ниже) позволяют монтировать HDFS (на большинстве разновидности Unix) в качестве стандартной файловой системы с использованием команды mount. После подключения пользователь может работать с экземпляром hdf, используя стандартные утилиты Unix, такие как 'ls', 'cd', 'cp', 'mkdir', 'find', 'grep', или используйте стандартные библиотеки Posix, такие как open, write, read, close из C, C ++, Python, Ruby, Perl, Java, bash и т. д.

Позже он описывает эти проекты

  • contrib / fuse-dfs построен на fuse, немного клея C, libhdfs и hadoop-dev.jar
  • fuse-j-hdfs построен на fuse, fuse для java и hadoop-dev.jar
  • hdfs-fuse - проект кода Google очень похож на contrib / fuse-dfs
  • webdav - hdfs, представленный как ресурс webdav mapR - содержит hdfs-совместимую файловую систему с закрытым исходным кодом, которая поддерживает чтение и запись Доступ по NFS
  • HDFS NFS Proxy - экспортирует HDFS как NFS без использования плавкого предохранителя. Поддерживает Kerberos и переупорядочивает записи, чтобы они записывались в hdfs последовательно.

Я не пробовал ничего из этого, но скоро обновлю ответ, так как мне нужна та же потребность, что и у OP

0 голосов
/ 22 октября 2015

Вы также можете использовать HadoopDrive (http://hadoopdrive.effisoft.eu). Это расширение оболочки Windows.

0 голосов
/ 16 июля 2014

вы можете попробовать смонтировать HDFS на вашем компьютере (назовите его machine_X), где вы выполняете свой код, и machine_X должен иметь бесконечное соединение с HDFS. Проверьте это, https://wiki.apache.org/hadoop/MountableHDFS

0 голосов
/ 29 июня 2013

Теперь вы также можете попробовать использовать Talend, который включает компоненты для интеграции с Hadoop.

...