我正在hadoop2上运行一个任务:
$hadoop jar hipi.jar "/5" "/processWOH" 1
hipi.jar:jar文件名
“/5”:输入文件夹名称
“/processwoh”:输出文件夹名称
关于这条路,我遇到了许多例外/localhost:9000/5/lc814000.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)中却不是
感谢您的帮助
更新:我后来发现“/5”文件夹是在本地系统中搜索的,而不是在hdfs中,如果我在本地文件系统中创建一个名为localhost:9000“根下,即/localhost:9000 and put“/5”代码将运行,但在本例中,数据是从hadoop外部获取的,就像我根本不使用hadoop一样。那么,这是编程中的一个错误,即我应该使用hadoop io包而不是java io包来处理hdfs而不是本地文件系统,还是另一个问题。?
2条答案
按热度按时间oyt4ldly1#
hdfs的默认目录是/localhost:9000/,hadoop在那里找不到您的输入文件;刚刚过去/localhost:9000/:
祝你好运!
d7v8vwbk2#
问题是,正如我前面所说的,java io(即文件类、路径类……)将路径视为本地文件系统中的路径,而hadoop io(文件系统类、路径类……)将路径视为hdfs中的路径。
请看这里:读/写从/在hdfs
使用文件系统api向hdfs读写数据
从hadoop分布式文件系统(hdfs)读取数据和向其写入数据可以通过很多方式完成。现在让我们首先使用filesystem api在hdfs中创建并写入文件,然后使用应用程序从hdfs读取文件并将其写回本地文件系统。
步骤1:下载测试数据集后,我们可以编写一个应用程序,从本地文件系统读取文件,并将内容写入hadoop分布式文件系统。
第二步:导出jar文件,从终端运行代码,将示例文件写入hdfs:
第三步:验证文件是否写入hdfs,检查文件内容:
步骤4:接下来,我们编写一个应用程序来读取刚刚在hadoop分布式文件系统中创建的文件,并将其内容写回本地文件系统:
第五步:导出jar文件,从终端运行代码,将示例文件写入hdfs:
步骤6:验证文件是否写回本地文件系统:
filesystem是一个抽象类,它表示一个通用的文件系统。大多数hadoop文件系统实现都可以通过filesystem对象进行访问和更新。要创建hdfs的示例,可以调用filesystem.get()方法。get()方法将查看分配给类路径上hadoop配置文件的fs.defaultfs参数的uri,并选择要示例化的文件系统类的正确实现。hdfs的fs.defaultfs参数具有hdfs://.
一旦创建了filesystem类的示例,hdfswriter类就调用create()方法在hdfs中创建一个文件。create()方法返回一个outputstream对象,可以使用普通的JavaI/o方法对其进行操作。类似地,hdfsreader调用open()方法在hdfs中打开一个文件,该方法返回一个inputstream对象,可用于读取文件的内容。
文件系统api非常广泛。为了演示api中可用的其他一些方法,我们可以向我们创建的hdfswriter和hdfsreader类添加一些错误检查。
要在调用create()之前检查文件是否存在,请使用:
要检查路径是否为文件,请使用:
要重命名已存在的文件,请使用: