在没有 Sqoop 的情况下将 Oracle 数据加载到 HDFS
Loading Oracle data in HDFS without Sqoop
我想将数据从 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 脚本的相关 advantages/disadvantages 是什么?
Sqoop 是一种数据摄取工具,它使用 mapreduce 技术,而 Spark 是一种革命性的大数据处理工具,它以内存中执行和比磁盘计算快 10 倍的 DAG 智能取代了 mapreduce。
谢谢
阿米特
使用 spark jdbc 从关系数据库读取数据比 SQOOP 快得多。这里有一些好处。
您可以将所有的读取、转换和写入操作合并为一个script/program,而不是在一个脚本中通过SQOOP 单独读取,然后在另一个脚本中进行转换和写入。
如果您希望以适当的方式对数据进行分区,您可以动态定义一个新的拆分列(使用 ORA_HASH 等函数)。
您可以控制数据库的连接数。增加连接数肯定会加快您的数据导入速度。
我想将数据从 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 脚本的相关 advantages/disadvantages 是什么?
Sqoop 是一种数据摄取工具,它使用 mapreduce 技术,而 Spark 是一种革命性的大数据处理工具,它以内存中执行和比磁盘计算快 10 倍的 DAG 智能取代了 mapreduce。
谢谢 阿米特
使用 spark jdbc 从关系数据库读取数据比 SQOOP 快得多。这里有一些好处。
您可以将所有的读取、转换和写入操作合并为一个script/program,而不是在一个脚本中通过SQOOP 单独读取,然后在另一个脚本中进行转换和写入。
如果您希望以适当的方式对数据进行分区,您可以动态定义一个新的拆分列(使用 ORA_HASH 等函数)。
您可以控制数据库的连接数。增加连接数肯定会加快您的数据导入速度。