从spark-submit运行应用程序时从jar读取输入文件

时间:2017-05-16 14:33:58

标签: scala apache-spark executable-jar spark-submit

我有一个自定义分隔的输入文件,并传递给newAPIHadoopFile以转换为RDD [String]。该文件位于项目资源目录下。从Eclipse IDE运行时,以下代码运行良好。

  val path = this.getClass()
                 .getClassLoader()
                 .getResource(fileName)                   
                 .toURI().toString()
  val conf = new org.apache.hadoop.conf.Configuration() 
  conf.set("textinputformat.record.delimiter", recordDelimiter)

  return sc.newAPIHadoopFile(
      path,
      classOf[org.apache.hadoop.mapreduce.lib.input.TextInputFormat],
      classOf[org.apache.hadoop.io.LongWritable], 
      classOf[org.apache.hadoop.io.Text], 
      conf)
    .map(_._2.toString) 

然而,当我在spark-submit(使用超级jar)上运行它时如下

   spark-submit /Users/anon/Documents/myUber.jar

我收到以下错误。

 Exception in thread "main" java.lang.IllegalArgumentException: java.net.URISyntaxException: Relative path in absolute URI: jar:file:/Users/anon/Documents/myUber.jar!/myhome-data.json

请输入任何内容?

1 个答案:

答案 0 :(得分:1)

如果该文件适用于需要路径而非输入流的sc.newAPIHadoopFile,我建议您使用--files的{​​{1}}选项。

  

- 文件FILES 要放在每个执行程序的工作目录中的以逗号分隔的文件列表。执行程序中这些文件的文件路径可以通过SparkFiles.get(fileName)访问。

请参阅SparkFiles.get方法:

  

获取通过spark-submit添加的文件的绝对路径。

有了这个,您应该使用SparkContext.addFile(),如下所示:

spark-submit

在一般情况下,如果文件位于jar文件中,则应使用spark-submit --files fileNameHere /Users/anon/Documents/myUber.jar 来访问该文件(而不是直接作为InputStream)。

代码可能如下所示:

File

请参阅Scala的Source对象和Java的ClassLoader.getResourceAsStream方法。