Как заставить Anaconda Pyspark Jupyter работать с S3 под Windows - PullRequest
0 голосов
/ 06 февраля 2020

Моя цель - иметь работающий ноутбук Jupyter с поддержкой pyspark и s3 / s3a. Я как-то дошел до того, что pyspark работал, но я не могу заставить его поддерживать s3 или s3a, независимо от того, сколько я гуглю. Большая часть информации предназначена для Unix / linux или предполагает слишком много. Пожалуйста помоги. Ниже приведены шаги, которые я предпринял до сих пор.

После https://medium.com/@naomi.fridman / install-pyspark-to-run-jupyter-notebook-on- windows -4ec2009de21f

  1. Установлено JAVA 8 (версия для Windowsx64)
  2. Установите переменную JAVA_HOME и добавленную переменную PATH в соответствии с указанным выше сайтом (с путями более новой версии)
  3. Скачано Apache Spark 2.4.4 (30 августа 2019 г.) PreBuilt для Apache Имеет oop 2.7
  4. Разархивировал его на C: \ Spark (получил spark-2.4.4-bin-hadoop2.7. tar)
  5. Распакуйте его в C: \ Spark (получил папку spark-2.4.4-bin-hadoop2.7)
  6. Установите дополнительные переменные окружения и добавьте папку bin в PATH переменная в соответствии с указанным сайтом
  7. Скачал файл windows 64-bit winutils.exe для сайта, указанного выше, запустив команду cmd, которую мне сказали запустить. Я оставил его копию в папке C: \ Spark \ spark-2.4.4-bin-hadoop2.7 и в папке bin.
  8. Запустил и проверил Anaconda spark - успех

Далее нужно было заставить pyspark работать в Jupyter

  1. В приглашении Anaconda я установил findspark "conda install - c conda-forge findspark"
  2. После запуска
findspark.init()
findspark.find()
import pyspark
findspark.find()

from pyspark import SparkContext, SparkConf
from pyspark.sql import SparkSession
conf = pyspark.SparkConf().setAppName('appName').setMaster('local')
sc = pyspark.SparkContext(conf=conf)
spark = SparkSession(sc)

Ура, pyspark работает под Jupyter, но мне нужен этот автозапуск как часть ядра, из которых у меня есть только опция python3 прямо сейчас.

Так что я гуглю вещи и выясняю, что мне нужно создать каталог в "C: \ ProgramData \ Anaconda3 \ share \ jupyter \ kernels", чтобы я скопировал и переименовал существующую папку python3 и просто изменил " display_name ": to" pyspark ", я должен быть в состоянии добавить туда строку вроде" --profile = myCustomProfile ", но это продолжало давать сбой (модуль не найден?), поэтому я отказался от профилей (помогите здесь тоже, плз?) Затем я создал файл 00-pyspark-setup.py в папке "C: \ Users \ Admin.ipython \ profile_default \ startup". Я прочитал, что это своего рода autoexe c .bat поэтому я поместил вышеуказанный код findspark и sparkContext

Вот где я застрял. Основная проблема в том, что я не могу получить доступ к s3 / s3a / s3n через команду spark.read.load ("s3: / xx"), я также не могу запустить такие вещи, как %% configure -f, но это меньшая проблема.

Я прочитал решения через boto3, но позволяет ли это spark.read.load напрямую из s3? Не похоже на это. Я могу ошибаться

Другой включает в себя загрузку aws - java -sdk-1.7.4.jar и oop - aws -2.7.1.jar от maven, добавляя эти строки где-то (или 2 разных места). Это должно дать мне желаемый результат.

spark.executor.extraClassPath      C:\spark\maven\aws-java-sdk-1.7.4.jar;C:\spark\maven\hadoop-aws-2.7.1.jar
spark.driver.extraClassPath       C:\spark\maven\aws-java-sdk-1.7.4.jar;C:\spark\maven\hadoop-aws-2.7.1.jar

hadoop_conf = spark.sparkContext._jsc.hadoopConfiguration()
hadoop_conf.set("fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem")
hadoop_conf.set("fs.s3a.access.key", "aKey")
hadoop_conf.set("fs.s3a.secret.key", "sKey"

Кто-нибудь может мне помочь? Я думаю, что мне нужно создать свой собственный "C: \ spark \ spark-2.4.4-bin-hadoop2.7 \ conf \ spark-defaults.conf" и добавить туда коды spark.driver, но это не так работает, моя ошибка от Jupyter все еще, и большинство ответов в Интернете, кажется, что они ссылаются на linux пути, но здесь мне нужно указать диск, не так ли?

Py4JJavaError: Ошибка при вызове o84 .csv. : java .lang.RuntimeException: java .lang.ClassNotFoundException: Класс org. apache .had oop .fs.s3a.S3AFileSystem не найден От C: \ spark \ spark-2.4.4- bin-hadoop2.7 \ python \ lib \ py4j-0.10.7-sr c .zip \ py4j \ protocol.py в get_return_value (ответ, gateway_client, target_id, name)

1 Ответ

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

Я нашел свой ответ. За исключением части профиля / ядра Jupyter.

Я нашел и следовал https://medium.com/@sivachaitanya / accessing- aws -s3-from-pyspark-standalone-cluster-6ef0580e3c08

Я также вернул назад и удалил банки maven и их строки из spark-defaults.conf, и он все еще работал. Кажется, мне просто нужно добавить следующее в файл 00-pyspark-setup.py

import os
os.environ['PYSPARK_SUBMIT_ARGS'] = "--packages=org.apache.hadoop:hadoop-aws:2.7.3 pyspark-shell"

import findspark
findspark.init()
findspark.find()
import pyspark

from pyspark import SparkContext, SparkConf
from pyspark.sql import SparkSession
conf = pyspark.SparkConf().setAppName('appName').setMaster('local')

sc=SparkContext(conf=conf)
sc.setSystemProperty("com.amazonaws.services.s3.enableV4", "true")

hadoopConf = sc._jsc.hadoopConfiguration()
hadoopConf.set("fs.s3a.endpoint", "s3-ap-northeast-1.amazonaws.com")
hadoopConf.set("com.amazonaws.services.s3a.enableV4", "true")

spark = SparkSession(sc)

import configparser
config = configparser.ConfigParser()
config.read(os.path.expanduser("~/.aws/credentials"))
access_id = config.get("default", "aws_access_key_id") 
access_key = config.get("default", "aws_secret_access_key")

spark.sparkContext._jsc.hadoopConfiguration().set("fs.s3a.access.key", access_id)
spark.sparkContext._jsc.hadoopConfiguration().set("fs.s3a.secret.key", access_key)

За исключением изменения конечной точки на регион, в котором я нахожусь. Тогда

spark.read.csv("s3a:/myBucket/*").show() 

работал!

...