Apache Spark 是直接从 RDBMS 处理数据的正确选择吗?

Posted

技术标签:

【中文标题】Apache Spark 是直接从 RDBMS 处理数据的正确选择吗?【英文标题】:Is Apache Spark a right option for processing data directly from RDBMS? 【发布时间】:2018-08-28 08:08:58 【问题描述】:

我已经完成了一个关于如何直接使用 Apache Spark 与 RDBMS [mysql] 交互的 POC。我能够使用以下代码从 spark-shell 与 MySQL 数据库进行交互:

>>> empDF = spark.read.format("jdbc").option("url", "jdbc:mysql://localhost:3306/SPARKPOC").option("dbtable", "SPARKPOC.EMP").option("user", "myuser").option("password", "mypassword").option("driver", "com.mysql.jdbc.Driver").load()

>>> empDF.printSchema()
root
 |-- EMPNO: integer (nullable = true)
 |-- ENAME: string (nullable = true)
 |-- JOB: string (nullable = true)
 |-- MANAGERID: integer (nullable = true)
 |-- SALARY: double (nullable = true)
 |-- PHONE: long (nullable = true)
 |-- DEPTNO: integer (nullable = true)

>>> empDF.show()
18/08/27 22:16:47 WARN SizeEstimator: Failed to check whether UseCompressedOops is set; assuming yes
+-----+----------+---------+---------+------+-----------+------+
|EMPNO|     ENAME|      JOB|MANAGERID|SALARY|      PHONE|DEPTNO|
+-----+----------+---------+---------+------+-----------+------+
| 7369|     SMITA|    CLERK|     7902| 800.0| 9567342250|    20|
| 7499|     ANKUR| SALESMAN|     7698|1600.0|95673422300|    30|
| 7521|     VIJAY| SALESMAN|     7698|1250.0|95673422500|    30|
| 7566|      AJAY|  MANAGER|     7839|2975.0|       null|    20|

同样,我还能够使用 Apache Spark 执行查询并从 MySQL 获取所需的结果。

我正在寻找更清晰的内容:

spark 是否一次性从 RDBMS 中读取数据,将其存储在内存中,然后进行处理?

如果 Apache Spark 从 MySQL 读取数据之间连接失败怎么办?如果在两者之间有一些网络连接失败,Spark 是自己从头开始这个过程,还是我重新运行整个作业?

任何快速参考将不胜感激。

问候, 布佩什

【问题讨论】:

第一:一个问题太多,第二:主要是基于意见,对不起,它可能会关闭 即使我同意... 【参考方案1】:

Spark 在从任何 rdbms 读取数据时创建与服务器的并行连接,并行会话的数量取决于以下参数

numPartitions PartitionColumn - 它应该是一个数字列 下界 上界

数据将从rdbms并行读取,一次读取多少条记录可以通过控制

fetchsize参数

始终建议将您各自的查询推送到数据库并让数据库处理优化,而不是直接在 dbtable 选项中提供表名。

如果您的连接失败,则无需重新运行您的作业。 Spark 将重试连接并读取数据

【讨论】:

感谢您的快速和乐于助人的响应 Chandan。 如果您在编码方面需要任何帮助,请告诉我。如果这有帮助,请接受答案并考虑投票 感谢您快速而有帮助的回复。您能否帮助我理解您的评论 - “始终建议将您各自的查询推送到数据库并让数据库处理优化,而不是直接在 dbtable 选项中提供表名。”您是否可以提供任何参考/链接,以便我可以在这方面获得更多信息?此外,如果 Spark 将查询推送到数据库,将如何实现并行性?它的执行速度是否会比使用 Spark [在 Spark 集群内的内存中] 处理数据更快? 虽然我没有任何官方文档。我的意思是,在从数据库中获取数据时,让数据库优化查询并为您提供结果,然后您可以将其保存在数据框中并使用 spark 进行内存处理。如果您有一些复杂的查询,那么最好将其传递给数据库本身

以上是关于Apache Spark 是直接从 RDBMS 处理数据的正确选择吗?的主要内容,如果未能解决你的问题,请参考以下文章

Apache Spark 在 YARN 中部署时如何处理系统故障?

如何获取有关当前执行程序 Apache-Spark 的元数据?

连接到 RDBMS 时在 Spark 中进行分区

Spark通过JDBC读取RDBMS时是不是有参数分区?

spark streaming从指定offset处消费Kafka数据

Apache Sqoop 和 Spark