spark2.3.3消費kafka中的數據,與hive中的表做關聯並寫入elasticsearch6.5.3(spark structed streaming)

背景:
本地物理機機房新建了一個大數據集羣(cdh,spark2.3.3+hive3.0)
舊集羣環境:spark2.1.0+hive2.4.2
新舊集羣爲內網訪問。
未參與集羣的搭建,不知道配置文件目錄,各種依賴的jar版本,端口等。
elasticsearch的端口經過一層nginx轉發。

解決過程:
①hive舊數據數據遷移:
在舊的hive集羣執行

export table a.b partition (day=20150323) to
‘hdfs://舊集羣master:port/tmp/b’;

在新的hive集羣執行
Create database a;

import external table a.b from ‘hdfs://新集羣master:port/tmp/b’;

(我們的master:port被封裝爲了內部機器域名)
完成表的複製
②hive-site.xml
新集羣的hive命令行下,執行set;可查看hive-site.xml文件所在目錄
複製新集羣hive所使用的hive-site.xml文件至spark的conf目錄。(–files hive-site.xml未能生效,原因未知)
③找到正確的kafka依賴包。
我的是:

    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-streaming-kafka-0-10_2.11</artifactId>
        <version>2.3.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-sql-kafka-0-10_2.11</artifactId>
        <version>2.3.0</version>
    </dependency>

③找到正確的Elasticsearch依賴

    <dependency>
       <groupId>org.elasticsearch</groupId>
       <artifactId>elasticsearch-spark-20_2.11</artifactId>
       <version>6.5.3</version>
   </dependency>

④json依賴(要想將json序列化爲對象,需要scala的class爲case class)

    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.54</version>
    </dependency>

⑤解決一些BUG的依賴(忘了是爲了解決什麼BUG了,好像和kafka有關)

  <dependency>
      <groupId>com.thoughtworks.paranamer</groupId>
      <artifactId>paranamer</artifactId>
      <version>2.8</version>
  </dependency>

⑥核心代碼:
object RealTime extends Serializable {

val checkpointLocation = “/user/hdfs/checkpointLocation”
val spark=SparkSession
.builder()
.config(ConfigurationOptions.ES_NODES,ip)
.config(ConfigurationOptions.ES_PORT, port)
.config(ConfigurationOptions.ES_INDEX_AUTO_CREATE,“true”)
.config(ConfigurationOptions.ES_NODES_WAN_ONLY,“true”) //因爲我們的ES的Node和Port做了一層nginx,轉發到真正的es端口的過程中涉及到域名的解析。
.enableHiveSupport() //必須
.appName(“appName”)
.getOrCreate()
spark.conf.set(“spark.sql.streaming.checkpointLocation”,checkpointLocation)
val linesDF = spark
.readStream
.format(“kafka”)
.option(“kafka.bootstrap.servers”, kafkaIpPort)
.option(“subscribe”, sourcetopic)
.load()
import spark.implicits._
val data = linesDF.selectExpr(“cast(value as string)”).map(row=>{
//數據解析爲string後爲json格式
JSON.parseObject(row.getString(0),classOf[myCaseClass])
})
data.createOrReplaceTempView(“b”)
spark.sql(“select * from b left join a on b.id = a.id”)
.writeStream
.format(“es”)
.outputMode(“append”)
.start(“esindex/estype”)
exec.awaitTermination()

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