如何检查我缺less完整模式信息的Hadoop SequenceFile?

我有一个客户的压缩Hadoop SequenceFile,我想检查。 我目前没有完整的模式信息(这是我正在单独工作)。

但是,在这个过渡期(以及一个通用的解决scheme的希望),我有什么select来检查文件?

我find了一个用于sqlift的工具: http : //www.exmachinatech.net/01/forqlift/

并试图在文件上的'forqlift列表'。 它抱怨说,它不能加载包含的自定义子类Writables的类。 所以我需要跟踪这些实现。

但是在此期间还有其他的select吗? 我明白,最有可能我无法提取的数据,但是有一些工具来扫描有多less键值和什么types?

检查“Hadoop:权威指南”中的SequenceFileReadDemo类示例代码 。 序列文件中嵌入了键/值类型。 使用SequenceFile.Reader.getKeyClass()和SequenceFile.Reader.getValueClass()来获取类型信息。

从外壳:

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

或直接从配置单元(这对于小文件来说更快,因为它运行在已经启动的JVM中)

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

适用于序列文件。

我首先想到的是使用序列文件的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); } } 

如果这些程序是错误的类型,这个程序将会崩溃,但是Exception应该说明哪个Writable类型的键和值实际上是。

编辑 :其实,如果你less file.seq通常你可以阅读一些头,看看什么是可写类型(至少是第一个键/值)。 例如,在一个文件中,我看到:

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

我正在和Dumbo玩。 在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 

我从这里得到了主意。

顺便说一下, Dumbo也可以输出纯文本 。

我不是一个Java或Hadoop程序员,所以我解决问题的方式可能不是最好的,但无论如何。

我花了两天的时间解决了在没有安装hadoop的情况下在本地读取FileSeq(Linux debian amd64)的问题。

提供的样品

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

适用于Text,但不适用于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库…在适用的情况下使用builtin-java类”),我使用Hadoop主服务器的libs(一种破解):

 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 /

良好的资源学习Hadoop Java类的接口和来源(我用它来编写我自己的代码读取FileSeq): http ://grepcode.com/file/repo1.maven.org/maven2/com.ning/metrics.action /0.2.7/org/apache/hadoop/io/BytesWritable.java

用于创建我自己的项目FileSeq读取器的项目tb-lsdr-seqfilecreator的来源: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()和其他的子集中)

另外,我已经改变了原生apache.hadoop的./pom.xml,而不是mahout.hadoop,但可能这不是必需的,因为read-> next(key,value)的bug对于两者都是相同的,所以我不得不使用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>