为啥从 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 >= '2018-01-01' and tstamp < '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 的最佳方法是啥