【问题标题】:How can I connect AWS EMR Notebooks to Oracle Database?如何将 AWS EMR Notebooks 连接到 Oracle 数据库?
【发布时间】:2020-12-16 02:17:37
【问题描述】:

在 CLI 中,我移至 hadoop 目录(在 EMR 中)并下载了 ojdbc.jar 文件。我尝试使用下面的 spark shell 命令连接 Oracle DB:

pyspark \
--jars "/home/hadoop/ojdbc6.jar" \
--master yarn-client \
--num-executors 5 \
--driver-memory 14g \
--executor-memory 14g \

df = spark.read \
          .format("jdbc") \
          .option("url", "jdbc:oracle:thin:USER/HOST@//IP:PORT/SERVICE") \
          .option("dbtable", "TABLE") \
          .option("user", "USER") \
          .option("password", "PASSWORD") \
          .option("driver", "oracle.jdbc.driver.OracleDriver") \
          .load()

它可以工作,但使用终端对我来说不方便。所以我想将 EMR Notebooks 连接到 Oracle DB 并尝试以下代码:

from pyspark import SparkContext, SparkConf

spark_conf = SparkConf().setAll([('spark.pyspark.python', 'python3'), 
                                 ('spark.pyspark.virtualenv.enabled', 'true'), 
                                 ('spark.pyspark.virtualenv.type', 'native'), 
                                 ('spark.pyspark.virtualenv.bin.path', '/usr/bin/virtualenv'), 
                                 ('spark.driver.extraClassPath', '/home/hadoop/ojdbc6.jar')])\
                        .setAppName('SparkJob')
sc = SparkContext.getOrCreate(conf=spark_conf)

df = sqlContext.read \
               .format("jdbc") \
               .options(url="jdbc:oracle:thin:USER/HOST@//IP:PORT/SERVICE", 
                        dbtable="TABLE", 
                        user="USER", 
                        password="PASSWORD", 
                        driver = "oracle.jdbc.driver.OracleDriver") \
               .load()

得到一个错误:

An error occurred while calling o97.load.
: java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver

为了从 EMR Jupyter Notebooks 连接到 Oracle DB,是否缺少任何步骤?

【问题讨论】:

    标签: apache-spark pyspark jupyter-notebook amazon-emr


    【解决方案1】:

    你可以使用这个解决方案,首先将jdbc驱动上传到s3桶并复制链接,然后你可以指定第一个单元格中的jar文件(首先执行)。例如,我为 ms sql jdbc 驱动程序做了这个(你需要 oracle 在这里)。

    %%configure -f
    {
        "conf": {
            "spark.jars": "s3://jar-test/mssql-jdbc-8.4.0.jre8.jar"        
        }
    }
    

    另外,这里是从 jdbc 读取的 sn-p。

    from pyspark import SparkConf, SparkContext
    from pyspark.sql import SQLContext, SparkSession, Window, DataFrame,Row
    
    
    spark_session = SparkSession\
        .builder\
        .appName("test") \
        .getOrCreate()     
    
    
    
    spark_context = spark_session.sparkContext
    sql_context = SQLContext(spark_context)
    
    df = sql_context.read.format("jdbc") \
        .option("url", "jdbc:sqlserver://<public-dns>:<port>") \
        .option("driver", "com.microsoft.sqlserver.jdbc.SQLServerDriver") \
        .option("dbtable","<table-name>") \
        .option("user", "<username>") \
        .option("password", "<password>") \
        .load()
    

    【讨论】:

    • 非常棒的解决方案!
    【解决方案2】:

    您已将 jar 保存在主节点上。当您从 CLI 运行时,您在主节点上,您的应用程序主节点将被创建为 yarn-client 模式。所以它将在主节点中,并且可以访问主节点中的文件。

    现在,当您通过代码运行时,默认情况下 EMR 提交为 yarn-cluster 模式,您无法更改它。这次在 CORE 节点之一上创建的应用程序主节点和该 CORE 节点上的 jar 不存在。所以它无法从 jar 中读取 Class。

    那么解决方法是什么:

    1. 将 jdbc jar 放入每个 CORE 节点,因为您永远不知道应用程序主节点是在哪个 CORE 节点中创建的。
      注意:这是最糟糕的方法之一。不推荐,因为它很难管理
    2. 将jar放入HDFS并通过hdfs:///&lt;location&gt;/ojdbc6.jar访问
    3. 将jar放入S3并通过s3://&lt;bucket-name&gt;/&lt;location&gt;/ojdbc6.jar访问

    【讨论】:

      猜你喜欢
      • 2016-08-25
      • 2020-08-05
      • 2020-04-22
      • 2022-08-24
      • 2020-01-26
      • 2010-09-10
      • 1970-01-01
      • 1970-01-01
      • 2020-01-06
      相关资源
      最近更新 更多