为了将大型SQL数据加载到Spark上进行转换&ML以下选项中的哪一个在性能方面更好
选项1:使用Spark SQL JDBC连接器将SQLData直接加载到Spark
选项2:使用Sqoop以csv格式将SQLData加载到HDFS,然后使用Spark从HDFS读取数据。
请建议以上哪种方法是将大型SQL数据加载到Spark的好方法。
我从未使用过Squoop,但答案可能取决于您的用例。对于只想从Spark查询一些关系SQL数据的单个作业,您应该只使用内置的JDBC连接器。这就是分析数据库的全部意义:它是一种以统一结构存储大量记录的方法,可以快速准确地查询。
如果您的SQL数据库和Spark集群之间存在网络限制,并且在结果数据集上运行了大量作业,并且试图最大限度地减少对数据库的请求,那么首先传输数据可能是有意义的。一个值得构建复制任务的实际例子(听起来它不适用于您的情况)可能是,如果您的数据库和集群位于单独的防火墙后面。
另一个注意事项。如果您决定需要先将数据复制到文件中,您可能应该考虑CSV的替代方案。了解Parquet这样的格式可能提供的一些好处,特别是如果您希望传输/存储/查询一个非常大的面向列的数据集。
如果您想进一步使用Spark进行转换&ML,您可以使用spark-sql在hdfs中加载数据,也可以直接创建配置单元表。在同一个项目中编写代码将很容易。以下是我对性能的观察:
1.我使用了39 GB的表进行迁移以进行比较,因为我有300 GB的内存和50核心集群,所以sqoop和spark的性能是相同的。两个作业都需要12分钟才能迁移配置单元表中的数据。我希望如果我们有大量的内存和内核,那么它将在处理速度上产生至少20-30%的差异。2.另一个优点是我们可以用相同的spark脚本编写验证代码。
我建议使用Sqoop将数据摄取到HDFS中,然后使用Spark对其进行分析,从下面的观察中可以看出,我已经将一个32GB的样本表从Mysql导入到HDFS。此外,正如chet所建议的那样,您可以或应该在导入时使用Parquet文件格式,因为它可以显著减小文件大小,如这些观察所示。
Mysql数据库表"EMP_TEST",记录数和大小大小约为32.7 GB,记录数量约为7750万。
表记录的大小和数量
使用Sqoop导入HDFS,如下所示。当使用sqoop导入HDFS时,它运行平稳,大约需要8分钟才能完成这个过程。默认情况下,sqoop使用"快速"压缩(如日志中所示),HDFS中文件的总大小仅为320 MB左右。
sqoop 导入的文件
Sqoop执行细节1
Sqoop执行细节2
使用Spark导入HDFS,如下所示。当尝试使用Spark导入时,失败得很惨,如下面的屏幕截图所示。
使用Spark 1 导入
使用Spark 2 导入
使用Spark 3 导入
在spark中,当使用sqoop导入的parquet文件创建数据帧时,它会非常平稳地运行,如下所示。
使用使用sqoop 导入的数据在Spark中创建DataFrame