我正在Hadoop2上运行一个任务:
$hadoop jar hipi.jar "/5" "/processWOH" 1hipi.jar: jar文件名
"/5":输入文件夹名
"/processWOH":输出文件夹名
对于路径/localhost:9000/5/ am 814000.tif:
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而不是本地文件系统,还是另一个问题。
发布于 2017-03-24 20:53:56
hdfs的默认目录是/localhost:9000/,hadoop在那里找不到您的输入文件;就在/localhost:9000/中。
$hadoop fs -put $LOCAL_PATH_OF_INPUT_FILE:/5 /localhost:9000/
$hadoop jar hipi.jar "/5" "/processWOH" 1祝好运!
发布于 2017-03-25 17:30:09
问题是,正如我前面所说的,Java (即文件类、路径类、.)在本地文件系统中处理路径,而Hadoop (FileSystem类,路径类,.)将路径处理为HDFS中的路径。
请看这里:HDFS中的读/写/写
使用FileSystem API将数据读写到HDFS
从Hadoop分布式文件系统(HDFS)读取和写入数据可以通过多种方式完成。现在,让我们从使用FileSystem API创建和写入HDFS中的文件开始,然后使用应用程序从HDFS读取文件并将其写回本地文件系统。
步骤1:一旦下载了测试数据集,我们就可以编写应用程序从本地文件系统读取文件并将内容写入Hadoop分布式文件系统。
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:
[training@localhost ~]$ hadoop jar HdfsWriter.jar com.hadoop.hdfs.writer.HdfsWriter sample.txt /user/training/HdfsWriter_sample.txt步骤3:验证文件是否写入HDFS并检查文件的内容:
[training@localhost ~]$ hadoop fs -cat /user/training/HdfsWriter_sample.txt步骤4:下一步,我们编写一个应用程序来读取我们刚刚在中创建的文件,并将其内容写回本地文件系统:
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:
[training@localhost ~]$ hadoop jar HdfsReader.jar com.hadoop.hdfs.reader.HdfsReader /user/training/HdfsWriter_sample.txt /home/training/HdfsReader_sample.txt步骤6:验证文件是否被写回本地文件系统:
[training@localhost ~]$ hadoop fs -cat /user/training/HdfsWriter_sample.txtFileSystem是一个抽象类,表示一个通用文件系统。大多数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()之前检查文件是否存在,请使用以下命令:
boolean exists = fs.exists(inputPath);若要检查路径是否为文件,请使用:
boolean isFile = fs.isFile(inputPath);若要重命名已退出的文件,请使用:
boolean renamed = fs.rename(inputPath, new Path("old_file.txt"));https://stackoverflow.com/questions/43006608
复制相似问题