Я использую Hadoop для обработки данных с python, какой формат файла должен использоваться? - PullRequest
3 голосов
/ 27 января 2010

Я использую Hadoop для обработки данных с python, какой формат файла следует использовать?

У меня есть проект со значительным количеством текстовых страниц.

Каждый текстовый файл имеет некоторую информацию заголовка, которую мне нужно сохранить во время обработки; однако я не хочу, чтобы заголовки вмешивались в алгоритмы кластеризации.

Я использую python на Hadoop (или есть подходящий пакет?)

Как мне отформатировать текстовые файлы и сохранить эти текстовые файлы в Hadoop для обработки?

Ответы [ 2 ]

4 голосов
/ 27 января 2010

1) Файлы

Если вы используете потоковую передачу Hadoop, вам нужно использовать текстовые файлы на основе строк, данные до первой вкладки передаются вашему преобразователю в качестве ключа.

Просто посмотрите документацию для потоковой передачи.

Вы также можете поместить свои входные файлы в HDFS, что было бы рекомендовано для больших файлов. Просто посмотрите на раздел «Большие файлы» в приведенной выше ссылке.

2) Сохранение метаданных

Проблема, которую я вижу, состоит в том, что информация вашего заголовка (метаданные) будет обрабатываться только как такие данные, поэтому вы должны отфильтровать их самостоятельно (первый шаг). Передать его сложнее, так как данные всех входных файлов будут просто объединены после шага карты.

Вы должны будете добавить метаданные где-то к самим данным (второй шаг), чтобы иметь возможность связать их позже. Вы можете создавать (ключ, данные + метаданные) для каждой строки данных файла и, таким образом, иметь возможность сохранять метаданные для каждой строки данных. Может быть огромные накладные расходы, но мы говорим MapReduce, значит: pfffrrrr;)

Теперь наступает момент, когда я не знаю, насколько потоковое вещание действительно отличается от работы, реализованной на Java. Если потоковая передача вызывает один маппер на файл, вы можете избавить себя от следующей проблемы, просто возьмите первый ввод map () в качестве метаданных и добавьте его (или заполнитель) для всех следующих потоков данных. Если нет, то следующее о Java-Jobs:

По крайней мере, с помощью JAR-картографа вы можете связать данные с его входным файлом (см. здесь ). Но сначала вам нужно извлечь метаданные, так как функция map может быть вызвана только для раздела файла, не содержащего метаданные. Я бы предложил что-то подобное:

  • заранее создайте файл метаданных, содержащий указатель-заполнитель: keyx: filex, metadatax
  • поместить этот индекс метаданных в HDFS
  • использовать JAR-маппер, загружать во время установки () файл метаданных-индекса
    • см. Org.apache.hadoop.hdfs.DFSClient
  • соответствует filex, установите keyx для этого преобразователя
  • добавить к каждой передаваемой строке данных в map () используемый ключ x
1 голос
/ 27 января 2010

Если вы используете потоковую передачу Hadoop, ваш ввод может быть в любом строковом формате; Ваш ввод данных мапперов и редукторов происходит из sys.stdin, который вы читаете любым удобным для вас способом. Вам не нужно использовать поля, разделенные табуляцией по умолчанию (хотя по моему опыту один формат должен использоваться среди всех задач для согласованности, когда это возможно).

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

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

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

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

Если вы используете Jython или SWIG, у вас могут быть другие варианты, но я нашел, что с ними сложнее работать, чем Streaming.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...