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()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值