背景:
本地物理機機房新建了一個大數據集羣(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()