为什么从Redshift读取到Spark这么慢?

时间:2018-09-05 22:43:23

标签: apache-spark

我无法从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中正常运行时,为什么此查询的启动速度如此之慢?我可以做些什么来加载从redshift到spark这么大的结果表?

我的开发AWS EMR集群包含一个M4.xlarge主服务器和2个M3.xlarge工作器。每个工作者大约需要15GB的ram和8个cpu内核。

1 个答案:

答案 0 :(得分:2)

>> 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查询= Arry [String](“列> = value1,列 = value2和列 = value3和列

如果您不想提供所有谓词,请将jdbc方法更改为below类型,并提供lowerBound,upperBound和numPartitions,并且该分区列中的值会再次均匀地分布在其范围内。

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

更多详细信息here