在不使用 Sqoop 的情况下在 HDFS 中加载 Oracle 数据

Posted

技术标签:

【中文标题】在不使用 Sqoop 的情况下在 HDFS 中加载 Oracle 数据【英文标题】:Loading Oracle data in HDFS without Sqoop 【发布时间】:2019-07-29 07:58:39 【问题描述】:

我想将数据从 Oracle 数据库导入到我们的 Hadoop HDFS,并考虑使用 Sqoop。当我尝试时,我发现 Oracle 和 Hadoop 的数据连接器已断开连接。

2019-07-18 09:19:58,203 [uber-SubtaskRunner] INFO org.apache.sqoop.manager.oracle.OraOopManagerFactory - Data Connector for Oracle and Hadoop is disabled.

我联系了系统管理员,他告诉我,我们的 Sqoop 目前没有为 Oracle 数据库配置,也不会配置。相反,他们建议使用下面的 pyspark 脚本。

我在我们的 CDSW 上使用了提到的脚本,它在我的一些配置中运行得非常好。


import os
import netrc
from pyspark.sql import SparkSession

'''Set up the pyspark dependencies: In order to connect to the Oracle DB 
via JDBC we are going to need the jar provided by Oracle'''
ORACLE_JAR = "ojdbc7.jar"


JAR_LOC = os.path.join(os.environ["JARS_DIR"], ORACLE_JAR)

#Create a SparkSession
spark = SparkSession.builder \
    .appName("My Sample App") \
    .config("spark.jars", "local://" + JAR_LOC) \
    .getOrCreate()

# Set the Exadata host to which you are connecting to
db_host = "exadata.host.address"

#Read the values from the .netrc 
user, account, password = netrc.netrc().authenticators(db_host)

# Check the Spark version and other config information
spark.sparkContext.getConf().getAll()
driver = "oracle.jdbc.OracleDriver"

#The SID of your database
sid = "mydb.sid.tns"
url = "/".join(["jdbc:oracle:thin:@/", db_host +":1521", sid])

# The query that you need to run
dbtable = "(select * from table)"

jdbc_df = spark.read.format("jdbc").option("url", url) \
                                   .option("driver", driver) \
                                   .option("dbtable", dbtable) \
                                   .option("user", user) \
                                   .option("password", password).load()

我的问题是:与 Sqoop 或 Flume 相比,使用此 pyspark 脚本的相对优势/劣势是什么?

【问题讨论】:

***.com/questions/56288481/… 【参考方案1】:

使用 spark jdbc 从关系数据库读取数据比 SQOOP 快得多。这里有一些好处。

    您可以将所有读取、转换和写入操作组合到一个脚本/程序中,而不是通过 SQOOP 在一个脚本中单独读取,然后在另一个脚本中进行转换和写入。

    如果您希望以适当的方式对数据进行分区,您可以动态定义一个新的拆分列(使用 ORA_HASH 等函数)。

    您可以控制与数据库的连接数。增加连接数肯定会加快您的数据导入速度。

【讨论】:

【参考方案2】:

Sqoop 是一种数据摄取工具,它使用 mapreduce 技术,而 Spark 是革命性的,一种卓越的大数据处理工具,以其内存中执行和 DAG 智能性取代了 mapreduce,比磁盘计算快 10 倍。

谢谢 阿米特

【讨论】:

以上是关于在不使用 Sqoop 的情况下在 HDFS 中加载 Oracle 数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在不加载页面的情况下在一个页面中加载超过 1500 个产品?

如何在不使用公用文件夹和 php artisan 的情况下在 laravel graphql-playground 中加载 schema.graphql

在没有事件的情况下在 actionscript 中加载 xml 资产

有没有办法在没有 Internet 连接的情况下在 webview 中加载网站?

如何在没有 spring-boot 的情况下在 spring-webflux 中加载配置?

如何在不使用 URL 的情况下在 facebook 上分享我的新闻