Как распространять jar JDBC в кластере Cloudera?

Я только что установил новый Spark 2.4 из CSD в свой кластер CDH (28 узлов) и пытаюсь установить драйвер JDBC, чтобы читать данные из базы данных из блокнота Jupyter. Я скачал и скопировал его на одном узле в папку /jars, однако похоже, что мне нужно делать то же самое на каждом хосте (!). В противном случае я получаю следующую ошибку от одного из рабочих:

java.lang.ClassNotFoundException: com.microsoft.sqlserver.jdbc.SQLServerDriver

Есть ли простой способ (без написания bash-скриптов) раздать jar-файлы с пакетами по всему кластеру? Я бы хотел, чтобы Spark мог распространять его сам (или, может быть, он это делает, но я не знаю, как это сделать).


person mrjoseph    schedule 21.05.2019    source источник
comment
Я просто хочу, чтобы те, кто голосует, могли прочитать весь пост или дать объяснение, прежде чем голосовать против.   -  person mrjoseph    schedule 22.05.2019


Ответы (1)


В Spark есть средство чтения формата jdbc, которое вы можете использовать.

запустите оболочку scala, чтобы подтвердить, что ваш драйвер MS SQL Server находится в вашем пути к классам

пример

Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver")

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

пример

bin/spark-shell --driver-class-path postgresql-9.4.1207.jar --jars postgresql-9.4.1207.jar

Подключитесь к вашему MS SQL Server через Spark jdbc

пример через искровой питон

# option1
jdbcDF = spark.read \
    .format("jdbc") \
    .option("url", "jdbc:postgresql:dbserver") \
    .option("dbtable", "schema.tablename") \
    .option("user", "username") \
    .option("password", "password") \
    .load()

# option2
jdbcDF2 = spark.read \
    .jdbc("jdbc:postgresql:dbserver", "schema.tablename",
          properties={"user": "username", "password": "password"})

особенности и дополнительные способы компиляции строк подключения можно найти здесь

https://spark.apache.org/docs/latest/sql-data-sources-jdbc.html

вы упомянули jupyter ... если вы все еще не можете заставить вышеперечисленное работать, попробуйте установить некоторые env vars через этот пост (хотя не могу подтвердить, работает ли это)

https://medium.com/@thucnc/pyspark-in-jupyter-notebook-working-with-dataframe-jdbc-data-sources-6f3d39300bf6

в конце концов все, что вам действительно нужно, — это класс драйвера, размещенный на граничном узле (клиенте, где вы запускаете spark), и добавьте его к вашему пути к классам, затем установите соединение и распараллелите свой фрейм данных для масштабирования производительности, поскольку jdbc из rdbms читает данные как один поток, следовательно, 1 раздел

person thePurplePython    schedule 22.05.2019
comment
Спасибо! Я также нашел хороший обходной путь, передав путь к файлу jar в конфигурации сеанса Spark, например: spark.stop() spark = (SparkSession .builder .appName(Test App) .master('yarn-client') .config(spark .executor.cores, 4) .config(spark.executor.instances, 2) .config(spark.sql.shuffle.partitions,8) .config(spark.jars, /opt/cloudera/parcels/SPARK2/lib/spark2 /jars/sqljdbc42.jar) .enableHiveSupport() .getOrCreate()) - person mrjoseph; 22.05.2019
comment
отлично! рад, что вы нашли решение. - person thePurplePython; 22.05.2019