在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笔记本连接到oracle数据库,是否缺少任何步骤?
2条答案
按热度按时间hec6srdp1#
您可以使用这个解决方案,首先将jdbc驱动程序上传到s3 bucket并复制链接,然后在第一个单元格中指定jars文件(首先执行)。例如,我为mssqljdbc驱动程序做了这个(这里需要oracle)。
另外,下面是从jdbc读取的代码片段。
8aqjt8rx2#
您已将jar保留在主节点上。当您在主节点上从cli运行时,您的应用程序主节点将被 Package 为
yarn-client
模式。因此它将在主节点中,并且可以访问主节点中的文件。现在,当您通过默认的代码运行emr提交为
yarn-cluster
模式,你不能改变。这一次,应用程序主机是在一个核心节点上创建的,而在这个核心节点上jar不存在。所以它不能从jar中读取类。那么什么是解决方案:
将jdbcjar放在每个核心节点上,因为您永远不知道应用程序主节点是在哪个核心节点上创建的。
注意:这是最糟糕的方法之一。不推荐,因为这将很难管理
将jar放入hdfs并通过
hdfs:///<location>/ojdbc6.jar
将jar放入s3并通过s3://<bucket-name>/<location>/ojdbc6.jar