Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Hadoop中从Jar获取文件资源_Java_Hadoop_Jar_Configuration - Fatal编程技术网

Java 在Hadoop中从Jar获取文件资源

Java 在Hadoop中从Jar获取文件资源,java,hadoop,jar,configuration,Java,Hadoop,Jar,Configuration,我正在尝试从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");

我正在尝试从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文件,即使它应该位于类路径上


我缺少什么?

我假设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)));
Path pt=newpath(“hdfs://:9000/user/john/myConf.xml”);
FileSystem fs=FileSystem.get(新配置());
BufferedReader br=新的BufferedReader(新的InputStreamReader(fs.open(pt));

之所以不首选此选项,是因为对于要映射或缩减的每个记录,都是从hdfs读取数据,因此会出现重大性能问题。

我假设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)));
Path pt=newpath(“hdfs://:9000/user/john/myConf.xml”);
FileSystem fs=FileSystem.get(新配置());
BufferedReader br=新的BufferedReader(新的InputStreamReader(fs.open(pt));

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

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


谢谢你的建议。

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


谢谢你的建议。

我尝试了这个方法,获取文件,然后将其传递给addResource()。但这是行不通的。我还尝试在作业设置阶段获取资源(在设置作业对象之前,在驱动程序的run()方法中)。但它们都没有读取资源。更正:我尝试将文件路径添加到addResource()。新文件()行是否应该是新文件(“resources/myConf.xml”)?我应该向addResource()行传递什么?只是好奇为什么要尝试在init方法(mapper或reducer)中向配置添加资源?我尝试了这个方法,获取文件,然后将其传递给addResource()。但这是行不通的。我还尝试在作业设置阶段获取资源(在设置作业对象之前,在驱动程序的run()方法中)。但它们都没有读取资源。更正:我尝试将文件路径添加到addResource()。新文件()行是否应该是新文件(“resources/myConf.xml”)?我应该向addResource()行传递什么?只是好奇为什么要尝试在init方法(映射器或reducer)中向配置添加资源?我仍然好奇为什么要在init方法中将资源添加到config?我仍然好奇为什么要在init方法中将资源添加到config?