如何将AWS EMR笔记本连接到Oracle数据库?

问题描述

在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笔记本连接到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 Notebook连接到Oracle DB,是否还有任何遗漏的步骤?

解决方法

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

SELECT
    Givers.AccountNo,Givers.GMob,COALESCE(SUM(Yateem.Money),0) AS YateemMoney,0) * '3' AS MonWant
FROM
    Givers
LEFT JOIN 
    Yateem ON Givers.AccountNo = Yateem.AccountNo
GROUP BY 
    Givers.AccountNo,Givers.GMob
HAVING 
    COALESCE(COUNT(Yateem.Money),0) > '0' 
    AND (AccountNo NOT IN (SELECT AccountNo FROM TakeMoney 
                           WHERE date LIKE '10-10-2020') 
         OR COALESCE(COUNT(Yateem.Money),0) * '3' > (SELECT COALESCE(SUM(MoneyTaken),0) 
                                                      FROM TakeMoney 
                                                      WHERE date LIKE '10-10-2020')

此外,这是从jdbc读取的代码段。

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

您已将jar保留在主节点上。从CLI运行时,您位于主节点上,您的应用程序主目录被设置为yarn-client模式。因此它将位于主节点中,并且可以访问主节点中的文件。

现在,当您默认通过代码运行时,EMR以yarn-cluster模式提交,您将无法更改它。这次,应用程序主服务器在CORE节点之一上创建,并且在该CORE节点上不存在jar。因此它无法从罐子中读取课程。

那是什么解决办法:

  1. 将jdbc jar放入每个CORE节点,因为您永远不知道应用程序主数据库是在哪个CORE节点中创建的。 注意:这是最糟糕的方法之一。不建议使用,因为它很难管理
  2. 将罐子放入HDFS并通过hdfs:///<location>/ojdbc6.jar
  3. 进行访问
  4. 将罐子放入S3并通过s3://<bucket-name>/<location>/ojdbc6.jar
  5. 进行访问