【问题标题】:Inserts into Redshift using spark-redshift使用 spark-redshift 插入 Redshift
【发布时间】:2018-07-17 15:08:23
【问题描述】:

我正在尝试从 S3(镶木地板文件)插入 Redshift 数据。通过 SQLWorkbench 完成 600 万行需要 46 秒。但是通过连接器 spark-redshift 完成它大约需要 7 分钟。

我正在尝试使用更多节点并获得相同的结果。

对使用 spark-redshift 改进时间有什么建议吗?

Spark 中的代码:

val df = spark.read.option("basePath", "s3a://parquet/items").parquet("s3a://parquet/items/Year=2017/Month=7/Day=15")

df.write
      .format("com.databricks.spark.redshift")
      .option("url", "jdbc:....")
      .option("dbtable", "items")
      .option("tempdir", "s3a://parquet/temp")
      .option("aws_iam_role", "...")
      .option("sortkeyspec", "SORTKEY(id)")
      .mode(SaveMode.Append)
      .save()

SQLWorkbench(Redshift SQL)中的代码:

CREATE EXTERNAL TABLE items_schema.parquet_items("id type, column2 type....")
ROW FORMAT DELIMITED FIELDS TERMINATED BY '|'
STORED AS PARQUET
LOCATION 's3://parquet/items/Year=2017/Month=7/Day=15';

CREATE TABLE items ("id type, column2 type....");

INSERT INTO items (SELECT * FROM items_schema.parquet_items); 

【问题讨论】:

  • 在 aws 控制台上检查 - redshift 以查看 redshift 复制命令通过每种方法所花费的时间 - 还要检查生成的复制命令的数量。
  • 您是否使用 Spectrum 将镶木地板作为 Redshift 中的外部表读取?请提供一个示例,说明您在 SQLWorkbench 中运行的内容以及使用 spark-redshift 时正在运行的内容。
  • @JoeHarris 我编辑了问题并添加了代码以提供更多信息。
  • 什么是spark集群和redshift集群配置
  • 我发现自己也在做类似的事情。但是,我被建议写出镶木地板并使用复制命令来读取大文件。原因是 redshift 复制命令经过优化,可以按列扫描数据,压缩有助于提高效率。不知道 spark-redshift 怎么写的细节

标签: apache-spark amazon-redshift amazon-redshift-spectrum


【解决方案1】:

我会说你的 sn-ps 贴错标签了:

  • 这是 Spark 代码val df = spark.read…
  • 这是 Redshift SQL CREATE EXTERNAL TABLE…

当您使用外部表 (Redshift Spectrum) 时,它会执行以下操作:

  • 在定义的位置读取镶木地板数据。
  • 将数据插入到正常的 Redshift 表中,如图所示。

当您使用 Spark 代码将数据写入 Redshift 时,使用 spark-redshift,它会执行以下操作:

  • Spark 将 Parquet 文件从 S3 读取到 Spark 集群中。
  • Spark 将 parquet 数据转换为 Avro 格式并将其写入 S3。
  • Spark 向 Redshift 发出 COPY SQL 查询以加载数据。
  • Redshift 将 Avro 数据从 S3 加载到最终表中。

基本上,Spark 代码做了很多工作,两次读取数据并以不同格式写入两次。 Redshift Spectrum SQL 读取数据一次,然后将其写入 Redshift 本身(比通过网络发送到 S3 快得多)。

【讨论】:

  • 抱歉贴错标签,我已经编辑过了。谢谢你的回答。
  • 虽然标记为答案,但我对“当您使用外部表 (Redshift Spectrum) 时,它会执行以下操作”的解释感到不舒服。 ---- 频谱内部使用了一个名为“频谱工作者”的集群,我怀疑它是一个隐藏的 EMR 集群/运行 hive LLP 的 Athena。所以这取决于任务是如何被分配和沟通的——redshift 可能在这两个点上执行了一些超级棒的优化,而 EMR 上的 spark 代码可能没有针对这些点进行调整
  • 因为这个库在向/从 Redshift 传输数据时读取和写入数据到 S3。我可以在一些帖子中看到,您可以使用一些 hadoop 配置优化 Spark 会话以使用 S3:spark.sparkContext.hadoopConfiguration.set("fs.s3a.fast.upload", "true")。对此有何建议或意见?
【解决方案2】:

另外,尝试使用 CSV 而不是 Avro(这是默认设置)应该更快:

加载 CSV 时 Redshift 比加载时快得多 Avro 文件,因此使用该临时格式可能会提供较大的性能 写入 Redshift 时提升。

https://docs.databricks.com/spark/latest/data-sources/aws/amazon-redshift.html

【讨论】:

  • 谢谢,我也试过了,但这是一个实验选项。
猜你喜欢
  • 1970-01-01
  • 2016-11-13
  • 1970-01-01
  • 2017-04-17
  • 2016-06-14
  • 1970-01-01
  • 1970-01-01
  • 2016-10-28
  • 1970-01-01
相关资源
最近更新 更多