【问题标题】:Bulk data migration through Spark SQL通过 Spark SQL 进行批量数据迁移
【发布时间】:2016-12-26 23:45:07
【问题描述】:

我目前正在尝试通过 Spark SQL 将一个非常大的 MySQL 表的内容批量迁移到 parquet 文件中。但是这样做时,我很快就会耗尽内存,即使将驱动程序的内存限制设置得更高(我在本地模式下使用 spark)。示例代码:

Dataset<Row> ds = spark.read()
    .format("jdbc")
    .option("url", url)
    .option("driver", "com.mysql.jdbc.Driver")
    .option("dbtable", "bigdatatable")
    .option("user", "root")
    .option("password", "foobar")
    .load();

ds.write().mode(SaveMode.Append).parquet("data/bigdatatable");

Spark 似乎试图将整个表格内容读入内存,但效果并不好。那么,通过 Spark SQL 进行批量数据迁移的最佳方法是什么?

【问题讨论】:

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


【解决方案1】:

在您的解决方案中,Spark 会在开始写入之前将整个表内容读入一个分区。一种避免这种情况的方法是对读取部分进行分区,但它需要源数据中的数字顺序列:

Dataset<Row> ds = spark.read()
  .format("jdbc")
  .option("url", url)
  .option("driver", "com.mysql.jdbc.Driver")
  .option("dbtable", "bigdatatable")
  .option("user", "root")
  .option("password", "foobar")
  .option("partitionColumn", "NUMERIC_COL")
  .option("lowerBound", "1")
  .option("upperBound", "10000")
  .option("numPartitions", "64")
  .load();

在上面的示例中,“NUMERIC_COL”列必须存在于数据中,理想情况下,它应该从 1 到 10000 均匀变化。当然,这是很多要求,可能不存在这样的列,因此,您可能应该在数据库中创建一个具有类似列的视图,或者将其添加到查询中(请注意,我使用了通用 SQL 语法,您必须适应您的 DBMS):

String query = "(select mod(row_number(), 64) as NUMERIC_COL, * from bigdatatable) as foo"

Dataset<Row> ds = spark.read()
  .format("jdbc")
  .option("url", url)
  .option("driver", "com.mysql.jdbc.Driver")
  .option("dbtable", query)
  .option("user", "root")
  .option("password", "foobar")
  .option("partitionColumn", "NUMERIC_COL")
  .option("lowerBound", "0")
  .option("upperBound", "63")
  .option("numPartitions", "64")
  .load();

【讨论】:

  • 其实这可能是不正确的。例如,oracle 中的 row_number() 是结果集中的排序。由于您的查询没有 order by,因此您不能假设查询的 order 在每个查询中都是相同的,即使看起来确实如此。您需要使用的是 row_id,即固定不变的行,而不是 rownum。
  • 如何概括这一点,如果我们有 100 个表,我们需要将 100 个表的全部内容复制 100 次...有没有更好的方法来使用连接池之类的东西
猜你喜欢
  • 2011-10-12
  • 2016-10-09
  • 2021-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-24
  • 1970-01-01
  • 2016-09-17
相关资源
最近更新 更多