首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Hadoop上的java/终端中指定文件的路径?

如何在Hadoop上的java/终端中指定文件的路径?
EN

Stack Overflow用户
提问于 2017-03-24 18:21:36
回答 2查看 1.3K关注 0票数 0

我正在Hadoop2上运行一个任务:

代码语言:javascript
复制
$hadoop jar hipi.jar "/5" "/processWOH" 1

hipi.jar: jar文件名

"/5":输入文件夹名

"/processWOH":输出文件夹名

对于路径/localhost:9000/5/ am 814000.tif:

代码语言:javascript
复制
Error: java.io.FileNotFoundException: /localhost:9000/5/LC814000.tif (No such file or directory)
        at java.io.FileInputStream.open0(Native Method)
        at java.io.FileInputStream.open(FileInputStream.java:195)
        at java.io.FileInputStream.<init>(FileInputStream.java:138)
        at java.io.FileInputStream.<init>(FileInputStream.java:93)
        at ProcessWithoutHIPI.ProcessRecordReaderWOH.getCurrentKey(ProcessRecordReaderWOH.java:81)
        at ProcessWithoutHIPI.ProcessRecordReaderWOH.getCurrentKey(ProcessRecordReaderWOH.java:1)
        at org.apache.hadoop.mapred.MapTask$NewTrackingRecordReader.getCurrentKey(MapTask.java:507)
        at org.apache.hadoop.mapreduce.task.MapContextImpl.getCurrentKey(MapContextImpl.java:70)
        at org.apache.hadoop.mapreduce.lib.map.WrappedMapper$Context.getCurrentKey(WrappedMapper.java:81)
        at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:145)
        at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:764)
        at org.apache.hadoop.mapred.MapTask.run(MapTask.java:340)
        at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:167)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.security.auth.Subject.doAs(Subject.java:422)
        at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1548)
        at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:162)

我认为(我不确定)在路径中添加额外的"/localhost:9000“的问题,但是我不知道它是如何添加的(由hadoop,java代码,.)。

注意:这个jar文件在hadoop之外运行良好,但在hadoop (hdfs)中却不是

任何帮助都是非常感谢的。

Update: --正如我后来发现的那样,"/5“文件夹是在本地系统中搜索的,而不是在hdfs中,如果我在本地文件系统中创建一个名为"localhost:9000”的文件夹,在根(即/localhost:9000 )下放置"/5“,代码将运行,但在这种情况下,数据将从hadoop外部获取,就像我根本不使用hadoop一样。因此,这是编程中的一个错误吗?我应该使用hadoop包而不是java包来处理hdfs而不是本地文件系统,还是另一个问题。

EN

回答 2

Stack Overflow用户

发布于 2017-03-24 20:53:56

hdfs的默认目录是/localhost:9000/,hadoop在那里找不到您的输入文件;就在/localhost:9000/中。

代码语言:javascript
复制
$hadoop fs -put $LOCAL_PATH_OF_INPUT_FILE:/5 /localhost:9000/
$hadoop jar hipi.jar "/5" "/processWOH" 1

祝好运!

票数 1
EN

Stack Overflow用户

发布于 2017-03-25 17:30:09

问题是,正如我前面所说的,Java (即文件类、路径类、.)在本地文件系统中处理路径,而Hadoop (FileSystem类,路径类,.)将路径处理为HDFS中的路径。

请看这里:HDFS中的读/写/写

使用FileSystem API将数据读写到HDFS

从Hadoop分布式文件系统(HDFS)读取和写入数据可以通过多种方式完成。现在,让我们从使用FileSystem API创建和写入HDFS中的文件开始,然后使用应用程序从HDFS读取文件并将其写回本地文件系统。

步骤1:一旦下载了测试数据集,我们就可以编写应用程序从本地文件系统读取文件并将内容写入Hadoop分布式文件系统。

代码语言:javascript
复制
package com.hadoop.hdfs.writer;

import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.util.Tool;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.util.ToolRunner;

public class HdfsWriter extends Configured implements Tool {

    public static final String FS_PARAM_NAME = "fs.defaultFS";

