Apache Sqoop 和 Spark

Apache Sqoop and Spark

为了将大型 SQL 数据加载到 Spark 以进行转换和机器学习,以下选项中哪个选项在性能方面更好。
选项 1:使用 Spark SQL JDBC 连接器直接加载 SQL 数据到 Spark。
选项 2:使用 Sqoop 将 SQL 数据以 csv 格式加载到 HDFS,然后使用 Spark 从 HDFS 读取数据。

请建议以上哪一项是将大型 SQL 数据加载到 Spark 的好方法。

我从未使用过 Squoop,但答案可能取决于您的用例。对于您想要从 Spark 查询一些关系 SQL 数据的单个作业,您应该只使用内置的 JDBC 连接器。这就是分析数据库的全部意义所在:它是一种以统一结构存储大量记录的方式,以便可以快速准确地查询。

如果您的 SQL 数据库和您的 Spark 集群之间存在网络限制,并且 运行 大量作业脱离了结果数据集,并且试图尽量减少对您的数据库的请求,这可能是有意义的首先传输数据。一个可能值得构建复制任务的实际示例(听起来它不适用于您的情况)可能是您的数据库和集群位于单独的防火墙后面。

另外一个注意事项。如果您决定需要先将数据复制到文件中,您可能应该考虑 CSV 的替代方法。研究像 Parquet 这样的格式可能提供的一些好处,特别是如果您正在寻找 transfer/store/query 一个非常大的面向柱状的数据集。

如果你想进一步使用Spark进行转换&ML,你可以使用spark sql将数据加载到hdfs中或者你可以创建hive table directly.It会很容易写相同的代码 project.Followings 是我对性能的观察:

1.I 已使用 39 GB table 进行迁移以进行比较,因为我有 300 GB 内存和 50 个核心集群,因此 sqoop 和 spark 性能相同。两个作业都用了 12 分钟来迁移 hive 中的数据 table.I 希望如果我们有大量的内存和内核,那么处理速度至少会提高 20-30%。 2. 另一个优点是我们可以在同一个spark脚本中编写验证代码。

我建议使用 Sqoop 将数据提取到 HDFS,然后使用 Spark 对其进行分析,从下面的观察可以看出,我从 [=45= 导入了一个 32 GB table 样本] 到 HDFS。 同样如 chet 所建议的,您可以或应该在导入时使用 Parquet 文件格式,因为它大大减少了文件大小,如这些观察结果所示。

Mysql 数据库 Table “EMP_TEST”,记录数和大小 大小约为 32.7 GB,记录数约为 7750 万条。

Table Size and no. of Records

使用 Sqoop 导入 HDFS,如下所示。 当使用 sqoop 导入到 HDFS 时,它 运行 很顺利,大约需要 8 分钟才能完成。 默认情况下,sqoop 使用“snappy”压缩(如日志中所示),HDFS 中文件的总大小仅为 320 MB 左右。

Files imported by sqoop

Sqoop execution details 1

Sqoop execution details 2

使用 Spark 导入 HDFS,如下所示。 当尝试使用 Spark 导入时,它惨遭失败,如下图所示。

Import using Spark 1

Import using Spark 2

Import using Spark 3

在 spark 中,当使用 sqoop 导入的 parquet 文件创建数据帧时,它运行非常流畅,如下所示。

DataFrame created in Spark using data imported using sqoop