我无法从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内核。
答案 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,列 或 如果您不想提供所有谓词,请将jdbc方法更改为below类型,并提供lowerBound,upperBound和numPartitions,并且该分区列中的值会再次均匀地分布在其范围内。 更多详细信息here public Dataset<Row> jdbc(String url,
String table,
String columnName,
long lowerBound,
long upperBound,
int numPartitions,
java.util.Properties connectionProperties)