【问题标题】:Why spark is slower when compared to sqoop , when it comes to jdbc?对于 jdbc,为什么 spark 比 sqoop 慢?
【发布时间】:2019-10-10 19:27:41
【问题描述】:

据了解,在从 oracle db 迁移/加载到 hdfs/parquet 时,最好使用 SQOOP 而不是带有 JDBC 驱动程序的 SPARK。

Spark 在处理时应该快 100 倍吧? 那么 Spark 有什么问题呢? 为什么人们在从 oracle db 表中加载数据时更喜欢 SQOOP?

请建议我在从 oracle 加载数据时应该如何使 Spark 更快。

【问题讨论】:

标签: apache-spark jdbc sqoop datastax


【解决方案1】:

Spark 在知道如何并行化查询时速度很快。如果您只是执行单个查询,那么 Spark 不知道该怎么做。使用spark.read.jdbc读取数据时,可以通过使用参数lowerBoundupperBoundnumPartitions来提高速度,但这实际上取决于表的设计。

您可以找到更多文档here

【讨论】:

    【解决方案2】:

    亚历克斯的回答已经涵盖了重点。

    我只是想添加一个例子,

    from pyspark.sql import SparkSession
    
    spark = SparkSession.builder.master("local[4]").appName("Test-JDBC").getOrCreate()
    
    ds = spark.read.jdbc("jdbc:mysql://localhost:3306/stackexchange", "(select min(id), max(id) from post_history) as ph",
                         properties={"user": "devender", "password": "*****", "driver": "com.mysql.jdbc.Driver"})
    
    r = ds.head()
    minId = r[0]
    maxId = r[1]
    
    ds = spark.read.jdbc("jdbc:mysql://localhost:3306/stackexchange", "(select * from post_history) as ph",
                         properties={"user": "devender", "password": "*****", "driver": "com.mysql.jdbc.Driver"},
                         numPartitions=4, column="id", lowerBound=minId, upperBound=maxId)
    
    count = ds.count()
    print(count)
    

    更多详情,https://gist.github.com/devender-yadav/5c4328918602b7910ba883e18b68fd87


    注意:Sqoop 自动执行边界查询以获取 split by 列的 MIN、MAX 值(该查询也可以被覆盖)

    【讨论】:

    • 谢谢,但有什么方法可以动态推导出 numPartitions 吗?
    • 没有通用方法。您需要根据记录数(源端)、spark(yarn)的最大并发作业运行数和最大并发数据库连接数来创建算法。
    猜你喜欢
    • 2017-02-21
    • 1970-01-01
    • 1970-01-01
    • 2018-07-26
    • 2016-10-29
    • 2011-03-23
    • 1970-01-01
    • 2016-03-12
    相关资源
    最近更新 更多