我正在尝试从jar运行hadoop应用程序:
hadoop jar myJarFile.jar my.class.path.Here /path/to/input /path/to/output
在myjarfile.jar中的一个类中,我试图从类路径中读取资源,因此:
public void init() {
Configuration conf = new Configuration();
conf.addResource("resources/myConf.xml");
log.info("Data element=" + conf.get("data.element"));
....
在myjarfile.jar中,资源/myconf存在:
[prompt] jar myJarFile.jar
my/class/path/Here.class
...
resources/myConf.xml
配置文件包含正确(hadoop风格)格式的名称/值对。但是,每当我尝试运行它时,它都找不到myconf.xml文件,即使它应该在类路径上。
我错过了什么?
2条答案
按热度按时间3npbholx1#
好的-原来我的原始代码实际上可以工作(除了一些后来的bug…),但是我的部署脚本意外地忽略了实际的xml文件,我错过了它,因为有一个类似的命名属性文件。
谢谢你的建议。
olhwl3o22#
我假设init方法属于mapper或reducer类。执行这些类的jvm与驱动程序不是同一个jvm,可能在不同的机器上。所以不能从这些类中读取本地文件系统。
有两个选项可以读取此文件。
选项1(首选)使用如下分布式缓存:
现在可以在mapper或reducer init方法中使用以下文件:
选项2(非首选):在hdfs中上载文件并使用hdfs java客户端api读取。
不首选此选项的原因是,对于要Map或减少的每个记录,都是从hdfs中读取数据,因此会出现严重的性能问题。