spark寫入到es集羣

spark2.x寫入數據到ElasticSearch5.X集羣,首先說明,到目前爲止,我使用過spark1.6寫入數據到ES2.4中,使用很簡單。

當我使用spark1.6寫入到ES5.5的時候,一直不成功。

官網首先就講了

through the dedicated support available since 2.1 or through the Map/Reduce bridge since 2.0. Spark 2.0 is supported in elasticsearch-hadoop since version 5.0.

在本地測試,發現使用spark2.x可以,就改scala版本爲 2.11.8,將maven依賴換成spark2.1.0版本的,反正在本地測試,修改的東西並不多。

修改maven依賴,一定要注意版本的準確。

第一點改變的就是,這裏的用法並不像之前的,使用rdd.saveToEs(。。。)就可以寫入elasticsearch,在spark2.x中,會報錯沒有這個方法。

官方文檔中有這個例子,並給出了步驟,這樣操作可以成功寫入,並且寫入的兩列,就是 departure, arrival

像上圖這種,那麼自定義的rdd,如何將內容寫入ES,如下:

package com.bigsun

import org.apache.spark.sql.SparkSession

import org.elasticsearch.spark

import org.elasticsearch.spark.rdd.EsSpark

object App{

case class Trip(content: String)

def main(args: Array[String]): Unit = {

println( "Hello World!" )

System.setProperty("hadoop.home.dir", "G:\\hadoop_home")

val spark = SparkSession.builder()

.appName("SparkTest")

.master("local[5]")

.config("es.index.auto.create", "true")

.config("pushdown", "true")

.config("es.nodes", "192.168.2.5")

.config("es.port", "9200")

.config("es.nodes.wan.only", "true")

.getOrCreate()

//從ES中讀取數據

val sparkDF = spark.sqlContext.read.format("org.elasticsearch.spark.sql").load("index/external")

sparkDF.take(10).foreach(println(_))

import spark.implicits._

val data = spark.read.textFile("g:\\mydata\\*")

//寫入到ES,一定要按照這個格式,因爲這種格式才帶有元數據信息,content就是ES中的列名

val rdd = data.rdd.map{

x => Trip(x)

}

EsSpark.saveToEs(rdd, "index/external")

spark.stop()

}

}

一定要將rdd轉換成case class中的格式,按照我的理解,這裏就是指定在ES中的列名。 最後將完整的春江花月夜寫入到ES中。

spark1.x是否可以這樣寫入,還待測試。如果想知道答案,請聯繫我。

最後,網上關於es5.x 和 spark2.x資料真的不是很多。 碰到問題,首先查官網!這是這次的教訓。

https://www.2cto.com/kf/201708/663570.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章