Apache Sqoop 和 Spark

Posted

技术标签:

【中文标题】Apache Sqoop 和 Spark【英文标题】:Apache Sqoop and Spark 【发布时间】:2015-11-18 04:20:33 【问题描述】:

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

请建议以上哪种方法可以将大型 SQL 数据加载到 Spark。

【问题讨论】:

【参考方案1】:

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

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

另一个注释。如果您决定需要先将数据复制到文件中,您可能应该考虑 CSV 的替代方案。了解 Parquet 等格式可能提供的一些好处,尤其是当您希望传输/存储/查询一个非常大的面向列的数据集时。

【讨论】:

非常感谢。是的,正如您提到的,我们的数据库和集群位于不同的防火墙下,并且希望减少对 SQL 数据库的请求数量。我将尝试 Parquet 文件格式。谢谢 @Kazhiyur 太好了,那么尝试一下可能很有意义。如果你能找到绕过防火墙的方法,你总是可以直接试验 JDBC 作为以后的优化。如果我已经回答了这个问题,请随时将其标记为接受/赞成。【参考方案2】:

如果您想进一步使用Spark进行转换和ML,您可以使用spark sql将数据加载到hdfs中,也可以直接创建hive表。在同一个项目中编写代码会很容易。以下是我对性能的观察:

1.我使用 39 GB 的表进行迁移比较,因为我有 300 GB 内存和 50 个核心集群,所以 sqoop 和 spark 性能相同。这两项工作都花了 12 分钟来迁移 hive 表中的数据。我希望如果我们有大量的内存和核心,那么它在处理速度上至少会产生 20-30% 的差异。 2. 另一个好处是我们可以在同一个spark脚本中编写验证代码。

【讨论】:

【参考方案3】:

我建议使用 Sqoop 将数据摄取到 HDFS,然后使用 Spark 对其进行分析,从下面的观察中可以看出,我将一个 32 GB 示例表从 mysql 导入到 HDFS。 此外,正如 chet 所建议的那样,您可以或应该在导入时使用 Parquet 文件格式,因为从这些观察中可以看出它大大减少了文件大小。

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

Table Size and no. of Records

使用 Sqoop 导入 HDFS,如下所示。 使用 sqoop 导入 HDFS 时,运行平稳,完成过程大约需要 8 分钟。 默认情况下,sqoop 使用“快速”压缩(如日志所示),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时,运行非常流畅,如下图所示。

DataFrame created in Spark using data imported using sqoop

【讨论】:

以上是关于Apache Sqoop 和 Spark的主要内容,如果未能解决你的问题,请参考以下文章

Apache Sqoop 和 Spark

错误 - 使用 Apache Sqoop 和 Dataproc 从 SQL Server 导入 GCS

错误: 找不到或无法加载主类 org.apache.sqoop.Sqoop

Sqooop- 使用Sqoop进行数据的导入导出

Sqoop的安装及常用命令

sqoop