如何将 AWS EMR 笔记本连接到 Oracle 数据库?
How can I connect AWS EMR Notebooks to Oracle Database?
在 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 笔记本连接到 Oracle 数据库,是否缺少任何步骤?
您可以使用此解决方案,首先将 jdbc 驱动程序上传到 s3 存储桶并复制 link,然后您可以在第一个单元格(首先执行)中指定 jars 文件。例如,我为 ms sql jdbc 驱动程序(这里需要 oracle)做了这个。
%%configure -f
{
"conf": {
"spark.jars": "s3://jar-test/mssql-jdbc-8.4.0.jre8.jar"
}
}
此外,这里是要阅读的片段 jdbc。
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()
您已将 jar 保存在主节点上。当您从 CLI 运行 进入主节点时,您的应用程序主节点将被创建为 yarn-client
模式。所以它将在主节点中,并且它可以访问 master-node.
中的文件
现在,当您通过代码 运行 默认情况下 EMR 提交为 yarn-cluster
模式时,您无法更改它。这次 application master 在其中一个 CORE 节点上创建,而在该 CORE 节点上 jar 不存在。所以它无法从 jar 中读取 Class。
那么解决方案是什么:
- 将 jdbc jar 放入每个 CORE 节点,因为您永远不知道应用程序主机是在哪个 CORE 节点创建的。
注意:这是最糟糕的方法之一。不推荐,因为很难管理
- 将 jar 放入 HDFS 并通过
hdfs:///<location>/ojdbc6.jar
访问它
- 将 jar 放入 S3 并通过
s3://<bucket-name>/<location>/ojdbc6.jar
访问它
在 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 笔记本连接到 Oracle 数据库,是否缺少任何步骤?
您可以使用此解决方案,首先将 jdbc 驱动程序上传到 s3 存储桶并复制 link,然后您可以在第一个单元格(首先执行)中指定 jars 文件。例如,我为 ms sql jdbc 驱动程序(这里需要 oracle)做了这个。
%%configure -f
{
"conf": {
"spark.jars": "s3://jar-test/mssql-jdbc-8.4.0.jre8.jar"
}
}
此外,这里是要阅读的片段 jdbc。
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()
您已将 jar 保存在主节点上。当您从 CLI 运行 进入主节点时,您的应用程序主节点将被创建为 yarn-client
模式。所以它将在主节点中,并且它可以访问 master-node.
现在,当您通过代码 运行 默认情况下 EMR 提交为 yarn-cluster
模式时,您无法更改它。这次 application master 在其中一个 CORE 节点上创建,而在该 CORE 节点上 jar 不存在。所以它无法从 jar 中读取 Class。
那么解决方案是什么:
- 将 jdbc jar 放入每个 CORE 节点,因为您永远不知道应用程序主机是在哪个 CORE 节点创建的。
注意:这是最糟糕的方法之一。不推荐,因为很难管理 - 将 jar 放入 HDFS 并通过
hdfs:///<location>/ojdbc6.jar
访问它
- 将 jar 放入 S3 并通过
s3://<bucket-name>/<location>/ojdbc6.jar
访问它