为啥从 Redshift 读取到 Spark 如此缓慢?

Posted

技术标签:

【中文标题】为啥从 Redshift 读取到 Spark 如此缓慢?【英文标题】:Why is reading from Redshift into Spark so slow?为什么从 Redshift 读取到 Spark 如此缓慢? 【发布时间】:2018-09-05 22:43:23 【问题描述】:

我在将数据从 AWS Redshift 读取到我的 Spark 集群时遇到问题。读取超时并导致火花作业失败。我正在使用以下内容将数据检索到数据框中:

def retrieveFromDate(date: String): org.apache.spark.sql.DataFrame = 
    val query = "tstamp >= '2018-01-01' and tstamp < '2018-01-02'"
    val predicates = Array[String](query)

    val props = new Properties()
    props.put("user", "username")
    props.put("password", "password")

    spark.read
        .jdbc(url=jdbcURL, 
              table="myschema.mytable", 
              predicates=predicates,
              connectionProperties=props)

以下查询直接在 SQL 中快速返回 2400 万行:

select * from myschema.mytable
WHERE tstamp >= '2018-08-01'
  AND tstamp < '2018-08-02';

在 Spark 中,当我对数据帧执行任何操作(包括 count)时,作业就会失败。

如果我提供额外的谓词,例如指定另一个 WHERE 子句,以便结果集非常小,一切正常。 当它直接在 SQL 中正常工作时,为什么这个查询在 spark 中这么慢?有什么办法可以将这么大的结果表从 redshift 加载到 spark 中吗?

我的开发 AWS EMR 集群包含一个 M4.xlarge 主节点和 2 个 M3.xlarge 工作节点。每个工作人员大约需要 15GB 内存和 8 个 cpu 内核。

【问题讨论】:

【参考方案1】:
>> The read is timing out and causing the spark job to fail

谓词参数只有

val query = "tstamp &gt;= '2018-01-01' and tstamp &lt; '2018-01-02'"

因此,作为单个任务的结果,结果数据帧是“1”的分区,它拥有 2400 万个。它没有并行性。

您能否更改并提供将 24M 数据分成多个块的谓词。那么,读取可以并行化吗?

类似的,

val query = Arry[String]("column >= value1 and column = value2 and column = value3 and column

如果您不想提供所有谓词,请将 jdbc 方法更改为以下类型并提供 lowerBound、upperBound 和 numPartitions,它再次受制于该分区列中的值是否均匀分布在其范围内。

public Dataset<Row> jdbc(String url,
                String table,
                String columnName,
                long lowerBound,
                long upperBound,
                int numPartitions,
                java.util.Properties connectionProperties)

更多详情here

【讨论】:

以上是关于为啥从 Redshift 读取到 Spark 如此缓慢?的主要内容,如果未能解决你的问题,请参考以下文章

由于 Databricks 不公开支持 spark-redshift lib,使用 Scala spark 从 Redshift 读取/写入 Redshift 的最佳方法是啥

将数据从我的 spark 代码发送到 redshift

使用 spark(py)从 amazon redshift 读取数据时出错请求存储桶位置时必须指定存储桶名称参数

Spark Redshift:使用火花读取红移表时出错

无法从火花连接到红移

从 Spark 连接到 Redshift 时无法推断架构