【问题标题】:Spark and JDBC: Iterating through large table and writing to hdfsSpark 和 JDBC:遍历大表并写入 hdfs
【发布时间】:2017-11-25 15:04:35
【问题描述】:

使用 spark 复制大型关系表的内容然后以 parquet 格式(不使用 sqoop)写入分区 Hive 表的最节省内存的方法是什么。我有一个基本的 spark 应用程序,我已经使用 spark 的 jdbc 进行了一些其他调整,但是关系表中的数据仍然是 0.5 TB 和 20 亿条记录,所以我虽然可以延迟加载整个表,但我试图弄清楚如何有效地按日期分区并保存到 hdfs 而不会遇到内存问题。因为来自 spark 的 jdbc load() 会将所有内容加载到内存中,所以我正在考虑循环访问数据库查询中的日期,但仍然不确定如何确保我不会耗尽内存。

【问题讨论】:

  • 你得到这个问题的答案了吗?

标签: apache-spark hive hdfs apache-spark-sql spark-dataframe


【解决方案1】:

如果您需要使用 Spark,您可以在您的应用程序中添加 date 参数以按日期过滤表格,并为每个日期循环运行您的 Spark 应用程序。您可以为此循环使用 bash 或其他脚本语言。

这可能看起来像:

  • foreach 日期中的日期
    • spark-submit 带有date 参数的应用程序
    • spark.read.jdbc读取数据库表
    • 使用filter方法按date过滤
    • 使用df.write.parquet("hdfs://path")将结果写入HDFS

另一种选择是使用不同的技术,例如使用 JDBC 和 DB 游标实现 Scala 应用程序来遍历行并将结果保存到 HDFS。这更复杂,因为您需要解决与写入 Parquet 格式和使用 Scala 保存到 HDFS 相关的问题。如果您愿意,我可以提供负责写入 Parquet 格式的 Scala 代码。

【讨论】:

  • 但是如果我循环遍历一个日期数组并在这些日期循环jdbc.read,我不会继续用每个连续的load() 语句来不断地填满内存吗?还有别的意思吗?
  • 我的意思是用某种脚本语言运行这个循环,例如 bash 和 sumbitting 你的 Spark 应用程序,所以我不是说在 Scala 中实现这个循环,因为确实你仍然会遇到内存问题。
猜你喜欢
  • 2020-09-15
  • 2018-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-29
  • 2021-07-11
  • 1970-01-01
相关资源
最近更新 更多