Я не программист на 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>