Apache Zeppelin дает java .io.FileNotFoundException, несмотря на наличие файла в расположении - PullRequest
0 голосов
/ 25 февраля 2020

Я пытаюсь создать очень простой блокнот Zeppelin, который читает файл CSV и выполняет анализ файла. Однако я сталкиваюсь с очень странной ошибкой. Несмотря на то, что файл отображается в команде ls, когда я пытаюсь прочитать его как read.csv, я получаю java.io.FileNotFoundException.

ls команда показывает bank.csv файл (4-й сверху) enter image description here

Но получая исключение при попытке прочитать файл. enter image description here

Ответы [ 2 ]

1 голос
/ 25 февраля 2020

В локальной / автономной установке Zeppelin ...

Есть большая вероятность, что по умолчанию ваш ноутбук Zeppelin (и базовый стек Spark) настроен на поиск в HDFS относительных путей к файлам.

Следовательно, вам, вероятно, нужно использовать абсолютный путь к файлу, указав, что вы работаете в своей файловой системе.

data = spark.csv.read("file:///data/your_path/banks.csv")

В кластерной установке Zeppelin

Если ваш Ноутбук подключается к кластеру, установленному Spark, тогда доступ к локальной файловой системе не является хорошей идеей (вам придется вручную развертывать файлы на всех узлах кластера, держать их в синхронизации c ...) ... Вот почему HDFS предназначен для.

Таким образом, лучшим вариантом будет воспользоваться этим. Поместите ваш файл где-нибудь в хранилище HDFS, затем загрузите его из спарк через hdfs.

В вашей оболочке:

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, это возможность (read("s3a://..."))

0 голосов
/ 25 февраля 2020

Для людей, которые идут по одному и тому же маршруту, то есть устанавливают стек с помощью Helm в Kubernetes и пытаются использовать локальный файл, который присутствует в Zeppelin Pod, это идея bad bad . Возможно, вы потратите пару часов, пытаясь порыться в inte rnet и чувствуя себя глупо.

В принципе, это не будет работать по проекту. Все компоненты попытаются найти файл по указанному указанному пути, но не найдут его, поскольку он присутствует только в Zeppelin Pod или Container. Самый простой подход, который я нахожу, это использовать AWS S3, но 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_PATH/file.csv') как ветер.

Хотя НЕ протестировано, но подобный подход без HDFS может быть

  1. Создать PersistentVolumeClaim
  2. Смонтировать это на одном и том же пути на всех модулях, то есть Spark Driver, Spark Worker , Zeppelin и поместите все файлы в один подключенный том
  3. Укажите абсолютный путь к файлу в подключенном томе, используя директиву file:///

Но, опять же, это плохая идея, поскольку Постоянный том не может быть подключен более чем к одному рабочему узлу. Просто предостережение, чтобы иметь в виду.

...