2011-09-26 53 views
6

我有一个我想检查的客户压缩的Hadoop SequenceFile。我目前没有完整的模式信息(我正在单独处理)。如何检查缺少完整模式信息的Hadoop SequenceFile?

但在过渡期(以及希望获得一个通用解决方案),我有哪些检查文件的选项?

我发现了一个工具forqlift:http://www.exmachinatech.net/01/forqlift/

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

但是在此期间还有其他选择吗?我明白,最有可能我无法提取数据,但有没有一些工具可以扫描多少个关键值和哪种类型?

回答

6

我的第一个想法是使用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

我刚刚玩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 

我上心从here

顺便提一句,Dumbo can also output plain text

+1

'错误:java.io.IOException:类型在映射中的键不匹配:expected org.apache.hadoop.io.LongWritable,received org.apache.hadoop.io.Text'当我给出简单的序列文件输入时它不工作。 –

12

从外壳:

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

或直接(这是更快的小文件,因为它是运行在已经启动的JVM)

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

作品序列文件。

3

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

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

所提供的样品

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兼容性(例如:“无法加载原生的Hadoop库平台...使用内置的Java类适用“),我使用了Hadoop的主服务器的库为是(一种黑客):

scp [email protected]:/usr/lib/libhadoop.so.1.0.0 ~/ 
sudo cp ~/libhadoop.so.1.0.0 /usr/lib/ 
scp [email protected]:/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-open JDK-AMD64 /斌/ Java的罐子./target/sequencefile-utility-1.3-jar-with-dependencies.jar -d测试/ -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); 
  • 我刚加入这个块的代码只是行

    作家= SequenceFile.createWriter(FS,CONF,路径,keyClass, valueClass后到文件的src /主/爪哇/ EU/scape_project/TB/LSDR/seqfileutility/SequenceFileWriter.java ,CompressionType.get(pc.getCompressionType()));

由于信息的这些来源: 链接:

如果使用Hadoop的核心,而不是mahour,然后就可以下载手动ASM-3.1.jar: search_maven_org/remotecontent文件路径=组织/ow2/util/asm/asm/3.1/asm-3.1.jar search_maven_org /#搜索| GA | 1个| ASM-3.1

avaliable象夫回购名单: repo1_maven_org/maven2的/组织/阿帕奇/象夫/ Mahout简介: mahout_apache_org/

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

来源项目FileSeq阅读器: www_javased_com /?source_dir = scape/tb-lsdr-seqfilecreator/src/main/java/eu/scape_project/tb/lsdr/seqfileutility/ProcessParameters。java的

stackoverflow_com /问题/ 5096128 /序列文件正在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> 
+0

是的,这是一个答案。 – peterh