繁体   English   中英

Elasticsearch-hadoop&Elasticsearch-spark sql - 跟踪语句扫描和滚动

[英]Elasticsearch-hadoop & Elasticsearch-spark sql - Tracing of statements scan&scroll

我们正在尝试将ES(1.7.2,4节点集群)与Spark(1.5.1,使用hive和hadoop编译,使用scala 2.11,4节点集群)集成,hdfs进入等式(hadoop 2.7,4节点)和thrift jdbc server和elasticsearch-hadoop-2.2.0-m1.jar

因此,有两种在ES上执行语句的方法。

  1. 带scala的Spark SQL

     val conf = new SparkConf().setAppName("QueryRemoteES").setMaster("spark://node1:37077").set("spark.executor.memory","2g") conf.set("spark.logConf", "true") conf.set("spark.cores.max","20") conf.set("es.index.auto.create", "false") conf.set("es.batch.size.bytes", "100mb") conf.set("es.batch.size.entries", "10000") conf.set("es.scroll.size", "10000") conf.set("es.nodes", "node2:39200") conf.set("es.nodes.discovery","true") conf.set("pushdown", "true") sc.addJar("executorLib/elasticsearch-hadoop-2.2.0-m1.jar") sc.addJar("executorLib/scala-library-2.10.1.jar") sqlContext.sql("CREATE TEMPORARY TABLE geoTab USING org.elasticsearch.spark.sql OPTIONS (resource 'geo_2/kafkain')" ) val all: DataFrame = sqlContext.sql("SELECT count(*) FROM geoTab WHERE transmittersID='262021306841042'") ..... 
  2. Thrift服务器(在spark上执行的代码)

     .... polledDataSource = new ComboPooledDataSource() polledDataSource.setDriverClass("org.apache.hive.jdbc.HiveDriver") polledDataSource.setJdbcUrl("jdbc:hive2://node1:30001") polledDataSource.setMaxPoolSize(5) dbConnection = polledDataSource.getConnection dbStatement = dbConnection.createStatement val dbResult = dbStatement.execute("CREATE TEMPORARY EXTERNAL TABLE IF NOT EXISTS geoDataHive6(transmittersID STRING,lat DOUBLE,lon DOUBLE) STORED BY 'org.elasticsearch.hadoop.hive.EsStorageHandler' TBLPROPERTIES('es.resource' = 'geo_2/kafkain','es.query'='{\\"query\\":{\\"term\\":{\\"transmittersID\\":\\"262021306841042\\"}}}','es.nodes'='node2','es.port'='39200','es.nodes.discovery' = 'false','es.mapping.include' = 'trans*,point.*','es.mapping.names' = 'transmittersID:transmittersID,lat:point.lat,lon:point.lon','pushdown' = 'true')") dbStatement.setFetchSize(50000) dbResultSet = dbStatement.executeQuery("SELECT count(*) FROM geoDataHive6") ..... 

我有以下问题,由于它们已连接,我决定将它们打包成一个堆栈问题:

  1. 似乎使用Spark SQL的方法支持对WHERE背后的内容进行下推(无论是否指定es.query),执行时间是相同的并且是可接受的。 但是解决方案1肯定不支持聚合函数的推送,即所呈现的计数(*)不在ES的一侧执行,但只有在检索完所有数据之后 - ES才会返回行,而Spark SQL会对它们进行计数。 请确认这是否是正确的行为

  2. 第一个解决方案的行为很奇怪,即下推是真还是假,时间相等

  3. 解决方案编号2似乎支持无下推,无论我以何种方式尝试指定子查询,无论是表定义的一部分还是在语句的WHERE子句中,它似乎只是取出所有巨大的索引然后对其进行数学计算。 是不是因为节俭蜂巢无法对ES进行下推

  4. 我想在弹性搜索中跟踪查询,我确实设置如下:

     //logging.yml index.search.slowlog: TRACE, index_search_slow_log_file index.indexing.slowlog: TRACE, index_indexing_slow_log_file additivity: index.search.slowlog: true index.indexing.slowlog: true 

所有index.search.slowlog.threshold.query,index.search.slowlog.threshold.fetch甚至index.indexing.slowlog.threshold.index都设置为0ms。 我确实在slowlog文件中看到了从sense执行的常见语句(因此它可以工作)。 但我没有看到针对ES执行的Spark SQL或thrift语句。 我想这些是扫描和滚动语句,因为如果我从感觉执行扫描和滚动,这些也不会被记录。 是否有可能以某种方式跟踪ES的扫描和滚动?

  1. 据我所知,这是一种预期的行为。 我所知道的所有来源都采用完全相同的方式,直观地说它是有道理的。 SparkSQL专为分析查询而设计,在本地获取数据,缓存和处理更有意义。 另请参见spark谓词下推是否适用于JDBC?

  2. 我不认为conf.set("pushdown", "true")有任何影响。 如果要配置特定于连接的设置,则应将其作为OPTION映射传递,如第二种情况。 使用es前缀也应该有效

  3. 这确实很奇怪。 Martin Senne报道 PostgreSQL 的类似问题 ,但我无法重现。

经过与Costin Leau讨论弹性研究讨论组的讨论后,他指出了以下内容,我应该与您分享:

您的设置存在许多问题:

  1. 您提到使用Scala 2.11但使用的是Scala 2.10。 请注意,如果要选择Scala版本,应使用elasticsearch-sparkelasticsearch-hadoop仅为Scala 2.10提供二进制文件。

  2. 下推功能仅可通过Spark DataSource获得。 如果您没有使用这种类型的声明,则pushdown传递不会传递给ES(这就是Spark的工作原理)。 因此宣布pushdown是无关紧要的。

  3. 请注意,ES-Hadoop中的所有参数都是以es.开头的es. - 唯一的例外是pushdownlocation ,这些是Spark DataSource特定的(遵循Spark约定,因为这些是专用DS中的Spark特定功能)

  4. 使用临时表确实算作数据源,但是你需要在那里使用pushdown 如果不这样做,默认情况下它会被激活,因此你看到为什么你的运行之间没有区别; 你没有改变任何相关的参数。

  5. Spark不会推迟计数和其他聚合。 根据Databricks团队的说法,未来可能会有一些东西,但目前没有任何东西。 对于count,您可以使用dataFrame.rdd.esCount进行快速调用。 但这是一个例外情况。

  6. 我不确定Thrift服务器是否真的算作DataSource,因为它从Hive加载数据。 您可以通过启用org.elasticsearch.hadoop.spark包登录到DEBUG来仔细检查这一点。 你应该看看SQL是否真的被转换为DSL。

我希望这有帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM