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依赖包。
我的是:

    
        org.apache.spark
        spark-streaming-kafka-0-10_2.11
        2.3.0
    
    
        org.apache.spark
        spark-sql-kafka-0-10_2.11
        2.3.0
    

③找到正确的Elasticsearch依赖

    
       org.elasticsearch
       elasticsearch-spark-20_2.11
       6.5.3
   

④json依赖(要想将json序列化为对象,需要scala的class为case class)

    
        com.alibaba
        fastjson
        1.2.54
    

⑤解决一些BUG的依赖(忘了是为了解决什么BUG了,好像和kafka有关)

  
      com.thoughtworks.paranamer
      paranamer
      2.8
  

⑥核心代码:
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()

你可能感兴趣的:(spark,spark,structed,streaming,kafka,elasticsearch,hive)