Hadoop с суперcsv

Мне приходится обрабатывать данные в очень больших текстовых файлах (размером около 5 ТБ). Логика обработки использует supercsv для анализа данных и выполнения некоторых проверок. Очевидно, поскольку размер довольно велик, мы планировали использовать хауп, чтобы воспользоваться преимуществами параллельных вычислений. Я устанавливаю hadoop на свою машину и начинаю писать классы картографа и редуктора, и я застрял. Поскольку для карты требуется пара ключ-значение, поэтому, чтобы прочитать этот текстовый файл, я не уверен, что должно быть ключом и значением в этом конкретном сценарии. Может ли кто-нибудь помочь мне с этим.

Мой мыслительный процесс выглядит примерно так (дайте мне знать, если я прав) 1) Прочитайте файл, используя superCSV, и hadoop сгенерирует bean-компоненты supercsv для каждого фрагмента файла в hdfs. (Я предполагаю, что Hadoop позаботится о разделении файла) 2) Для каждого из этих supercsvbeans запустите мою логику проверки.


person Nikhil Das Nomula    schedule 25.10.2012    source источник


Ответы (1)


Разделены ли данные новой строкой? т. е. если вы просто разделите данные на каждый символ новой строки, будет ли каждый фрагмент всегда одной полной записью? Это зависит от того, как superCSV кодирует текст, и от того, содержат ли ваши фактические данные символы новой строки.

Если да:

Просто используйте TextInputFormat. Он предоставляет вам (я думаю) смещение байтов в качестве ключа карты и всю строку в качестве значения. Вы можете игнорировать ключ и анализировать строку с помощью superCSV.

If no:

Вам нужно будет написать свой собственный формат ввода — вот хороший учебник: http://developer.yahoo.com/hadoop/tutorial/module5.html#fileformat. Специфика того, что именно является ключом и значением, не имеет большого значения для ввода картографа; просто убедитесь, что один из двух содержит фактические данные, которые вам нужны. Вы даже можете использовать NullWritable в качестве типа для одного из них.

person Joe K    schedule 25.10.2012
comment
Чтобы было ясно, если это клавиша ввода текста LongWritable, а значение Text. - person Thomas Jungblut; 26.10.2012
comment
Да, фактические данные разделены новой строкой. В соответствии с тем, что вы предлагаете, мне нужно использовать byteoffset в качестве ключа и строку (объект, который анализируется supercsv) в качестве значения. Значит ли это, что каждая строка будет обрабатываться на узле в кластере? Я думал, что hadoop разделит файлы, и я отправлю соответствующие объекты supercsv в качестве значений. - person Nikhil Das Nomula; 26.10.2012
comment
Hadoop разделит файлы и передаст много строк каждому преобразователю, и да, это будет распределено по кластеру. Вы можете выполнить синтаксический анализ строк в объекты supercsv в качестве непосредственного первого шага в преобразователе и получить практически тот же результат, как если бы вы использовали пользовательский формат ввода, но без хлопот, связанных с его записью/отладкой. - person Joe K; 27.10.2012
comment
Согласно тому, что вы говорите, я пытался разделить с помощью NLineInputFormat. Допустим, у меня есть 10 строк на разделение. В этом случае только первые 10 строк имеют заголовок CSV, через который CSV заполняет соответствующие bean-компоненты. Теперь в оставшихся разбиениях есть только данные без заголовка. Теперь в этом случае мне нужно написать заголовок в начале каждого разделения, и я не уверен, сможем ли мы это сделать. - person Nikhil Das Nomula; 01.11.2012
comment
Можете ли вы просто жестко закодировать заголовки в классе картографа и удалить его из файла? Также нет необходимости использовать NLineInputFormat; вы должны просто использовать TextInputFormat. - person Joe K; 02.11.2012