Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/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
Apache spark 获得;org.apache.spark.sql.AnalysisException:路径不存在;从SparkSession.read()开始_Apache Spark_Yarn - Fatal编程技术网

Apache spark 获得;org.apache.spark.sql.AnalysisException:路径不存在;从SparkSession.read()开始

Apache spark 获得;org.apache.spark.sql.AnalysisException:路径不存在;从SparkSession.read()开始,apache-spark,yarn,Apache Spark,Yarn,我正在尝试以客户端模式读取由spark submit提交到纱线集群的文件。将文件放入HDFS不是一个选项。以下是我所做的: def main(args: Array[String]) { if (args != null && args.length > 0) { val inputfile: String = args(0) //get filename: train.csv val input_filename =

我正在尝试以客户端模式读取由
spark submit
提交到纱线集群的文件。将文件放入HDFS不是一个选项。以下是我所做的:

def main(args: Array[String]) {
   if (args != null && args.length > 0) {
        val inputfile: String = args(0)

        //get filename: train.csv
        val input_filename = inputfile.split("/").toList.last 

        val d = SparkSession.read
                .option("header", "true")
                .option("inferSchema", "true")
                .csv(SparkFiles.get(input_filename))
        d.show() 
   }   
}
并以这种方式提交给纱线:

spark2-submit \
--class "com.example.HelloWorld" \
--master yarn --deploy-mode client \
--files repo/data/train.csv \
--driver-cores 2 helloworld-assembly-0.1.jar repo/data/train.csv
但我有一个例外:

Exception in thread "main" org.apache.spark.sql.AnalysisException: Path does not exist: hdfs://xxxxx.xxxxx.xxxx.com:8020/tmp/spark-db3ee991-7f3d-427c-8479-aa212f906dc5/userFiles-040293ee-0d1f-44dd-ad22-ef6fe729bd49/train.csv; 
我也试过:

val input_filename_1 = """file://""" + SparkFiles.get(input_filename)
println(input_filename_1)

SparkSession.read
  .option("header", "true")
  .option("inferSchema", "true")
  .csv(input_filename_1) 
但仍然有一个类似的错误:

 file:///tmp/spark-fbd46e9d-c450-4f86-8b23-531e239d7b98/userFiles-8d129eb3-7edc-479d-aeda-2da98432fc50/train.csv
 Exception in thread "main" org.apache.spark.sql.AnalysisException: Path does not exist: file:/tmp/spark-fbd46e9d-c450-4f86-8b23-531e239d7b98/userFiles-8d129eb3-7edc-479d-aeda-2da98432fc50/train.csv;

我用
--files test.csv
spark.sparkContext.addFile(“test.csv”)
尝试了相同的场景

使用
scala>SparkFiles.get(“test.csv”)

例如:
/tmp/spark-9c4ea9a6-95d7-44ff-8cfb-1d9ce9f30638/userFiles-f8909daa-9710-4416-b0f0-9d9043db5d8c/test.csv
是在提交作业的本地文件系统上创建的

因此,工作人员没有此文件可读取。问题可能是使用
spark.read.csv

spark.sparkContext.addFile("test.csv")
val df = spark.read.option("header", "true").option("inferSchema", "true").csv("file://"+SparkFiles.get("test.csv"))
编辑:

我尝试将本地创建的文件复制到其他节点成功了


希望这会有所帮助。

@user10465355不是重复的。公认的答案是将数据放入HDFS中。在我的情况下,这不是一个选项,因此提交文件
--files
您是否尝试在调用
spark submit
--files
选项中使用绝对路径(类似于
/my absolute path/repo/data/train.csv
)@vindev:它是如何重复的?我使用的是相同的
SparkFiles.get()
如回答中所述,并出现此错误。@Romain:我可以看到纱线使用绝对路径拾取它:
18/11/30 11:54:35信息纱线。客户端:上传资源文件:/vol1/user/adam/my_projects/repo/data/train.csv->hdfs://xxxxxxxx:8020/user/adam/.sparkStaging/application_1541792367360_115525/train.csv
@DougKruger第二次尝试应使用完整路径
file:///tmp/spark-fbd46e9d-c450-4f86-8b23-531e239d7b98/userFiles-8d129eb3-7edc-479d-aeda-2da98432fc50/train.csv
包括前导的
文件://
。在第一次尝试中很明显,它试图从HDFS读取文件,但这不是预期的行为。我也这么认为,工作人员没有此文件可读取。除了spark.read.csv之外,还有其他关于为什么工作人员无法获取此文件的建议吗?因此,spark真的无法将文件发送到所有节点,而不手动将文件复制到所有节点或保存到HDFS?我找不到任何方法。此addFile方法将文件添加到spark,但驱动程序和工作程序根据其配置将其文件保存在不同的位置。我尝试使用map函数访问它,如下所示,
df.map{x=>(第一行(新文件(SparkFiles.get(“test.csv”))))}.show
它也起作用。这里发现了第一行函数,我有一个愚蠢的建议。您可以逐行将其读入数组[字符串]。->通过并行创建RDD。->使用映射功能拆分为字段。->创建一个模式。->创建数据帧。->使用sql.functions转换为必需的类型:Doh好的,我明白你的意思。你就是那个人!