我正在尝试以这三种方式将文件从本地复制到hdfs:
FileSystem fs = FileSystem.get(context.getConfiguration());
LocalFileSystem lfs = fs.getLocal(context.getConfiguration());
lfs.copyFromLocalFile(new Path("file:///pathToFile/file.properties"), new Path("/destPath/"));
fs.copyFromLocalFile(new Path("file:///pathToFile/file.properties"), new Path("/destPath/"));
fs.copyFromLocalFile(new Path("file:///pathToFile/file.properties"), new Path("/destPath/"));
但他们都没有工作。 我总是得到/pathToFile/file.properties的FileNotFound异常,但该文件存在于Unix上的该路径上,并且对运行Map / Reduce的用户具有读写权限。
我在这里缺少什么想法?
Job正在与Ozzie一起运行 CDH4
非常感谢你的帮助。
opalo
答案 0 :(得分:0)
此代码在哪里运行?
如果此代码在map或reduce方法中运行(因为看起来因为你有一个Context实例),那么你正在一个从属节点上执行。是否所有从属节点都可以看到此路径,或者只能是群集的登录节点才能看到该文件?
如果此代码实际上应该在mapper或reducer中运行,并且该文件不是这些机器的本地文件(并且您不希望将文件放入带有“hdfs fs -put”的hdfs中“命令”,您拥有的一个选项是使用hadoop分布式缓存在您的作业中部署文件。您可以使用DistributedCache类的静态方法addCacheFile以编程方式执行此操作,或者如果主类使用Tool实现-files switch接口,则可以通过命令行执行此操作。
以编程方式(从上面链接的文档复制):
JobConf job = new JobConf();
DistributedCache.addCacheFile(new URI("/myapp/lookup.dat#lookup.dat"), ob);
DistributedCache.addCacheArchive(new URI("/myapp/map.zip", job);
DistributedCache.addFileToClassPath(new Path("/myapp/mylib.jar"), job);
DistributedCache.addCacheArchive(new URI("/myapp/mytar.tar", job);
DistributedCache.addCacheArchive(new URI("/myapp/mytgz.tgz", job);
DistributedCache.addCacheArchive(new URI("/myapp/mytargz.tar.gz", job);
如果主类实现Tool接口,则从命令行开始:
hadoop jar Your.jar Package.Path.To.MainClass -files comma,seperated,list,of,files program_argument_list_here