<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          關(guān)關(guān)難過, 關(guān)關(guān)過

          共 11706字,需瀏覽 24分鐘

           ·

          2023-01-30 07:38

          自從我決定開始寫austin-data-house數(shù)據(jù)倉庫模塊,已經(jīng)過了兩周有多了。這兩周多我都在被部署安裝環(huán)境折磨,中途有很多次就想放棄了。

          我初學(xué)編程,到現(xiàn)在工作了幾年,我還是沒變,一如既往地討厭安裝環(huán)境。

          還好年二十九,在放假前的最后一天,終于把kafka->hive調(diào)試成功了,能過個好年咯!

          花了這么長時間調(diào)試安裝部署環(huán)境,實現(xiàn)的功能其實很簡單:消費Kafka的消息,寫入hive。(我在寫全鏈路追蹤功能實時引擎用的是flink,為了技術(shù)架構(gòu)統(tǒng)一,我還是希望通過flink來實現(xiàn)。)

          現(xiàn)狀

          flink1.9開始支持hive。到目前為止,flink穩(wěn)定的版本在1.16.0,flink支持hive也就這兩年的事。

          austin所依賴的組件有很多(正常線上環(huán)境都會有這些組件,只是不用我們自己搭建而已)。各種組件的環(huán)境問題被我一一征服了,但有很大程度上的功勞是在docker-compose上。

          說到數(shù)據(jù)倉庫,第一時間肯定是想到hive。雖然我沒裝過hadoop/hive/hdfs大數(shù)據(jù)相關(guān)的組件,但稍微想想這都是復(fù)雜的。那安裝hive自然就會想到有沒有docker鏡像,一鍵安裝可多爽啊。

          之前接入的flink也是跑在docker上的,把hive也找個鏡像,兩者融合融合不就行了嘛?

          想法很好,我就開干了。

          基礎(chǔ)知識

          flinkhive融合,實際上是借助hive catalog來打通hive。hive catalog對接著hive metastore(hive存儲元數(shù)據(jù)的地方)。

          當(dāng)我們使用flink創(chuàng)建出的元數(shù)據(jù),會經(jīng)由hive catalog 最終持久化到hive metastore,同時我們會利用hive catalog提供的接口對hive進行寫入和讀取。

          9bf4a4b678cf9bdaac27fc54a12307cd.webp來源:https://blog.51cto.com/u_15105906/5849229

          安裝hive環(huán)境

          那時候簡單搜了下,還真被我找到了hive的鏡像,沒想到這么幸運,還是支持docker-compose的,一鍵安裝,美滋滋。

          https://github.com/big-data-europe/docker-hive

          我就簡單復(fù)述下過程吧,比較簡單:

          1、把倉庫拉到自己的服務(wù)器上

                
                [email protected]:big-data-europe/docker-hive.git

          2、進入到項目的文件夾里

                
                cd?docker-hive

          3、啟動項目

                
                docker-compose?up?-d

          一頓下載之后,可以發(fā)現(xiàn)就啟動成功了,通過docker ps 命令就看到運行幾個鏡像了。

          沒錯,這就安裝好hive了,是不是非常簡單。具體啟動了什么,我們可以簡單看下docker-compose.yml文件的內(nèi)容。

          最后,我們可以連上hive的客戶端,感受下快速安裝好hive的成功感。

                
                #?進入bash
          docker-compose?exec?hive-server?bash

          #
          ?使用beeline客戶端連接
          /opt/hive/bin/beeline?-u?jdbc:hive2://localhost:10000

          深陷迷霧

          hive安裝好了之后,我就馬不停蹄地想知道怎么跟flink進行融合了。我就搜了幾篇博客看個大概,后來發(fā)現(xiàn)大多數(shù)博客的內(nèi)容其實就是翻譯了flink官網(wǎng)的內(nèi)容。

          不過,翻博客的過程中讓我大致了解了一點:如果我要使用flink連接hive,那我要手動flink連接hivejar包導(dǎo)入到flink/lib目錄下。

          說實話,這還是比較麻煩的。我還以為只需要在我的工程里導(dǎo)入相關(guān)的依賴就好了,沒想到還得自己手動把jar包下來下來,然后傳入到flink的安裝目錄下。

          我吭哧吭哧地做了,但把我寫好的工程jar包傳上去提交給jobmanager不是缺這就是少那依賴。我相信我能搞掂,反正就是版本依賴的問題嘛,我在行的。

          后面又發(fā)現(xiàn)在flink工程項目里用maven引入hadoop依賴是不夠的,flink新版本里默認打的鏡像是沒有hadoop的,要手動在flink環(huán)境目錄下引入hadoop。這個也是麻煩的,但只要我在鏡像里下載些環(huán)境,也不是不能干。

          1、安裝vim

                
                apt-get?update

          apt-get?install?vim

          2、安裝hadoop

          2.1、下載hadoop

                
                wget?https://archive.apache.org/dist/hadoop/common/hadoop-2.7.4/hadoop-2.7.4.tar.gz

          2.2、解壓hadoop

                
                tar?-zxf?hadoop-2.7.4.tar.gz

          2.3、配置環(huán)境變量

                
                vim?/etc/profile
                
                export?HADOOP_HOME=/opt/hadoop-2.7.4
          export?PATH=$HADOOP_HOME/bin:$PATH
          export?HADOOP_CLASSPATH=`hadoop?classpath`
                
                source?/etc/profile

          2.4、在flink的docker容器里還得把.bashrc也得改了才生效

          過于樂觀的我,搞了10天左右吧,終于頂不住了,下定決心:我一定要統(tǒng)一版本,不能修修補補了,該什么版本就走什么版本,推倒從來吧。我就按著flink官網(wǎng)來走,一步一步走下來不可能錯的吧!

          flink最新的版本是v1.17-SNAPSHOT,那我就挑上一個穩(wěn)定的版本就行了!順便一看,我之前寫全鏈路追蹤austin接入flink的時候,代碼的還是14.3版本。但管不了這么多了,就用1.16.0版本吧。

          首先,我發(fā)現(xiàn)我的flink鏡像拉取的是最新的版本image: flink:latest。那我得找1.16.0版本的docker-compose來部署,版本就得統(tǒng)一,后面的事才好搞。這個好找,在官網(wǎng)很快就找到了:image: flink:1.16.0-scala_2.12

          新的鏡像搞下來了以后,我又吭哧地把相關(guān)的jar都手動地導(dǎo)入到flink容器里。另外,我發(fā)現(xiàn)官網(wǎng)寫的pom依賴,壓根就下載不下來的,這不對勁啊。

                
                <dependency>
          ??<groupId>org.apache.flink</groupId>
          ??<artifactId>flink-table-api-java-bridge_2.12</artifactId>
          ??<version>1.16.0</version>
          ??<scope>provided</scope>
          </dependency>

          我開始以為是我的maven倉庫配置問題,找遍了倉庫在那個artifactId下,最大的也就只有1.14.x的版本。去找了下flinkissue,發(fā)現(xiàn)有人跟我一樣的問題。

          https://github.com/apache/flink/pull/21553

          繼續(xù)嘗試提交我自己寫好的flink.jar。毫無意外地,又報錯了,有些是之前的報錯,我很快地就能解決掉。

          我一想,意識到是哪里沒做好了:hive的版本,hadoop的版本,flink的版本這三者也要約束。那我轉(zhuǎn)頭一看,發(fā)現(xiàn)之前我從鏡像里拉下來hive版本是2.3.2,里面裝的hadoop版本是2.7.4。于是,我又統(tǒng)一了這三者的版本。信心很足,感覺一定能成。

          再次提交,還是有問題,瘋狂Google但就是一直找不到解決方案。能查出來的資料,網(wǎng)上的全都是“原始”安裝部署的,就沒有通過flink docker鏡像跟hive融合的,而且也不是跨機器的(給出來的案例都是在同一臺機器上,我是hive部署一臺機器上,flink部署在另一臺機器上)。

          花了幾天調(diào)試還是解決不掉,怎么搞呢?放棄又不甘心。咋整?繼續(xù)推倒重來唄。

          在使用flink容器調(diào)試的過程中我已經(jīng)發(fā)現(xiàn)了:

          1、拉下來的docker鏡像里的內(nèi)容,跟官網(wǎng)所描述的jar包是有出入的,有的是要我手動去下載的。但當(dāng)時我覺得既然版本已經(jīng)限定了,那應(yīng)該問題也不大。

          2、hadoop環(huán)境變量在flink docker 容器下很難調(diào)試。每次重新推倒從來的時候,我都得手動配置一次,步驟也繁瑣。即便我掛載了相關(guān)的jar包和整個目錄

          3、flink容器內(nèi)重啟和啟動集群環(huán)境不可控,老是出現(xiàn)奇奇怪怪的問題。

          那這一次,我就不用docker-compose部署flink了,直接在centos安裝部署flink,繼續(xù)整。

          隨著我每一次推倒重來,我就覺得我離成功越來越近越來越近。從環(huán)境變量報錯缺失CALSS_PATH的問題,已經(jīng)到了sql的語法的問題,從sql語法的問題到找不到遠程地址namenode can't found的問題,從遠程地址的問題,到HDFS調(diào)用不通的問題。最后,終于調(diào)試成功了。

          下面就記錄我能調(diào)試成功的安裝過程,各種坑錯誤異常就不記錄了(篇幅問題),這里也吐槽夠了。

          安裝flink環(huán)境

          1、下載flink壓縮包

                
                wget?https://dlcdn.apache.org/flink/flink-1.16.0/flink-1.16.0-bin-scala_2.12.tgz

          2、解壓flink

                
                tar?-zxf?flink-1.16.0-bin-scala_2.12.tgz

          3、修改該目錄下的conf下的flink-conf.yaml文件中rest.bind-address配置,不然遠程訪問不到8081端口,將其改為0.0.0.0

                
                rest.bind-address:?0.0.0.0

          4、將flink官網(wǎng)提到連接hive所需要的jar包下載到flinklib目錄下(一共4個)

                
                wget?https://repo.maven.apache.org/maven2/org/apache/flink/flink-sql-connector-hive-2.3.9_2.12/1.16.0/flink-sql-connector-hive-2.3.9_2.12-1.16.0.jar

          wget?https://repo.maven.apache.org/maven2/org/apache/hive/hive-exec/2.3.4/hive-exec-2.3.4.jar

          wget?https://repo.maven.apache.org/maven2/org/apache/flink/flink-connector-hive_2.12/1.16.0/flink-connector-hive_2.12-1.16.0.jar?

          wget?https://repo.maven.apache.org/maven2/org/antlr/antlr-runtime/3.5.2/antlr-runtime-3.5.2.jar

          5、按照官網(wǎng)指示把flink-table-planner_2.12-1.16.0.jarflink-table-planner-loader-1.16.0.jar 這倆個jar包移動其目錄;

                
                mv?$FLINK_HOME/opt/flink-table-planner_2.12-1.16.0.jar?$FLINK_HOME/lib/flink-table-planner_2.12-1.16.0.jar
          mv?$FLINK_HOME/lib/flink-table-planner-loader-1.16.0.jar?$FLINK_HOME/opt/flink-table-planner-loader-1.16.0.jar

          6、把后續(xù)kafka所需要的依賴也下載到lib目錄下

                
                wget?https://repo1.maven.org/maven2/org/apache/flink/flink-connector-kafka/1.16.0/flink-connector-kafka-1.16.0.jar

          wget?https://repo1.maven.org/maven2/org/apache/kafka/kafka-clients/3.3.1/kafka-clients-3.3.1.jar

          安裝hadoop環(huán)境

          由于hive的鏡像已經(jīng)鎖死了hadoop的版本為2.7.4,所以我這邊flink所以來的hadoop也是下載2.7.4版本

          1、下載hadoop壓縮包

                
                wget?https://archive.apache.org/dist/hadoop/common/hadoop-2.7.4/hadoop-2.7.4.tar.gz

          2、解壓hadoop

                
                tar?-zxf?hadoop-2.7.4.tar.gz

          安裝jdk11

          由于高版本的flink需要jdk 11,所以這邊安裝下該版本的jdk

                
                yum?install?java-11-openjdk.x86_64
          yum?install?java-11-openjdk-devel.x86_64

          配置jdk、hadoop的環(huán)境變量

          這一步為了能讓flink在啟動的時候,加載到jdkhadoop的環(huán)境。

          1、編輯/etc/profile文件

                
                vim?/etc/profile

          2、文件內(nèi)容最底下增加以下配置:

                
                JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.17.0.8-2.el7_9.x86_64
          JRE_HOME=$JAVA_HOME/jre
          CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
          PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
          export?JAVA_HOME?JRE_HOME?CLASS_PATH?PATH
          export?HADOOP_HOME=/root/hadoop-2.7.4
          export?PATH=$HADOOP_HOME/bin:$PATH
          export?HADOOP_CLASSPATH=`hadoop?classpath`

          3、讓配置文件生效

                
                source?/etc/profile

          austin數(shù)據(jù)倉庫工程代碼

          直接上austin倉庫地址,文章篇幅就不貼代碼了,該寫的注釋我都寫了。

          http://gitee.com/zhongfucheng/austin

          這個工程代碼量非常少,一共就4個核心文件pom.xml/hive-site.xml/AustinHiveBootStrap.java,要使用的時候注意該兩處地方即可:

          1、com.java3y.austin.datahouse.constants.DataHouseConstant#KAFKA_IP_PORT將這里改成自己的kafkaipport

          2、hive-site.xml文件全局替換掉hive_ip為自己的hive地址,一共兩處

          部署工程代碼到Flink

          我們把jar包上傳到服務(wù)器,然后使用命令提交jar包給flink執(zhí)行。也可以打開flink的管理后臺,在頁面上提交jar包并啟動。我這里就選擇使用命令的方式來提交,主要因為在外網(wǎng)透出flink的端口,很容器被攻擊(我已經(jīng)重裝系統(tǒng)幾次了。。)

          (flink命令在$FLINK_HOME/bin下)

                
                ./start-cluster.sh
                
                ./flink?run?austin-data-house-0.0.1-SNAPSHOT.jar

          啟動Kafka生產(chǎn)者寫入測試數(shù)據(jù)

          啟動消費者的命令(將ipport改為自己服務(wù)器所部署的Kafka信息):

                
                
                  $
                  KAFKA_HOME/bin/kafka-console-producer.sh?--topic?austinTraceLog??--broker-list?ip:port
                  

          輸入測試數(shù)據(jù):

                
                {"state":"1","businessId":"2","ids":[1,2,3],"logTimestamp":"123123"}

          即將成功

          到這一步,離勝利就非常近了,但還是有通信的問題:flink無法識別namenode/namenodedatanode之間的通信問題等等。于是我們需要做以下措施:

          1、hive在部署的時候,增加datanode/namenode的通信端口,部署hive使用這個docker-compose文件的內(nèi)容:

                
                version:?"3"

          services:
          ??namenode:
          ????image:?bde2020/hadoop-namenode:2.0.0-hadoop2.7.4-java8
          ????volumes:
          ??????-?namenode:/hadoop/dfs/name
          ????environment:
          ??????-?CLUSTER_NAME=test
          ????env_file:
          ??????-?./hadoop-hive.env
          ????ports:
          ??????-?"50070:50070"
          ??????-?"9000:9000"
          ??????-?"8020:8020"
          ??datanode:
          ????image:?bde2020/hadoop-datanode:2.0.0-hadoop2.7.4-java8
          ????volumes:
          ??????-?datanode:/hadoop/dfs/data
          ????env_file:
          ??????-?./hadoop-hive.env
          ????environment:
          ??????SERVICE_PRECONDITION:?"namenode:50070"
          ????ports:
          ??????-?"50075:50075"
          ??????-?"50010:50010"
          ??????-?"50020:50020"
          ??hive-server:
          ????image:?bde2020/hive:2.3.2-postgresql-metastore
          ????env_file:
          ??????-?./hadoop-hive.env
          ????environment:
          ??????HIVE_CORE_CONF_javax_jdo_option_ConnectionURL:?"jdbc:postgresql://hive-metastore/metastore"
          ??????SERVICE_PRECONDITION:?"hive-metastore:9083"
          ????ports:
          ??????-?"10000:10000"
          ??hive-metastore:
          ????image:?bde2020/hive:2.3.2-postgresql-metastore
          ????env_file:
          ??????-?./hadoop-hive.env
          ????command:?/opt/hive/bin/hive?--service?metastore
          ????environment:
          ??????SERVICE_PRECONDITION:?"namenode:50070?datanode:50075?hive-metastore-postgresql:5432"
          ????ports:
          ??????-?"9083:9083"
          ??hive-metastore-postgresql:
          ????image:?bde2020/hive-metastore-postgresql:2.3.0
          ????ports:
          ??????-?"5432:5432"
          ??presto-coordinator:
          ????image:?shawnzhu/prestodb:0.181
          ????ports:
          ??????-?"8080:8080"
          volumes:
          ??namenode:
          ??datanode:

          2、在部署flink服務(wù)器上增加hosts,有以下(ip為部署hive的地址):

                
                127.0.0.1?namenode
          127.0.0.1?datanode
          127.0.0.1?b2a0f0310722

          其中 b2a0f0310722datanode的主機名,該主機名會隨著hivedocker而變更,我們可以登錄namenode的后臺地址找到其主機名。而方法則是在部署hive的地址輸入:

                
                http://localhost:50070/dfshealth.html#tab-datanode
          91981a4da8d00a7718a401f1b961f422.webp

          3、把工程下的hive-site.xml文件拷貝到$FLINK_HOME/conf

          4、hadoop的配置文件hdfs-site.xml增加以下內(nèi)容(我的目錄在/root/hadoop-2.7.4/etc/hadoop

                
                <property>
          ????<name>dfs.client.use.datanode.hostname</name>
          ????<value>true</value>
          ????<description>only?cofig?in?clients</description>
          </property>

          5、啟動flink-sql的客戶端:

                
                ./sql-client.sh

          6、在sql客戶端下執(zhí)行以下腳本命令,注:hive-conf-dir要放在$FLINK_HOME/conf

                
                CREATE?CATALOG?my_hive?WITH?(
          ????'type'?=?'hive',
          ????'hive-conf-dir'?=?'/root/flink-1.16.0/conf'
          );
                
                use?catalog?my_hive;
                
                create?database?austin;

          7、重啟flink集群

                
                ./stop-cluster.sh
                
                ./start-cluster.sh

          8、重新提交執(zhí)行flink任務(wù)

                
                ./flink?run?austin-data-house-0.0.1-SNAPSHOT.jar

          數(shù)據(jù)可視化

          到上面為止,我們已經(jīng)把數(shù)據(jù)寫入到hive表了,我們是不可能每一次都在命令行窗口里查詢hive的數(shù)據(jù)。一般在公司里都會有可視化平臺供我們開發(fā)/數(shù)倉/數(shù)據(jù)分析師/運營 去查詢hive的數(shù)據(jù)。

          我簡單看了幾個開源的可視化平臺:Superset/Metabase/DataEase。最后選擇了Metabase,無他,看著順眼一些。

          部署Metabase很簡單,也是使用docker進行安裝部署,就兩行命令(后續(xù)我會將其加入到docker-compose里面)。

                
                docker?pull?metabase/metabase:latest
                
                docker?run?-d?-p?5001:3000?--name?metabase?metabase/metabase

          完了之后,我們就可以打開5001端口到Metabase的后臺了。

          7848f49ac23139101f8c144299f15660.webp

          我們可以在Metabase的后臺添加presto進而連接hive去查詢記錄。

          3dc645aeb186535386e52e14b7450117.webp

          這個presto服務(wù)我們在搭建hive的時候已經(jīng)一起啟動了,所以這里直接使用就好了。

          到這一步,我們就可以通過在頁面上寫sql把消息推送過程中埋點的明細數(shù)據(jù)查詢出來

          2c36f58ee5bacac5862b0771ad7adfd0.webp

          最后

          這數(shù)據(jù)倉庫整個安裝環(huán)境和調(diào)試過程確實折騰人,多次推倒重來(甚至不惜重裝系統(tǒng)重來)。還好最后輸入Kafka一條消息,在hive表里能看到一條記錄,能看到結(jié)果之后,折騰或許是值得的。

          參考資料:

          • https://nightlies.apache.org/flink/flink-docs-release-1.16/docs/connectors/table/hive/overview/
          • https://blog.51cto.com/u_15105906/5849229
          • https://blog.csdn.net/qq_38403590/article/details/126172610
          推薦項目

          如果想學(xué)Java項目的,我還是 強烈推薦 我的開源項目消息推送平臺Austin,可以用作 畢業(yè)設(shè)計 ,可以用作 校招 ,可以看看 生產(chǎn)環(huán)境是怎么推送消息 的。

          倉庫地址(可點擊閱讀原文跳轉(zhuǎn)):https://gitee.com/zhongfucheng/austin

          我開通了 股東服務(wù) 內(nèi)容,感興趣可以點擊下方看看,主要針對的是項目喲

          VIP服務(wù)

          瀏覽 118
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  jk无码 | 国产精品免费一区二区六十路 | 无码人妻精品一区二区蜜桃在 | 不卡中文字幕 | 毛片視|