Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache 如何检查缺少完整模式信息的Hadoop SequenceFile?_Apache_Hadoop - Fatal编程技术网

Apache 如何检查缺少完整模式信息的Hadoop SequenceFile?

Apache 如何检查缺少完整模式信息的Hadoop SequenceFile?,apache,hadoop,Apache,Hadoop,我有一个客户提供的压缩Hadoop SequenceFile,我想检查一下。我现在没有完整的模式信息(我正在单独处理) 但在此期间(并希望有一个通用的解决方案),我检查文件的选项是什么 我找到了一个Qlift工具: 并在文件上尝试了“forqlift list”。它抱怨无法为包含的自定义子类Writables加载类。因此,我需要跟踪这些实现 但在这段时间内还有其他选择吗?我知道我很可能无法提取数据,但是有没有工具可以扫描多少键值以及键值的类型?我的第一个想法是使用Java API来读取序列文件。

我有一个客户提供的压缩Hadoop SequenceFile,我想检查一下。我现在没有完整的模式信息(我正在单独处理)

但在此期间(并希望有一个通用的解决方案),我检查文件的选项是什么

我找到了一个Qlift工具:

并在文件上尝试了“forqlift list”。它抱怨无法为包含的自定义子类Writables加载类。因此,我需要跟踪这些实现


但在这段时间内还有其他选择吗?我知道我很可能无法提取数据,但是有没有工具可以扫描多少键值以及键值的类型?

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

感谢这些信息来源: 链接:

如果使用hadoop core而不是mahour,则必须手动下载asm-3.1.jar: 搜索\u maven\u 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\u maven\u org/maven2/org/apache/mahout/ 管理员简介: mahout_apache_组织/

学习Hadoop Java类的接口和源代码的好资源(我用它编写自己的代码来阅读FileSeq):

我用于创建自己的项目FileSeq读取器的项目tb lsdr seqfilecreator的来源: www_javased_com/?source_dir=scape/tb lsdr seqfilecreator/src/main/java/eu/scape_project/tb/lsdr/seqfileutility/ProcessParameters.java

hadoop中的stackoverflow_com/questions/5096128/sequence文件-同一个示例(读取键,不起作用的值)

-这一个帮助了我(我使用了reader.nextRaw,与在nextKeyValue()和其他sub中使用的相同)

另外,我已经更改了本机apache.hadoop的./pom.xml,而不是mahout.hadoop,但这可能不是必需的,因为read->next(key,value)的bug对于这两个都是相同的,所以我不得不使用read->nextRaw(keyRaw,valueRaw):

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>