ES集群的take(1)导致Spark JVM崩溃

时间:2019-05-16 12:19:41

标签: apache-spark elasticsearch pyspark

我有一个ES集群,我想使用Spark从中提取所有会话ID(自定义字段),并将它们作为单列Dataframe写入某些Parquet文件中。

我创建了一个数据框,并想与take(1)进行检查。该计划是:

= Physical Plan ==
CollectLimit 1
+- *Scan ElasticsearchRelation(Map(
es.net.http.auth.user -> app,
es.net.ssl.cert.allow.self.signed -> true,
es.query -> {"query": {"bool": {"filter": [{"range": {"eventTime": {"lt": "2017-12-01 00:00:00", "gte": "2019-05-15 00:00:00", "time_zone": "UTC", "format": "yyyy-MM-dd HH:mm:ss"}}}]}}}, 
es.net.http.auth.pass -> 123456, 
es.read.field.include -> sessionId, 
es.port -> 9200, 
es.resource -> sessions/session, 
es.nodes -> 192.168.150.12,
es.net.ssl -> true),
org.apache.spark.sql.SQLContext@121e4c9e,None) [sessionId#0] ReadSchema: struct<sessionId:string>

这始终使我的JVM崩溃。

但是,当我稍微修改日期范围时,它可以正常工作。即,将范围从2017/12/012019/05/15代替从2017/12/312019/05/15似乎很好。

由于我使用的是limit子句,所以我认为日期范围应该无关紧要。尽管如此,我还是检查了该计划,以查看它是否有所改变:

= Physical Plan ==
CollectLimit 1
+- *Scan ElasticsearchRelation(Map(
es.net.http.auth.user -> app,
es.net.ssl.cert.allow.self.signed -> true,
es.query -> {"query": {"bool": {"filter": [{"range": {"eventTime": {"lt": "2017-12-31 00:00:00", "gte": "2019-05-15 00:00:00", "time_zone": "UTC", "format": "yyyy-MM-dd HH:mm:ss"}}}]}}}, 
es.net.http.auth.pass -> 123456, 
es.read.field.include -> sessionId, 
es.port -> 9200, 
es.resource -> sessions/session, 
es.nodes -> 192.168.150.12,
es.net.ssl -> true),
org.apache.spark.sql.SQLContext@121e4c9e,None) [sessionId#0] ReadSchema: struct<sessionId:string>

外观相同(更改日期)。

我希望没关系,但是我要补充一点,在其他时间范围(2017-12-012017-12-31)中的数据量与其余时间范围中的数据分布非常相似日期范围。我还想验证该特定范围内的数据没有问题,因此我还在2017-12-012017-12-31日期范围内进行了类似的查询,并且也成功了。

我在做什么错?在这种情况下(当我使用take(1)时,为什么数据量会产生影响?

我正在使用PySpark,ElasticSearch 6和用于ES-spark(org.elasticsearch:elasticsearch-spark-20_2.11:6.7.2)的最新驱动程序/连接器。

0 个答案:

没有答案