java在hadoop中从jar获取文件资源

ntjbwcob  于 2021-05-29  发布在  Hadoop
关注(0)|答案(2)|浏览(359)

我正在尝试从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文件,即使它应该在类路径上。
我错过了什么?

3npbholx

3npbholx1#

好的-原来我的原始代码实际上可以工作(除了一些后来的bug…),但是我的部署脚本意外地忽略了实际的xml文件,我错过了它,因为有一个类似的命名属性文件。
谢谢你的建议。

olhwl3o2

olhwl3o22#

我假设init方法属于mapper或reducer类。执行这些类的jvm与驱动程序不是同一个jvm,可能在不同的机器上。所以不能从这些类中读取本地文件系统。
有两个选项可以读取此文件。
选项1(首选)使用如下分布式缓存:

JobConf job = new JobConf();
 DistributedCache.addCacheFile(new URI("resources/myConf.xml"), 
                               job);

现在可以在mapper或reducer init方法中使用以下文件:

File f = new File("./myConf.xml");

选项2(非首选):在hdfs中上载文件并使用hdfs java客户端api读取。

Path pt=new Path("hdfs://<hdfs hostname>:9000/user/john/myConf.xml");
                    FileSystem fs = FileSystem.get(new Configuration());
                    BufferedReader br=new BufferedReader(new InputStreamReader(fs.open(pt)));

不首选此选项的原因是,对于要Map或减少的每个记录,都是从hdfs中读取数据,因此会出现严重的性能问题。

相关问题