    public int run(String[] args) throws Exception {

        if (args.length < 2) {
            System.err.println("HdfsWriter [local input path] [hdfs output path]");
            return 1;
        }

        String localInputPath = args[0];
        Path outputPath = new Path(args[1]);

        Configuration conf = getConf();
        System.out.println("configured filesystem = " + conf.get(FS_PARAM_NAME));
        FileSystem fs = FileSystem.get(conf);
        if (fs.exists(outputPath)) {
            System.err.println("output path exists");
            return 1;
        }
        OutputStream os = fs.create(outputPath);
        InputStream is = new BufferedInputStream(new FileInputStream(localInputPath));
        IOUtils.copyBytes(is, os, conf);
        return 0;
    }

    public static void main( String[] args ) throws Exception {
        int returnCode = ToolRunner.run(new HdfsWriter(), args);
        System.exit(returnCode);
    }
}

步骤2:导出Jar文件并从终端运行代码将样例文件写入HDFS:

代码语言:javascript
复制
[training@localhost ~]$ hadoop jar HdfsWriter.jar com.hadoop.hdfs.writer.HdfsWriter sample.txt /user/training/HdfsWriter_sample.txt

步骤3:验证文件是否写入HDFS并检查文件的内容:

代码语言:javascript
复制
[training@localhost ~]$ hadoop fs -cat /user/training/HdfsWriter_sample.txt

步骤4:下一步,我们编写一个应用程序来读取我们刚刚在中创建的文件,并将其内容写回本地文件系统:

代码语言:javascript
复制
package com.hadoop.hdfs.reader;

import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;

public class HdfsReader extends Configured implements Tool {

    public static final String FS_PARAM_NAME = "fs.defaultFS";

    public int run(String[] args) throws Exception {

        if (args.length < 2) {
            System.err.println("HdfsReader [hdfs input path] [local output path]");
            return 1;
        }

        Path inputPath = new Path(args[0]);
        String localOutputPath = args[1];
        Configuration conf = getConf();
        System.out.println("configured filesystem = " + conf.get(FS_PARAM_NAME));
        FileSystem fs = FileSystem.get(conf);
        InputStream is = fs.open(inputPath);
        OutputStream os = new BufferedOutputStream(new FileOutputStream(localOutputPath));
        IOUtils.copyBytes(is, os, conf);
        return 0;
    }

    public static void main( String[] args ) throws Exception {
        int returnCode = ToolRunner.run(new HdfsReader(), args);
        System.exit(returnCode);
    }
}

步骤5:导出Jar文件并从终端运行代码将样例文件写入HDFS:

代码语言:javascript
复制
[training@localhost ~]$ hadoop jar HdfsReader.jar com.hadoop.hdfs.reader.HdfsReader /user/training/HdfsWriter_sample.txt /home/training/HdfsReader_sample.txt

步骤6:验证文件是否被写回本地文件系统:

代码语言:javascript
复制
[training@localhost ~]$ hadoop fs -cat /user/training/HdfsWriter_sample.txt

FileSystem是一个抽象类,表示一个通用文件系统。大多数Hadoop文件系统实现可以通过FileSystem对象访问和更新。要创建HDFS的实例,您可以调用方法FileSystem.get()。FileSystem.get()方法将查看分配给类路径上Hadoop配置文件的fs.defaultFS参数的URI,并选择要实例化的FileSystem类的正确实现。HDFS的fs.defaultFS参数的值为hdfs://。

一旦创建了FileSystem类的实例,HdfsWriter类将调用create()方法在HDFS中创建文件。create()方法返回一个OutputStream对象,可以使用普通的Java /O方法对其进行操作。类似地,HdfsReader调用方法open()来打开HDFS中的文件,该方法返回一个InputStream对象,该对象可用于读取文件的内容。

FileSystem API是广泛的。为了演示API中可用的其他方法,我们可以在我们创建的HdfsWriter和HdfsReader类中添加一些错误检查。

若要在调用create()之前检查文件是否存在,请使用以下命令:

代码语言:javascript
复制
boolean exists = fs.exists(inputPath);

若要检查路径是否为文件,请使用:

代码语言:javascript
复制
boolean isFile = fs.isFile(inputPath);

若要重命名已退出的文件,请使用:

代码语言:javascript
复制
boolean renamed = fs.rename(inputPath, new Path("old_file.txt"));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43006608

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档