Apache spark Apache Zeppelin给出java.io.FileNotFoundException,尽管该位置存在文件

Apache spark Apache Zeppelin给出java.io.FileNotFoundException,尽管该位置存在文件,apache-spark,apache-zeppelin,Apache Spark,Apache Zeppelin,我正在尝试创建一个非常简单的齐柏林飞艇笔记本,它读取一个csv文件并对该文件进行分析。然而,我遇到了一个非常奇怪的错误。尽管文件显示在ls命令中,但当我试图将其读取为read.csv时,我得到的是java.io.FileNotFoundException ls命令显示bank.csv文件(顶部第四个) 但在尝试读取文件时出现异常。 在本地/独立齐柏林飞艇安装中。。。 默认情况下,齐柏林飞艇笔记本(以及底层的Spark stack)很有可能配置为在HDFS中查找相对文件路径 因此,您可能需要使用

我正在尝试创建一个非常简单的齐柏林飞艇笔记本,它读取一个csv文件并对该文件进行分析。然而,我遇到了一个非常奇怪的错误。尽管文件显示在
ls
命令中,但当我试图将其读取为
read.csv
时,我得到的是
java.io.FileNotFoundException

ls
命令显示
bank.csv
文件(顶部第四个)

但在尝试读取文件时出现异常。

在本地/独立齐柏林飞艇安装中。。。 默认情况下,齐柏林飞艇笔记本(以及底层的Spark stack)很有可能配置为在HDFS中查找相对文件路径

因此,您可能需要使用绝对文件路径,并提到您正在处理您的文件系统

data = spark.csv.read("file:///data/your_path/banks.csv")
在集群齐柏林飞艇装置中 如果您的笔记本连接到Spark安装的集群,那么访问本地文件系统不是一个好主意(您必须手动将文件部署到集群中的everynode,保持同步…)。。。这就是为什么HDFS是为您而设计的

所以你最好的办法就是利用它。将文件放在HDFS存储中的某个位置,然后从spark over HDFS加载

在您的shell中:

hdfs dfs -put /file_system_path/banks.csv "/user/zeppelin/banks.csv"
请注意,HDFS文件的实际放置路径将根据集群安装的不同而有所不同

然后Spark应该能够加载它:

spark.csv.read("/user/zeppelin/banks.csv")

当然,除了HDFS,还有其他方法可以做到这一点。例如,Spark可以连接到S3,如果这比HDSF更适合您的话,这是一种可能性(
读取(“s3a://…”)

对于通过相同路线来的人,即使用Kubernetes上的Helm安装堆栈,并尝试使用齐柏林飞艇吊舱上的本地文件,这是一个坏的想法。你可能会浪费几个小时去钻研互联网,觉得自己很愚蠢

基本上,它不会按设计工作。所有组件都将尝试在给定的指定路径上定位该文件,但它们找不到它,因为它只存在于齐柏林飞艇吊舱或容器上。我发现,最简单的方法是使用AWSS3,而不是YMMV

需要将AWS访问密钥导出为所有组件上的环境变量

- name: AWS_ACCESS_KEY_ID
  value: {{ .Values.Global.Aws.Key }}
- name: AWS_SECRET_ACCESS_KEY
  value: {{ .Values.Global.Aws.Secret }}
然后像微风一样使用
spark.read.csv('s3a://YOUR_BUCKET\u PATH/file.csv')

虽然未测试,但可以使用不带HDFS的类似方法

  • 创建一个
    PersistentVolumeClaim
  • 将其安装在所有吊舱(即Spark Driver、Spark Worker、Zeppelin)的相同路径上,并将所有文件放在相同的安装卷中
  • 使用
    file://
    指令在装入的卷中提供绝对文件路径

  • 但同样,这是一个坏主意,因为永久卷不能装载在多个工作节点上。只是要记住一个警告

    此链接可能对您有所帮助。感谢您的回复,但我仍然收到相同的错误。我使用了
    df=spark.read.csv(“file:///zeppelin/bank.csv“
    但是仍然得到
    java.io.FileNotFoundException:File文件:/zeppelin/bank.csv不存在
    我已经使用
    mmlspark
    helm chart在我的Kubernetes集群上安装了齐柏林飞艇。不确定这个Dockerfile是否缺少一些关键配置。我已经为一个典型的集群编辑了更多。您对
    %sh
    的使用让我觉得您在本地工作,但如果您要部署到k8s群集,那么可能不会!嘿,事实上这是有道理的。我意识到我的spark drive、spark workers、齐柏林飞艇等的本地文件系统上必须有相同的路径。我正在尝试配置
    s3
    ,并将其用作我的文件源。谢谢你花时间回答这个问题。