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 的元数据?