Как я могу проверить Hadoop SequenceFile, для которого мне не хватает полной информации о схеме? - PullRequest
6 голосов
/ 26 сентября 2011

У меня есть сжатый Hadoop SequenceFile от клиента, которого я хотел бы проверить. В настоящее время у меня нет полной информации о схеме (над которой я работаю отдельно).

Но в промежуточный период (и в надежде на общее решение), каковы мои варианты проверки файла?

Я нашел инструмент для подъема: http://www.exmachinatech.net/01/forqlift/

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

Но есть ли другой вариант, доступный в то же время? Я понимаю, что, скорее всего, я не могу извлечь данные, но есть ли какой-нибудь инструмент для сканирования, сколько значений ключей и какого типа?

Ответы [ 5 ]

16 голосов
/ 03 сентября 2014

из оболочки:

$ hdfs dfs -text /user/hive/warehouse/table_seq/000000_0

или непосредственно из куста (что намного быстрее для небольших файлов, потому что он работает в уже запущенной JVM)

hive> dfs -text /user/hive/warehouse/table_seq/000000_0

работает для файлов последовательности.

10 голосов
/ 27 сентября 2011

Проверьте класс SequenceFileReadDemo в «Hadoop: Полное руководство» - Пример кода .Файлы последовательности имеют встроенные в них типы ключ / значение.Используйте SequenceFile.Reader.getKeyClass () и SequenceFile.Reader.getValueClass () , чтобы получить информацию о типе.

6 голосов
/ 27 сентября 2011

Моей первой мыслью было бы использовать Java API для файлов последовательности, чтобы попытаться их прочитать. Даже если вы не знаете, какой Writable используется файлом, вы можете угадать и проверить сообщения об ошибках (возможно, есть лучший способ, которого я не знаю).

Например:

private void readSeqFile(Path pathToFile) throws IOException {
  Configuration conf = new Configuration();
  FileSystem fs = FileSystem.get(conf);

  SequenceFile.Reader reader = new SequenceFile.Reader(fs, pathToFile, conf);

  Text key = new Text(); // this could be the wrong type
  Text val = new Text(); // also could be wrong

  while (reader.next(key, val)) {
    System.out.println(key + ":" + val);
  }
}

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

Редактировать : На самом деле, если вы делаете less file.seq, обычно вы можете прочитать некоторые заголовки и посмотреть, что такое типы записи (по крайней мере, для первого ключа / значения). Например, на одном файле я вижу:

SEQ^F^Yorg.apache.hadoop.io.Text"org.apache.hadoop.io.BytesWritable

3 голосов
/ 09 сентября 2015

Я не программист на Java или Hadoop, поэтому мой способ решения проблемы может быть не лучшим, но в любом случае.

Я потратил два дня на решение проблемы чтения FileSeq локально (Linux debian amd64) без установки hadoop.

Предоставленный образец

while (reader.next(key, val)) {
    System.out.println(key + ":" + val);
  }

хорошо работает для текста, но не работает для сжатых входных данных BytesWritable.

Что я сделал?Я скачал эту утилиту для создания (записи данных SequenceFiles Hadoop) github_com / shsdev / sequencefile-utility / archive / master.zip, и запустил ее, затем изменил для чтения ввода Hadoop SeqFiles.

Инструкция для запуска Debianэта утилита с нуля:

sudo apt-get install maven2
sudo mvn install
sudo apt-get install openjdk-7-jdk

edit "sudo vi /usr/bin/mvn",
change `which java` to `which /usr/lib/jvm/java-7-openjdk-amd64/bin/java`

Also I've added (probably not required)
'
PATH="/home/mine/perl5/bin${PATH+:}${PATH};/usr/lib/jvm/java-7-openjdk-amd64/"; export PATH;

export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64/
export JAVA_VERSION=1.7
'
to ~/.bashrc


Then usage:
sudo mvn install
~/hadoop_tools/sequencefile-utility/sequencefile-utility-master$ /usr/lib/jvm/java-7-openjdk-amd64/bin/java -jar ./target/sequencefile-utility-1.0-jar-with-dependencies.jar


-- and this doesn't break the default java 1.6 installation that is required for FireFox/etc.

Для устранения ошибки с совместимостью FileSeq (например, «Невозможно загрузить библиотеку native-hadoop для вашей платформы ... с использованием встроенных классов java, где это применимо»), я использовал библиотеки libsс главного сервера Hadoop как есть (что-то вроде хака):

scp root@10.15.150.223:/usr/lib/libhadoop.so.1.0.0 ~/
sudo cp ~/libhadoop.so.1.0.0 /usr/lib/
scp root@10.15.150.223:/usr/lib/jvm/java-6-sun-1.6.0.26/jre/lib/amd64/server/libjvm.so ~/
sudo cp ~/libjvm.so /usr/lib/
sudo ln -s /usr/lib/libhadoop.so.1.0.0 /usr/lib/libhadoop.so.1
sudo ln -s /usr/lib/libhadoop.so.1.0.0 /usr/lib/libhadoop.so

