如何对ElasticSearch执行SQL查询(使用org.elasticsearch.spark.sql格式)?

时间:2016-10-10 01:17:42

标签: elasticsearch apache-spark

使用Spark 1.6.0和ES 5.0.0-alpha5我试图在Spark中获取一些数据帧。我正在使用包

--packages org.elasticsearch:elasticsearch-spark-13_2.10:5.0.0-alpha5

使用

sqlContext.read.format("org.elasticsearch.spark.sql").option("es.nodes", "my_host").load("logstash-2016.10.10/my_type")

我可以printSchema查看我的字段。

然而,其中任何一个都会永远挂起,没有例外,似乎没有任务提交给Spark

count, first, etc.

我该如何调试?任何提示都将不胜感激!

编辑: 我在docker容器中运行elasticsearch,我也可以通过Kibana成功连接并直接进行http rest查询。

2 个答案:

答案 0 :(得分:4)

就我而言,我在Google Cloud中运行ElasticSearch和Spark实例作为Docker容器。在每个地方阅读和搜索后,我偶然发现了这一点:https://www.elastic.co/guide/en/elasticsearch/hadoop/master/cloud.html。 ES Spark连接器具有一个名为es.nodes.wan.only的设置,使其在云环境(如Google Cloud或AWS)中运行。我之前遇到了与OP完全相同的问题,例如: printSchema有效但任何聚合都不起作用,这个确切的设置为我修复了它!

您可以在初始化SparkConfig时对其进行配置,如下所示:

val conf = new SparkConf()
.setAppName("MySparkModel")
.set("es.nodes.wan.only", "true)

答案 1 :(得分:1)

这个问题已经很老了,但我将描述我过去使用ES 5.0和Spark 2.0进行未来参考的方法。我认为ES-Hadoop文档对于使用什么工件和API有点不清楚。

我使用了org.elasticsearch:elasticsearch-spark-20_2.11:5.0和以下代码:

// add to your class imports
import org.elasticsearch.spark.sql._

// Use Spark 2.0 SparkSession object to provide your config
val sparkSession = SparkSession.builder().config(...).getOrCreate()
// Optional step, imports things like $"column"
import sparkSession.implicits._
// Specify your index and type in ES
val df = spark.esDF("index/type")
// Perform an action
df.count()

我认为Spark 1.6的情况非常相似,但有一些细微的变化。特别是,您应该使用SQLContextHiveContext代替SparkSession