Apache 如何检查缺少完整模式信息的Hadoop SequenceFile?
我有一个客户提供的压缩Hadoop SequenceFile,我想检查一下。我现在没有完整的模式信息(我正在单独处理) 但在此期间(并希望有一个通用的解决方案),我检查文件的选项是什么 我找到了一个Qlift工具: 并在文件上尝试了“forqlift list”。它抱怨无法为包含的自定义子类Writables加载类。因此,我需要跟踪这些实现Apache 如何检查缺少完整模式信息的Hadoop SequenceFile?,apache,hadoop,Apache,Hadoop,我有一个客户提供的压缩Hadoop SequenceFile,我想检查一下。我现在没有完整的模式信息(我正在单独处理) 但在此期间(并希望有一个通用的解决方案),我检查文件的选项是什么 我找到了一个Qlift工具: 并在文件上尝试了“forqlift list”。它抱怨无法为包含的自定义子类Writables加载类。因此,我需要跟踪这些实现 但在这段时间内还有其他选择吗?我知道我很可能无法提取数据,但是有没有工具可以扫描多少键值以及键值的类型?我的第一个想法是使用Java API来读取序列文件。
但在这段时间内还有其他选择吗?我知道我很可能无法提取数据,但是有没有工具可以扫描多少键值以及键值的类型?我的第一个想法是使用Java API来读取序列文件。即使您不知道文件使用的是哪个可写文件,也可以猜测并检查错误消息(可能有更好的方法我不知道) 例如:
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
检查'hadoop:the Financial Guide'中的SequenceFileReadDemo类。序列文件中嵌入了键/值类型。使用和获取类型信息。我只是在玩。在Hadoop集群上运行Dumbo作业时,输出是一个序列文件。我使用以下命令将整个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
我是从你那里得到这个主意的
顺便说一句,壳牌公司的.:
$ hdfs dfs -text /user/hive/warehouse/table_seq/000000_0
或者直接从配置单元(这对于小文件来说要快得多,因为它运行在已经启动的JVM中)
适用于序列文件。我不是Java或Hadoop程序员,所以我解决问题的方法可能不是最好的,但无论如何 我花了两天时间解决了在没有安装hadoop的情况下本地读取FileSeq(Linux debian amd64)的问题 提供的样品
while (reader.next(key, val)) {
System.out.println(key + ":" + val);
}
适用于文本,但不适用于字节可写的压缩输入数据
我做了什么?
我下载了这个实用程序来创建(写入SequenceFiles和Hadoop数据)
github_com/shsdev/sequencefile实用程序/archive/master.zip
,并使其工作,然后修改为读取输入Hadoop文件
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兼容的错误(例如,“无法为您的平台加载本机hadoop库…在适用的情况下使用内置java类”),我使用hadoop主服务器的libs原样(一种黑客行为):
一天晚上喝咖啡,我写了这段代码来读取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”):
- 我刚刚将这段代码添加到文件src/main/java/eu/scape_project/tb/lsdr/seqfileutility/SequenceFileWriter.java的行后面 writer=SequenceFile.createWriter(fs、conf、path、keyClass、, valueClass,CompressionType.get(pc.getCompressionType())
diff.././sequencefile实用程序/sequencefile实用程序主控程序/pom.xml./pom.xml
9c9
< 1.0
---
> 1.3
63c63
< 2.0.1
---
> 2.4
85c85
org.apache.hadoop
87c87
< 0.20.1
---
> 1.1.2
93c93
< 1.1
---
> 1.1.3
根据Praveen Sripati的回答,这里是来自Hadoop的SequenceFileReadDemo.java的一个小示例,这是Tom White的权威指南
数据在HDFS中,位于以下位置:user/hduser/output hashsort/,文件为
第r-00001部分
在eclipse中,我在Arguments文件夹中编写了以下字符串:
这是输出的一部分,带有调试器
如果您有权威指南的副本,此示例位于第133页(第三版)。还有一些编写和显示序列文件的示例。
错误:java.io.IOException:map中的key类型不匹配:expected org.apache.hadoop.io.LongWritable,received org.apache.hadoop.io.Text
当我使用简单序列文件输入时,它不起作用。是的,这是一个答案。
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.
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
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);
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>