1
resposta

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

Olá pessoal,

Quem já passou por isso e puder me ajudar agradeço muito. Trata-se de um problema que estou passando na Empresa e na Internet o que falam pra fazer não resolveu.

Estou acessando um banco SQL Server, rodando via Jupyter Notebook localmente funciona normalmente, mas quando executo o mesmo código dentro do container Airflow recebo o erro:

py4j.protocol.Py4JJavaError: An error occurred while calling o44.load.
        java.lang.ClassNotFoundException: com.microsoft.sqlserver.jdbc.SQLServerDriver

Baixei o último driver jdbc do site da Microsoft, estou subido ele na pasta jars e faço referencia ao mesmo caminho ao criar a SparkSession.

        spark = (SparkSession
        .builder
        .appName("spark_pandas_load_table")
 **       .config("spark.jars","/usr/local/airflow/jars/mssql-jdbc-12.4.0.jre8.jar")**
        .config("spark.hadoop.fs.s3a.access.key", "AKIASZCDLCHKDF2LD6OA")
        .config("spark.hadoop.fs.s3a.secret.key", "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")
        .config("spark.hadoop.fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem")
        .config("spark.hadoop.fs.s3a.aws.credentials.provider", "org.apache.hadoop.fs.s3a.SimpleAWSCredentialsProvider")
        .getOrCreate()
)
[2023-11-15, 13:59:10 UTC] {spark_submit.py:495} INFO - spark session: <pyspark.sql.session.SparkSession object at 0x7fde59b45880>
[2023-11-15, 13:59:10 UTC] {spark_submit.py:495} INFO - jdbc_url: jdbc:sqlserver://10.100.105.106:50324;databaseName=DBA;user=datalakeuser;password=***;encrypt=false;SocketTimeout=10000
[2023-11-15, 13:59:11 UTC] {spark_submit.py:495} INFO - 23/11/15 13:59:11 INFO SharedState: Setting hive.metastore.warehouse.dir ('null') to the value of spark.sql.warehouse.dir.
[2023-11-15, 13:59:11 UTC] {spark_submit.py:495} INFO - 23/11/15 13:59:11 INFO SharedState: Warehouse path is 'file:/usr/local/airflow/spark-warehouse'.
[2023-11-15, 13:59:12 UTC] {spark_submit.py:495} INFO - Traceback (most recent call last):
[2023-11-15, 13:59:12 UTC] {spark_submit.py:495} INFO - File "/usr/local/airflow/dags/spark_scripts/spark_pandas_load_table.py", line 56, in <module>
[2023-11-15, 13:59:12 UTC] {spark_submit.py:495} INFO - df = ps.read_sql_table(schema_name, con=jdbc_url, options={"Driver":"com.microsoft.sqlserver.jdbc.SQLServerDriver"})
[2023-11-15, 13:59:12 UTC] {spark_submit.py:495} INFO - File "/home/airflow/.local/lib/python3.9/site-packages/pyspark/python/lib/pyspark.zip/pyspark/pandas/namespace.py", line 1441, in read_sql_table
[2023-11-15, 13:59:12 UTC] {spark_submit.py:495} INFO - sdf = reader.format("jdbc").load()
[2023-11-15, 13:59:12 UTC] {spark_submit.py:495} INFO - File "/home/airflow/.local/lib/python3.9/site-packages/pyspark/python/lib/pyspark.zip/pyspark/sql/readwriter.py", line 314, in load
[2023-11-15, 13:59:12 UTC] {spark_submit.py:495} INFO - return self._df(self._jreader.load())
[2023-11-15, 13:59:12 UTC] {spark_submit.py:495} INFO - File "/home/airflow/.local/lib/python3.9/site-packages/pyspark/python/lib/py4j-0.10.9.7-src.zip/py4j/java_gateway.py", line 1322, in __call__
[2023-11-15, 13:59:12 UTC] {spark_submit.py:495} INFO - return_value = get_return_value(
[2023-11-15, 13:59:12 UTC] {spark_submit.py:495} INFO - File "/home/airflow/.local/lib/python3.9/site-packages/pyspark/python/lib/pyspark.zip/pyspark/errors/exceptions/captured.py", line 179, in deco
[2023-11-15, 13:59:12 UTC] {spark_submit.py:495} INFO - return f(*a, **kw)
[2023-11-15, 13:59:12 UTC] {spark_submit.py:495} INFO - File "/home/airflow/.local/lib/python3.9/site-packages/pyspark/python/lib/py4j-0.10.9.7-src.zip/py4j/protocol.py", line 326, in get_return_value
[2023-11-15, 13:59:12 UTC] {spark_submit.py:495} INFO - raise Py4JJavaError(
**[2023-11-15, 13:59:12 UTC] {spark_submit.py:495} INFO - py4j.protocol.Py4JJavaError: An error occurred while calling o44.load.
[2023-11-15, 13:59:12 UTC] {spark_submit.py:495} INFO - : java.lang.ClassNotFoundException: com.microsoft.sqlserver.jdbc.SQLServerDriver**
1 resposta

Olá! Parece que o erro que você está enfrentando está relacionado à falta do driver JDBC do SQL Server no classpath do Spark quando executado dentro do container Airflow. Aqui estão algumas sugestões para resolver o problema:

  1. Verifique a Versão do Driver: Certifique-se de que a versão do driver JDBC que você baixou corresponde à versão do SQL Server que você está tentando acessar. Às vezes, versões incompatíveis podem causar esse tipo de erro.

  2. Coloque o Driver no Local Correto: Além de configurar o caminho do driver usando a configuração "spark.jars", certifique-se de que o arquivo JAR do driver realmente existe no caminho especificado no seu container Airflow. Isso é especialmente importante quando você está executando dentro de um ambiente de contêiner.

  3. Modifique o Caminho do Driver: Tente usar o caminho absoluto do sistema de arquivos local no seu container, em vez de um caminho relativo:

    .config("spark.jars", "file:/caminho/completo/para/o/seu/driver/mssql-jdbc-12.4.0.jre8.jar")
    
  4. Adicione o Driver ao Classpath: Você também pode tentar adicionar o driver ao classpath do Spark usando a propriedade spark.driver.extraClassPath. Modifique sua configuração da SparkSession para incluir esta opção:

    .config("spark.driver.extraClassPath", "/caminho/completo/para/o/seu/driver/mssql-jdbc-12.4.0.jre8.jar")
    

    Isso ajuda a garantir que o driver esteja disponível durante a execução do job Spark.

  5. Confirme o Caminho no Container: Se você está executando o Airflow dentro de um contêiner, verifique se o caminho do driver é acessível a partir do ambiente do contêiner. Pode ser necessário ajustar os volumes ou a configuração do contêiner para garantir que o caminho esteja correto.

  6. Use o Padrão "spark.driver.extraLibraryPath": Experimente também adicionar o caminho do driver ao spark.driver.extraLibraryPath:

    .config("spark.driver.extraLibraryPath", "/caminho/completo/para/o/seu/driver/")
    

    Isso pode ajudar a resolver problemas de carregamento de classes.

Depois de fazer essas alterações, teste novamente e veja se o problema persiste. Lembre-se de reiniciar o ambiente do Airflow após fazer alterações na configuração.