hadoop - 在 Hadoop 中读取分布式文件

标签 hadoop

我正在尝试在 hadoop 中执行以下操作:

  1. 我已经实现了一个 map-reduce 作业,将文件输出到目录“foo”。
  2. foo 文件的格式为 key=IntWriteable,value=IntWriteable(使用 SequenceFileOutputFormat)。
  3. 现在,我想开始另一个 map-reduce 作业。映射器很好,但每个 reducer 都需要在启动时读取整个“foo”文件(我使用 HDFS 在 reducer 之间共享数据)。

我在“public void configure(JobConf conf)”中使用了这段代码:

String uri = "out/foo";
FileSystem fs = FileSystem.get(URI.create(uri), conf);
FileStatus[] status = fs.listStatus(new Path(uri));
for (int i=0; i<status.length; ++i) {
    Path currFile = status[i].getPath();
    System.out.println("status: " + i + " " + currFile.toString());
    try {
        SequenceFile.Reader reader = null;
        reader = new SequenceFile.Reader(fs, currFile, conf);
        IntWritable key = (IntWritable) ReflectionUtils.newInstance(reader.getKeyClass(), conf);
        IntWritable value = (IntWritable ) ReflectionUtils.newInstance(reader.getValueClass(), conf);
        while (reader.next(key, value)) {
        // do the code for all the pairs.
        }
    }
}

代码在单机上运行良好,但我不确定它是否能在集群上运行。 也就是说,这段代码是从当前机器读取文件还是从分布式系统读取id?

对于我正在尝试做的事情,是否有更好的解决方案?

提前致谢

阿里克。

最佳答案

FileSystem.get() 的 URI 没有定义方案,因此,使用的文件系统取决于配置参数 fs.defaultFS。如果未设置,将使用默认设置,即 LocalFile 系统。

您的程序写入 workingDir/out/foo 下的本地文件系统。它也应该在集群中工作,但会查找本地文件系统。

综上所述,我不确定您为什么需要 foo 目录中的整个文件。您可能已经考虑过其他设计。如果需要,应首先将这些文件复制到 HDFS,然后从 reducer 的重写设置方法中读取文件。不用说,关闭在 reducer 的重写 closeup 方法中打开的文件。虽然可以在 reducer 中读取文件,但 map/reduce 程序并不是为这种功能而设计的。

关于hadoop - 在 Hadoop 中读取分布式文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16061373/

相关文章:

java - Hadoop 名称节点拒绝连接!?我究竟做错了什么?

hadoop - oozie工作流程的最大限制

hadoop - 如何查看namenode状态?

hadoop - 启动名称节点时出现 ExitCodeException

json - 配置单元查询嵌套的json

sql - 在 Hive 中进行日期明智的 JOIN 制作问题

hadoop - MapReduce作业中的分割数

python - 将文本文件读取到元组pyspark

hadoop - CDH4的配置文件存放在哪里

hadoop - 如何将没有任何分隔符的字符串转换为逗号分隔的字符串?