Однажды ночью мы пили кофе, и я написал этот код для чтения входных файлов FileSeq hadoop (используя этот cmd для запуска этого кода "/ usr / lib / jvm / java-7-openjdk-amd64 / bin / java -jar ./target/sequencefile-utility-1.3-jar-with-dependencies.jar -d test / -c NONE "):

import org.apache.hadoop.io.*;
import org.apache.hadoop.io.SequenceFile;
import org.apache.hadoop.io.SequenceFile.ValueBytes;

import java.io.DataOutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;

Path file = new Path("/home/mine/mycompany/task13/data/2015-08-30");
reader = new SequenceFile.Reader(fs, file, conf);
long pos = reader.getPosition();

logger.info("GO from pos "+pos);
DataOutputBuffer rawKey = new DataOutputBuffer();
ValueBytes rawValue = reader.createValueBytes();

int DEFAULT_BUFFER_SIZE = 1024 * 1024;
DataOutputBuffer kobuf = new DataOutputBuffer(DEFAULT_BUFFER_SIZE);
kobuf.reset();

int rl;
do {
  rl = reader.nextRaw(kobuf, rawValue);
  logger.info("read len for current record: "+rl+" and in more details ");
  if(rl >= 0)
  {
    logger.info("read key "+new String(kobuf.getData())+" (keylen "+kobuf.getLength()+") and data "+rawValue.getSize());
    FileOutputStream fos = new FileOutputStream("/home/mine/outb");
    DataOutputStream dos = new DataOutputStream(fos);
    rawValue.writeUncompressedBytes(dos);
    kobuf.reset();
  }
} while(rl>0);
  • Я только что добавил этот фрагмент кода в файл src / main / java / eu / scape_project / tb / lsdr / seqfileutility / SequenceFileWriter.java сразу после строки

    writer = SequenceFile.createWriter (fs, conf, path, keyClass, valueClass, CompressionType.get (pc.getCompressionType ()));

Благодаря этим источникам информации: Ссылки:

Если вы используете hadoop-core вместо mahour, вам придется вручную загрузить asm-3.1.jar: search_maven_org / remotecontent? Filepath = org / ow2 / util / asm / asm / 3.1 / asm-3.1.jar search_maven_org / #search | ga | 1 | asm-3.1

Список доступных репозиториев mahout: repo1_maven_org / maven2 / org / apache / mahout / Введение в Mahout: mahout_apache_org /

Хороший ресурс для изучения интерфейсов иисточники классов Java Hadoop (я использовал его для написания собственного кода для чтения FileSeq): http://grepcode.com/file/repo1.maven.org/maven2/com.ning/metrics.action/0.2.7/org/apache/hadoop/io/BytesWritable.java

Исходники проекта tb-lsdr-seqfilecreator, который я использовал для создания собственного проекта чтения файлов FileSeq: www_javased_com /?source_dir = scape / tb-lsdr-seqfilecreator / src / main / java / eu / scape_project / tb / lsdr / seqfileutility / ProcessParameters.java

stackoverflow_com / questions / 5096128 / sequence-files-in-hadoop -тот же пример(чтение ключа, значение, которое не работает)

https://github.com/twitter/elephant-bird/blob/master/core/src/main/java/com/twitter/elephantbird/mapreduce/input/RawSequenceFileRecordReader.java - этот помог мне (я использовал reader.nextRaw так же, как в nextKeyValue () и других подпрограммах)

Также я изменил ./pom.xml для нативного apache.hadoop вместо mahout.hadoop, но, вероятно, это не обязательно, потому что ошибки для read-> next (key, value) одинаковы для обоих, поэтому у меня быловместо этого использовать read-> nextRaw (keyRaw, valueRaw):

diff ../../sequencefile-utility/sequencefile-utility-master/pom.xml ./pom.xml 
9c9
<     <version>1.0</version>
---
>     <version>1.3</version>
63c63
<             <version>2.0.1</version>
---
>             <version>2.4</version>
85c85
<             <groupId>org.apache.mahout.hadoop</groupId>
---
>             <groupId>org.apache.hadoop</groupId>
87c87
<             <version>0.20.1</version>
---
>             <version>1.1.2</version>
93c93
<             <version>1.1</version>
---
>             <version>1.1.3</version>
3 голосов
/ 15 февраля 2013

Я просто играл с Дамбо . Когда вы запускаете задание Dumbo в кластере Hadoop, на выходе получается файл последовательности. Я использовал следующее, чтобы выгрузить весь сгенерированный Dumbo файл последовательности в виде простого текста:

$ bin/hadoop jar contrib/streaming/hadoop-streaming-1.0.4.jar \
    -input totals/part-00000 \
    -output unseq \
    -inputformat SequenceFileAsTextInputFormat
$ bin/hadoop fs -cat unseq/part-00000

Я получил идею от здесь .

Кстати, Дамбо также может выводить простой текст .

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