【问题标题】:Create Hadoop Sequence File创建 Hadoop 序列文件
【发布时间】:2018-09-18 00:24:07
【问题描述】:

我正在尝试创建 hadoop 序列文件。

我成功地在 HDFS 中创建了一个序列文件,但是如果我尝试读取一个序列文件,“序列文件不是序列文件” 会发生错误。我还检查了 HDFS 中创建的序列文件。

这是我的源代码,可以将序列文件读写到 HDFS 中。

package us.qi.hdfs;

import java.io.IOException;
import java.net.URI;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.ArrayFile;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.SequenceFile;
import org.apache.hadoop.io.Text;

public class SequenceFileText {
    public static void main(String args[]) throws IOException {

        /** Get Hadoop HDFS command and Hadoop Configuration*/
        HDFS_Configuration conf = new HDFS_Configuration();
        HDFS_Test hdfs = new HDFS_Test();

        String uri = "hdfs://slave02:9000/user/hadoop/test.seq";

        /** Get Configuration from HDFS_Configuration Object by using get_conf()*/
        Configuration config = conf.get_conf();

        SequenceFile.Writer writer = null;
        SequenceFile.Reader reader = null;

        try {
            Path path = new Path(uri);

            IntWritable key = new IntWritable();
            Text value = new Text();

            writer = SequenceFile.createWriter(config, SequenceFile.Writer.file(path), SequenceFile.Writer.keyClass(key.getClass()),
                    ArrayFile.Writer.valueClass(value.getClass()));
            reader = new SequenceFile.Reader(config, SequenceFile.Reader.file(path));

            writer.append(new IntWritable(11), new Text("test"));
            writer.append(new IntWritable(12), new Text("test2"));
            writer.close();

            while (reader.next(key, value)) {
                System.out.println(key + "\t" + value);
            }
            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            IOUtils.closeStream(writer);
            IOUtils.closeStream(reader);
        }
    }
}

并且发生了这个错误。

2018-09-17 17:15:34,267 警告 [主要] util.NativeCodeLoader (NativeCodeLoader.java:(62)) - 无法加载 native-hadoop 适合您平台的库...使用内置 java 类,其中 适用 2018-09-17 17:15:38,870 INFO [main] compress.CodecPool (CodecPool.java:getCompressor(153)) - 获得全新的压缩器 [.deflate] java.io.EOFException: hdfs://slave02:9000/user/hadoop/test.seq 不是 SequenceFile org.apache.hadoop.io.SequenceFile$Reader.init(SequenceFile.java:1933) 在 org.apache.hadoop.io.SequenceFile$Reader.initialize(SequenceFile.java:1892) 在 org.apache.hadoop.io.SequenceFile$Reader.(SequenceFile.java:1841) 在 us.qi.hdfs.SequenceFileText.main(SequenceFileText.java:36)

【问题讨论】:

  • 你为什么要创建读者和作者?当读者甚至被定义时,看起来你还没有创建文件,所以这会引发那个错误。将这些过程分成两个独立的方法

标签: java hadoop hdfs


【解决方案1】:

那是我的错。我更改了一些源代码。

首先,我检查文件是否已存在于 hdfs 中。如果没有文件,我会创建一个 writer 对象。

当编写程序完成时,我检查一个序列文件。检查文件后,我成功读取了一个序列文件。

这是我的代码。谢谢!

try {
            Path path = new Path(uri);

            IntWritable key = new IntWritable();
            Text value = new Text();

            /** First, Check a file already exists.
             * If there is not exists in hdfs, writer object is created.
             * */
            if (!fs.exists(path)) {
                writer = SequenceFile.createWriter(config, SequenceFile.Writer.file(path), SequenceFile.Writer.keyClass(key.getClass()),
                        ArrayFile.Writer.valueClass(value.getClass()));

                writer.append(new IntWritable(11), new Text("test"));
                writer.append(new IntWritable(12), new Text("test2"));
                writer.close();
            } else {
                logger.info(path + " already exists.");
            }

            /** Create a SequenceFile Reader object.*/
            reader = new SequenceFile.Reader(config, SequenceFile.Reader.file(path));

            while (reader.next(key, value)) {
                System.out.println(key + "\t" + value);
            }

            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            IOUtils.closeStream(writer);
            IOUtils.closeStream(reader);
        }

【讨论】:

    猜你喜欢
    • 2012-08-27
    • 2017-09-08
    • 2012-09-30
    • 2013-12-10
    • 2015-02-20
    • 2014-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多