浙江雲倉電商平臺有哪些(湖倉一體電商項目背景與架構介紹及基礎環境準備)
2023-10-13 18:29:42 1
一、項目背景和架構介紹1、項目背景介紹湖倉一體實時電商項目是基於某寶商城電商項目的電商數據分析平臺,本項目在技術方面涉及大數據技術組件搭建,湖倉一體分層數倉設計、實時到離線數據指標分析及數據大屏可視化,項目所用到的技術組件都從基礎搭建開始,目的在於湖倉一體架構中數據倉庫與數據湖融合打通,實現企業級項目離線與實時數據指標分析。在業務方面目前暫時涉及到會員主題與商品主題,分析指標有用戶實時登錄信息分析、實時瀏覽 pv/uv 分析、實時商品瀏覽信息分析、用戶積分指標分析,後續還會繼續增加業務指標和完善架構設計。
2、項目架構2.1、實時數倉現狀當前基於 Hive 的離線數據倉庫已經非常成熟,隨著實時計算引擎的不斷發展以及業務對於實時報表的產出需求不斷膨脹,業界最近幾年就一直聚焦並探索於實時數倉建設。根據數倉架構演變過程,在 Lambda 架構中含有離線處理與實時處理兩條鏈路,其架構圖如下:
正是由於兩條鏈路處理數據導致數據不一致等一些列問題所以才有了 Kappa 架構,Kappa 架構如下:
Kappa 架構可以稱為真正的實時數倉,目前在業界最常用實現就是 Flink Kafka,然而基於 Kafka Flink 的實時數倉方案也有幾個非常明顯的缺陷,所以在目前很多企業中實時數倉構建中經常使用混合架構,沒有實現所有業務都採用 Kappa 架構中實時處理實現。Kappa 架構缺陷如下:
Kafka 無法支持海量數據存儲。對於海量數據量的業務線來說,Kafka 一般只能存儲非常短時間的數據,比如最近一周,甚至最近一天。Kafka 無法支持高效的 OLAP 查詢,大多數業務都希望能在 DWD\DWS 層支持即席查詢的,但是 Kafka 無法非常友好地支持這樣的需求。無法復用目前已經非常成熟的基於離線數倉的數據血緣、數據質量管理體系。需要重新實現一套數據血緣、數據質量管理體系。Kafka 不支持 update/upsert,目前 Kafka 僅支持 append。實際場景中在 DWS 輕度匯聚層很多時候是需要更新的,DWD 明細層到 DWS 輕度匯聚層一般會根據時間粒度以及維度進行一定的聚合,用於減少數據量,提升查詢性能。假如原始數據是秒級數據,聚合窗口是 1 分鐘,那就有可能產生某些延遲的數據經過時間窗口聚合之後需要更新之前數據的需求。這部分更新需求無法使用 Kafka 實現。所以實時數倉發展到現在的架構,一定程度上解決了數據報表時效性問題,但是這樣的架構依然存在不少問題,Kappa 架構除了以上所說的問題之外,實時業務需求多的公司在選擇 Kappa 架構後,也避免不了一些離線數據統一計算的場景,針對 Kappa 架構往往需要再針對某層 Kafka 數據重新編寫實時程序進行統一計算,非常不方便。
隨著數據湖技術的出現,使 Kappa 架構實現批量數據和實時數據統一計算成為可能。這就是我們今天聽到的「批流一體」,在業界中很多人認為批和流在開發層面上都統一到相同的 SQL 上處理是批流一體,也有一些人認為在計算引擎層面上批和流可以集成在同一個計算引擎是批流一體,比如:Spark/SparkStreaming/Structured Streaming/Flink 框架在計算引擎層面上實現了批處理和流處理集成。
以上無論是在業務 SQL 使用上統一還是計算引擎上的統一,都是批流一體的一個方面,除此之外,批流一體還有一個最核心的方面就是存儲層面上的統一。數據湖技術可以實現將批數據和實時數據統一存儲,統一處理計算。我們可以將離線數倉中的數倉和實時數倉中的數倉數據存儲統一合併到數據湖上,可以將 Kappa 架構中的數倉分層 Kafka 存儲替換成數據湖技術存儲,這樣做到「湖倉一體」的構建。
「湖倉一體」架構構建也是目前各大公司針對離線場景和實時場景統一處理計算的方式。例如:一些大型公司使用 Iceberg 作為存儲,那麼 Kappa 架構中很多問題都可以得到解決,Kappa 架構將變成個如下模樣:
這條架構中無論是流處理還是批處理,數據存儲都統一到數據湖 Iceberg 上,這一套結構將存儲統一後,解決了 Kappa 架構很多痛點,解決方面如下:
可以解決 Kafka 存儲數據量少的問題。目前所有數據湖基本思路都是基於 HDFS 之上實現的一個文件管理系統,所以數據體量可以很大。DW 層數據依然可以支持 OLAP 查詢。同樣數據湖基於 HDFS 之上實現,只需要當前的 OLAP 查詢引擎做一些適配就可以進行 OLAP 查詢。批流存儲都基於 Iceberg/HDFS 存儲之後,就完全可以復用一套相同的數據血緣、數據質量管理體系。實時數據的更新。上述架構也可以認為是 Kappa 架構的變種,也有兩條數據鏈路,一條是基於 Spark 的離線數據鏈路,一條是基於 Flink 的實時數據鏈路,通常數據都是直接走實時鏈路處理,而離線鏈路則更多的應用於數據修正等非常規場景。這樣的架構要成為一個可以落地的實時數倉方案、可以做到實時報表產生。
2.2、項目架構及數據分層此項目中我們使用的數據湖技術是 Iceberg 構建「湖倉一體」架構來實時和離線分析電商業務指標。項目整體架構圖如下圖所示:
項目中的數據來源有兩類,一是 MySQL 業務庫數據,另一類是用戶日誌數據,我們通過對應的方式將兩類數據首先採集到 Kafka 各自 topic 中,通過 Flink 處理將業務和日誌數據存儲在 Iceberg-ODS 層中,由於目前 Flink 基於 Iceberg 處理實時數據不能很好保存數據消費位置信息,所以這裡同時將數據存儲在 Kafka 中,利用 Flink 消費 Kafka 數據自動維護 offset 的特性來保證程序停止重啟後消費數據的正確性。
整個架構是基於 Iceberg 構建數據倉庫分層,經過 Kafka 處理數據都實時存儲在對應的 Iceberg 分層中,實時數據結果經過最後分析存儲在 Clickhouse 中,離線數據分析結果直接從 Iceberg-DWS 層中獲取數據分析,分析結果存入 MySQL 中,Iceberg 其它層供臨時性業務分析,最終 Clickhouse 和 MySQL 中的結果通過可視化工具展示出來。
2.3、項目可視化效果下表列出項目中使用的大數據技術組件及各個組件的版本,如下:
這裡我們使用 5 臺節點來安裝各個大數據組件,每臺節點給了 3G 內存,4 個 core,並且每臺節點已經關閉防火牆、配置主機名、設置 yum 源、各個節點時間同步、各個節點兩兩免密、安裝 JDK 操作。5 臺節點信息如下:
這裡搭建 zookeeper 版本為 3.4.13,搭建 zookeeper 對應的角色分布如下:
具體搭建步驟如下:
2.1.1、上傳 zookeeper 並解壓,配置環境變量在 node1,node2,node3,node4,node5 各個節點都創建/software 目錄,方便後期安裝技術組件使用。
mkdir /software
將 zookeeper 安裝包上傳到 node3 節點/software 目錄下並解壓:
[root@node3 software]# tar -zxvf ./zookeeper-3.4.13.tar.gz
在 node3 節點配置環境變量:
#進入vim /etc/profile,在最後加入:export ZOOKEEPER_HOME=/software/zookeeperexport PATH=$PATH:$ZOOKEEPER_HOME/bin#使配置生效source /etc/profile
2.1.2、在 node3 節點配置 zookeeper進入「/software/zookeeper-3.4.13/conf」修改 zoo_sample.cfg 為 zoo.cfg
[root@node3 conf]# mv zoo_sample.cfg zoo.cfg
配置 zoo.cfg 中內容如下:
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/opt/data/zookeeper
clientPort=2181
server.1=node3:2888:3888
server.2=node4:2888:3888
server.3=node5:2888:3888
2.1.3、將配置好的 zookeeper 發送到 node4,node5 節點[root@node3 software]# scp -r ./zookeeper-3.4.13 node4:/software/[root@node3 software]# scp -r ./zookeeper-3.4.13 node5:/software/
2.1.4、各個節點上創建數據目錄,並配置 zookeeper 環境變量在 node3,node4,node5 各個節點上創建 zoo.cfg 中指定的數據目錄「/opt/data/zookeeper」。
mkdir -p /opt/data/zookeeper
在 node4,node5 節點配置 zookeeper 環境變量
#進入vim /etc/profile,在最後加入:export ZOOKEEPER_HOME=/software/zookeeperexport PATH=$PATH:$ZOOKEEPER_HOME/bin#使配置生效source /etc/profile
2.1.5、各個節點創建節點 ID在 node3,node4,node5 各個節點路徑「/opt/data/zookeeper」中添加 myid 文件分別寫入 1,2,3:
#在 node3 的/opt/data/zookeeper 中創建 myid 文件寫入 1
#在 node4 的/opt/data/zookeeper 中創建 myid 文件寫入 2
#在 node5 的/opt/data/zookeeper 中創建 myid 文件寫入 3
2.1.6、各個節點啟動 zookeeper,並檢查進程狀態#各個節點啟動zookeeper命令zkServer.sh start#檢查各個節點zookeeper進程狀態zkServer.sh status
2.2、搭建 HDFS這裡搭建 HDFS 版本為 3.1.4,搭建 HDFS 對應的角色在各個節點分布如下:
搭建具體步驟如下:
2.2.1、各個節點安裝 HDFS HA 自動切換必須的依賴yum -y install psmisc
2.2.2、上傳下載好的 Hadoop 安裝包到 node1 節點上,並解壓[root@node1 software]# tar -zxvf ./hadoop-3.1.4.tar.gz
2.2.3、在 node1 節點上配置 hadoop 的環境變量[root@node1 software]# vim /etc/profileexport HADOOP_HOME=/software/hadoop-3.1.4/export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:#使配置生效source /etc/profile
2.2.4、配置 $HADOOP_HOME/etc/hadoop 下的 hadoop-env.sh 文件#導入 JAVA_HOME
export JAVA_HOME=/usr/java/jdk1.8.0_181-amd64/
2.2.5、配置 $HADOOP_HOME/etc/hadoop 下的 hdfs-site.xml 文件dfs.nameservices mycluster dfs.permissions.enabled false dfs.ha.namenodes.mycluster nn1,nn2 dfs.namenode.rpc-address.mycluster.nn1 node1:8020 dfs.namenode.rpc-address.mycluster.nn2 node2:8020 dfs.namenode.http-address.mycluster.nn1 node1:50070 dfs.namenode.http-address.mycluster.nn2 node2:50070 dfs.namenode.shared.edits.dir qjournal://node3:8485;node4:8485;node5:8485/mycluster dfs.client.failover.proxy.provider.mycluster org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider dfs.ha.fencing.methods sshfence dfs.ha.fencing.ssh.private-key-files /root/.ssh/id_rsa dfs.journalnode.edits.dir /opt/data/journal/node/local/data dfs.ha.automatic-failover.enabled true
2.2.6、配置 $HADOOP_HOME/ect/hadoop/core-site.xmlfs.defaultFS hdfs://mycluster hadoop.tmp.dir /opt/data/hadoop/ ha.zookeeper.quorum node3:2181,node4:2181,node5:2181
2.2.7、配置 $HADOOP_HOME/etc/hadoop/yarn-site.xmlyarn.nodemanager.aux-services mapreduce_shuffle yarn.nodemanager.env-whitelist JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME yarn.resourcemanager.ha.enabled true yarn.resourcemanager.cluster-id mycluster yarn.resourcemanager.ha.rm-ids rm1,rm2 yarn.resourcemanager.hostname.rm1 node1 yarn.resourcemanager.hostname.rm2 node2 yarn.resourcemanager.webapp.address.rm1 node1:8088 yarn.resourcemanager.webapp.address.rm2 node2:8088 yarn.resourcemanager.zk-address node3:2181,node4:2181,node5:2181 yarn.nodemanager.vmem-check-enabled false <!-- yarn.nodemanager.resource.detect-hardware-capabilities true -->
2.2.8、HADOOP_HOME/etc/hadoop/mapred-site.xmlmapreduce.framework.name yarn
2.2.9、配置 $HADOOP_HOME/etc/hadoop/workers 文件[root@node1 ~]# vim /software/hadoop-3.1.4/etc/hadoop/workersnode3node4node5
2.2.10、配置 $HADOOP_HOME/sbin/start-dfs.sh 和 stop-dfs.sh 兩個文件中頂部添加以下參數,防止啟動錯誤HDFS_DATANODE_USER=root
HDFS_DATANODE_SECURE_USER=hdfs
HDFS_NAMENODE_USER=root
HDFS_JOURNALNODE_USER=root
HDFS_ZKFC_USER=root
2.2.11、配置 $HADOOP_HOME/sbin/start-yarn.sh 和 stop-yarn.sh 兩個文件頂部添加以下參數,防止啟動錯誤YARN_RESOURCEMANAGER_USER=root
YARN_NODEMANAGER_USER=root
2.2.12、將配置好的 Hadoop 安裝包發送到其他 4 個節點[root@node1 ~]# scp -r /software/hadoop-3.1.4 node2:/software/[root@node1 ~]# scp -r /software/hadoop-3.1.4 node3:/software/[root@node1 ~]# scp -r /software/hadoop-3.1.4 node4:/software/[root@node1 ~]# scp -r /software/hadoop-3.1.4 node5:/software/
2.2.13、在 node2、node3、node4、node5 節點上配置 HADOOP_HOME#分別在node2、node3、node4、node5節點上配置HADOOP_HOMEvim /etc/profileexport HADOOP_HOME=/software/hadoop-3.1.4/export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:#最後記得Sourcesource /etc/profile
2.2.14、啟動 HDFS 和 Yarn#在node3,node4,node5節點上啟動zookeeperzkServer.sh start#在node1上格式化zookeeper[root@node1 ~]# hdfs zkfc -formatZK#在每臺journalnode中啟動所有的journalnode,這裡就是node3,node4,node5節點上啟動hdfs --daemon start journalnode#在node1中格式化namenode[root@node1 ~]# hdfs namenode -format#在node1中啟動namenode,以便同步其他namenode[root@node1 ~]# hdfs --daemon start namenode#高可用模式配置namenode,使用下列命令來同步namenode(在需要同步的namenode中執行,這裡就是在node2上執行):[root@node2 software]# hdfs namenode -bootstrapStandby#node1上啟動HDFS,啟動Yarn[root@node1 sbin]# start-dfs.sh[root@node1 sbin]# start-yarn.sh
注意以上也可以使用 start-all.sh 命令啟動 Hadoop 集群。
2.2.15、訪問 WebUI訪問 HDFS : http://node1:50070
訪問 Yarn WebUI :http://node1:8088
2.2.16、停止集群
#停止集群[root@node1 ~]# stop-dfs.sh[root@node1 ~]# stop-yarn.sh
注意:以上也可以使用 stop-all.sh 停止集群。
2.3、搭建 Hive這裡搭建 Hive 的版本為 3.1.2,搭建 Hive 的節點劃分如下:
搭建具體步驟如下:
2.3.1、將下載好的 Hive 安裝包上傳到 node1 節點上,並修改名稱[root@node1 ~]# cd /software/[root@node1 software]# tar -zxvf ./apache-hive-3.1.2-bin.tar.gz[root@node1 software]# mv apache-hive-3.1.2-bin hive-3.1.2
2.3.2、將解壓好的 Hive 安裝包發送到 node3 節點上[root@node1 ~]# scp -r /software/hive-3.1.2/ node3:/software/
2.3.3、配置 node1、node3 兩臺節點的 Hive 環境變量vim /etc/profileexport HIVE_HOME=/software/hive-3.1.2/export PATH=$PATH:$HIVE_HOME/bin#source 生效source /etc/profile
2.3.4、在 node1 節點 $HIVE_HOME/conf 下創建 hive-site.xml 並配置hive.metastore.warehouse.dir /user/hive/warehouse javax.jdo.option.ConnectionURL jdbc:mysql://node2:3306/hive?createDatabaseIfNotExist=true&useSSL=false javax.jdo.option.ConnectionDriverName com.mysql.jdbc.Driver javax.jdo.option.ConnectionUserName root javax.jdo.option.ConnectionPassword 123456
2.3.5、在 node3 節點 $HIVE_HOME/conf/中創建 hive-site.xml 並配置hive.metastore.warehouse.dir /user/hive/warehouse hive.metastore.local false hive.metastore.uris thrift://node1:9083
2.3.6、node1、node3 節點刪除 $HIVE_HOME/lib 下「guava」包,使用 Hadoop 下的包替換#刪除Hive lib目錄下「guava-19.0.jar 」包[root@node1 ~]# rm -rf /software/hive-3.1.2/lib/guava-19.0.jar [root@node3 ~]# rm -rf /software/hive-3.1.2/lib/guava-19.0.jar #將Hadoop lib下的「guava」包拷貝到Hive lib目錄下[root@node1 ~]# cp /software/hadoop-3.1.4/share/hadoop/common/lib/guava-27.0-jre.jar /software/hive-3.1.2/lib/[root@node3 ~]# cp /software/hadoop-3.1.4/share/hadoop/common/lib/guava-27.0-jre.jar /software/hive-3.1.2/lib/
2.3.7、將「mysql-connector-java-5.1.47.jar」驅動包上傳到 node1 節點的 $HIVE_HOME/lib 目錄下上傳後,需要將 mysql 驅動包傳入 $HIVE_HOME/lib/目錄下,這裡 node1,node3 節點都需要傳入。
2.3.8、在 node1 節點中初始化 Hive#初始化hive,hive2.x版本後都需要初始化[root@node1 ~]# schematool -dbType mysql -initSchema
2.3.9、在服務端和客戶端操作 Hive#在node1中登錄Hive ,創建表test[root@node1 conf]# hivehive> create table test (id int,name string,age int ) row format delimited fields terminated by '\t';#向表test中插入數據hive> insert into test values(1,"zs",18);#在node1啟動Hive metastore[root@node1 hadoop]# hive --service metastore &#在node3上登錄Hive客戶端查看表數據[root@node3 lib]# hivehive> select * from test;OK1 zs 18
2.4、Hive 與 Iceberg 整合Iceberg 就是一種表格式,支持使用 Hive 對 Iceberg 進行讀寫操作,但是對 Hive 的版本有要求,如下:
這裡基於 Hive3.1.2 版本進行 Hive 集成 Iceberg。
2.4.1、開啟 Hive 支持 Iceberg2.4.1.1、下載 iceberg-hive-runtime.jar想要使用 Hive 支持查詢 Iceberg 表,首先需要下載「iceberg-hive-runtime.jar」,Hive 通過該 Jar 可以加載 Hive 或者更新 Iceberg 表元數據信息。下載地址:https://iceberg.apache.org/#releases/
將以上 jar 包下載後,上傳到 Hive 服務端和客戶端對應的 $HIVE_HOME/lib 目錄下。另外在向 Hive 中 Iceberg 格式表插入數據時需要到「libfb303-0.9.3.jar」包,將此包也上傳到 Hive 服務端和客戶端對應的 $HIVE_HOME/lib 目錄下。
2.4.1.2、配置 hive-site.xml在 Hive 客戶端 $HIVE_HOME/conf/hive-site.xml 中追加如下配置:
iceberg.engine.hive.enabled true
2.4.2、Hive 中操作 Iceberg 格式表從 Hive 引擎的角度來看,在運行環境中有 Catalog 概念(catalog 主要描述了數據集的位置信息,就是元數據),Hive 與 Iceberg 整合時,Iceberg 支持多種不同的 Catalog 類型,例如:Hive、Hadoop、第三方廠商的 AWS Glue 和自定義 Catalog。在實際應用場景中,Hive 可能使用上述任意 Catalog,甚至跨不同 Catalog 類型 join 數據,為此 Hive 提供了 org.apache.iceberg.mr.hive.HiveIcebergStorageHandler(位於包 iceberg-hive-runtime.jar)來支持讀寫 Iceberg 表,並通過在 Hive 中設置「iceberg.catalog..type」屬性來決定加載 Iceberg 表的方式,該屬性可以配置:hive、hadoop,其中「」是自己隨便定義的名稱,主要是在 hive 中創建 Iceberg 格式表時配置 iceberg.catalog 屬性使用。
在 Hive 中創建 Iceberg 格式表時,根據創建 Iceberg 格式表時是否指定 iceberg.catalog 屬性值,有以下三種方式決定 Iceberg 格式表如何加載(數據存儲在什麼位置)。
2.4.2.1、如果沒有設置 iceberg.catalog 屬性,默認使用 HiveCatalog 來加載這種方式就是說如果在 Hive 中創建 Iceberg 格式表時,不指定 iceberg.catalog 屬性,那麼數據存儲在對應的 hive warehouse 路徑下。
在 Hive 客戶端 node3 節點進入 Hive,操作如下:
在 Hive 中創建 iceberg 格式表
create table test_iceberg_tbl1(id int ,name string,age int) partitioned by (dt string) stored by 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler';
在 Hive 中加載如下兩個包,在向 Hive 中插入數據時執行 MR 程序時需要使用到
hive> add jar /software/hive-3.1.2/lib/iceberg-hive-runtime-0.12.1.jar;hive> add jar /software/hive-3.1.2/lib/libfb303-0.9.3.jar;
向表中插入數據
hive> insert into test_iceberg_tbl1 values (1,"zs",18,"20211212");
查詢表中的數據
hive> select * from test_iceberg_tbl1;OK1 zs 18 20211212
在 Hive 默認的 warehouse 目錄下可以看到創建的表目錄:
2.4.2.2、如果設置了 iceberg.catalog 對應的 catalog 名字,就用對應類型的 catalog 加載
這種情況就是說在 Hive 中創建 Iceberg 格式表時,如果指定了 iceberg.catalog 屬性值,那麼數據存儲在指定的 catalog 名稱對應配置的目錄下。
在 Hive 客戶端 node3 節點進入 Hive,操作如下:
註冊一個 HiveCatalog 叫 another_hive
hive> set iceberg.catalog.another_hive.type=hive;
在 Hive 中創建 iceberg 格式表
create table test_iceberg_tbl2(id int,name string,age int)partitioned by (dt string)stored by 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler'tblproperties ('iceberg.catalog'='another_hive');
在 Hive 中加載如下兩個包,在向 Hive 中插入數據時執行 MR 程序時需要使用到
hive> add jar /software/hive-3.1.2/lib/iceberg-hive-runtime-0.12.1.jar;hive> add jar /software/hive-3.1.2/lib/libfb303-0.9.3.jar;
插入數據,並查詢
hive> insert into test_iceberg_tbl2 values (2,"ls",20,"20211212");hive> select * from test_iceberg_tbl2;OK2 ls 20 20211212
以上方式指定「iceberg.catalog.another_hive.type=hive」後,實際上就是使用的 hive 的 catalog,這種方式與第一種方式不設置效果一樣,創建後的表存儲在 hive 默認的 warehouse 目錄下。也可以在建表時指定 location 寫上路徑,將數據存儲在自定義對應路徑上。
除了可以將 catalog 類型指定成 hive 之外,還可以指定成 hadoop,在 Hive 中創建對應的 iceberg 格式表時需要指定 location 來指定 iceberg 數據存儲的具體位置,這個位置是具有一定格式規範的自定義路徑。在 Hive 客戶端 node3 節點進入 Hive,操作如下:
註冊一個 HadoopCatalog 叫 hadoop
hive> set iceberg.catalog.hadoop.type=hadoop;
使用 HadoopCatalog 時,必須設置「iceberg.catalog..warehouse」指定 warehouse 路徑
hive> set iceberg.catalog.hadoop.warehouse=hdfs://mycluster/iceberg_data;
在 Hive 中創建 iceberg 格式表,這裡創建成外表
create external table test_iceberg_tbl3(id int,name string,age int)partitioned by (dt string)stored by 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler'location 'hdfs://mycluster/iceberg_data/default/test_iceberg_tbl3'tblproperties ('iceberg.catalog'='hadoop');
注意:以上 location 指定的路徑必須是「iceberg.catalog.hadoop.warehouse」指定路徑的子路徑,格式必須是 ${iceberg.catalog.hadoop.warehouse}/${當前建表使用的 hive 庫}/${創建的當前 iceberg 表名}
在 Hive 中加載如下兩個包,在向 Hive 中插入數據時執行 MR 程序時需要使用到
hive> add jar /software/hive-3.1.2/lib/iceberg-hive-runtime-0.12.1.jar;hive> add jar /software/hive-3.1.2/lib/libfb303-0.9.3.jar;
插入數據,並查詢
hive> insert into test_iceberg_tbl3 values (3,"ww",20,"20211213");hive> select * from test_iceberg_tbl3;OK3 ww 20 20211213
在指定的「iceberg.catalog.hadoop.warehouse」路徑下可以看到創建的表目錄:
2.4.2.3、如果 iceberg.catalog 屬性設置為「location_based_table」,可以從指定的根路徑下加載 Iceberg 表
這種情況就是說如果 HDFS 中已經存在 iceberg 格式表,我們可以通過在 Hive 中創建 Icerberg 格式表指定對應的 location 路徑映射數據。
在 Hive 客戶端中操作如下:
CREATE TABLE test_iceberg_tbl4 ( id int, name string, age int, dt string)STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler' LOCATION 'hdfs://mycluster/spark/person' TBLPROPERTIES ('iceberg.catalog'='location_based_table');
注意:指定的 location 路徑下必須是 iceberg 格式表數據,並且需要有元數據目錄才可以。不能將其他數據映射到 Hive iceberg 格式表。
由於 Hive 建表語句分區語法「Partitioned by」的限制,如果使用 Hive 創建 Iceberg 格式表,目前只能按照 Hive 語法來寫,底層轉換成 Iceberg 標識分區,這種情況下不能使用 Iceberge 的分區轉換,例如:days(timestamp),如果想要使用 Iceberg 格式表的分區轉換標識分區,需要使用 Spark 或者 Flink 引擎創建表。
2.5、搭建 HBase這裡選擇 HBase 版本為 2.2.6,搭建 HBase 各個角色分布如下:
具體搭建步驟如下:
2.5.1、將下載好的安裝包發送到 node4 節點上,並解壓,配置環境變量#將下載好的HBase安裝包上傳至node4節點/software下,並解壓[root@node4 software]# tar -zxvf ./hbase-2.2.6-bin.tar.gz
當前節點配置 HBase 環境變量
#配置HBase環境變量[root@node4 software]# vim /etc/profileexport HBASE_HOME=/software/hbase-2.2.6/export PATH=$PATH:$HBASE_HOME/bin#使環境變量生效[root@node4 software]# source /etc/profile
2.5.2、配置 $HBASE_HOME/conf/hbase-env.sh#配置 HBase JDK
export JAVA_HOME=/usr/java/jdk1.8.0_181-amd64/
#配置 HBase 不使用自帶的 zookeeper
export HBASE_MANAGES_ZK=false
2.5.3、配置 $HBASE_HOME/conf/hbase-site.xmlhbase.rootdir hdfs://mycluster/hbase hbase.cluster.distributed true hbase.zookeeper.quorum node3,node4,node5 hbase.unsafe.stream.capability.enforce false
2.5.4、配置 $HBASE_HOME/conf/regionservers,配置 RegionServer 節點node3
node4
node5
2.5.5、配置 backup-masters 文件手動創建 $HBASE_HOME/conf/backup-masters 文件,指定備用的 HMaster,需要手動創建文件,這裡寫入 node5,在 HBase 任意節點都可以啟動 HMaster,都可以成為備用 Master ,可以使用命令:hbase-daemon.sh start master 啟動。
#創建 $HBASE_HOME/conf/backup-masters 文件,寫入node5[root@node4 conf]# vim backup-mastersnode5
2.5.6、複製 hdfs-site.xml 到 $HBASE_HOME/conf/下[root@node4 conf]# scp /software/hadoop-3.1.4/etc/hadoop/hdfs-site.xml /software/hbase-2.2.6/conf/
2.5.7、將 HBase 安裝包發送到 node3,node5 節點上,並在 node3,node5 節點上配置 HBase 環境變量[root@node4 software]# cd /software[root@node4 software]# scp -r ./hbase-2.2.6 node3:/software/[root@node4 software]# scp -r ./hbase-2.2.6 node5:/software/# 注意:在node3、node5上配置HBase環境變量。vim /etc/profileexport HBASE_HOME=/software/hbase-2.2.6/export PATH=$PATH:$HBASE_HOME/bin#使環境變量生效source /etc/profile
2.5.8、重啟 Zookeeper、重啟 HDFS 及啟動 HBase 集群#注意:一定要重啟Zookeeper,重啟HDFS,在node4節點上啟動HBase集群[root@node4 software]# start-hbase.sh
訪問 WebUI,http://node4:16010。停止集群:在任意一臺節點上 stop-hbase.sh
2.5.9、測試 HBase 集群
在 Hbase 中創建表 test,指定'cf1','cf2'兩個列族,並向表 test 中插入幾條數據:
#進入hbase[root@node4 ~]# hbase shell#創建表testcreate 'test','cf1','cf2'#查看創建的表list#向表test中插入數據put 'test','row1','cf1:id','1'put 'test','row1','cf1:name','zhangsan'put 'test','row1','cf1:age',18#查詢表test中rowkey為row1的數據get 'test','row1'
2.6、搭建 Phoenix這裡搭建 Phoenix 版本為 5.0.0,Phoenix 採用單機安裝方式即可,這裡將 Phoenix 安裝到 node4 節點上。
Phoenix 下載及安裝步驟如下:
2.6.1、下載 PhoenixPhoenix 對應的 HBase 有版本之分,可以從官網:http://phoenix.apache.org/download.html來下載,要對應自己安裝的 HBase 版本下載。我們這裡安裝的 HBase 版本為 2.2.6,這裡下載 Phoenix5.0.0 版本。下載地址如下:
http://archive.apache.org/dist/phoenix/apache-phoenix-5.0.0-HBase-2.0/bin/
注意:不要下載 phoenix5.1.2 版本,與 Hbase2.2.6 不兼容
2.6.2、上傳解壓
[root@node4 ~]# cd /software/[root@node4 software]# tar -zxvf ./apache-phoenix-5.0.0-HBase-2.0-bin.tar.gz
2.6.3、拷貝 Phoenix 整合 HBase 需要的 jar 包將前面解壓好安裝包下的 phoenix 開頭的包發送到每個 HBase 節點下的 lib 目錄下。
[root@node4 ~]# cd /software/apache-phoenix-5.0.0-HBase-2.0-bin#直接複製到node4節點對應的HBase目錄下[root@node4 apache-phoenix-5.0.0-HBase-2.0-bin]# cp ./phoenix-*.jar /software/hbase-2.2.6/lib/#發送到node3,node5兩臺HBase節點[root@node4 apache-phoenix-5.0.0-HBase-2.0-bin]# scp ./phoenix-*.jar node3:/software/hbase-2.2.6/lib/[root@node4 apache-phoenix-5.0.0-HBase-2.0-bin]# scp ./phoenix-*.jar node5:/software/hbase-2.2.6/lib/
2.6.4、複製 core-site.xml、hdfs-site.xml、hbase-site.xml 到 Phoenix將 HDFS 中的 core-site.xml、hdfs-site.xml、hbase-site.xml 複製到 Phoenix bin 目錄下。
[root@node4 ~]# cp /software/hadoop-3.1.4/etc/hadoop/core-site.xml /software/apache-phoenix-5.0.0-HBase-2.0-bin/bin[root@node4 ~]# cp /software/hadoop-3.1.4/etc/hadoop/hdfs-site.xml /software/apache-phoenix-5.0.0-HBase-2.0-bin/bin#輸入yes,覆蓋Phoenix目錄下的hbase-site.xml[root@node4 ~]# cp /software/hbase-2.2.6/conf/hbase-site.xml /software/apache-phoenix-5.0.0-HBase-2.0-bin/bin/
2.6.5、啟動 HDFS,Hbase 集群,啟動 Phoenix[root@node1 ~]# start-all.sh[root@node4 ~]# start-hbase.sh (如果已經啟動Hbase,一定要重啟HBase)#啟動Phoenix[root@node4 ~]# cd /software/apache-phoenix-5.0.0-HBase-2.0-bin/bin/#啟動時可以不指定後面的zookeeper,默認連接當前節點的zookeeper,多個zookeeper節點逗號隔開,最後一個寫埠2181[root@node4 bin]# ./sqlline.py node3,node4,node5:2181#退出Phoenix,使用!quit或者!exit0: jdbc:phoenix:node3,node4,node5:2181> !quitClosing: org.apache.phoenix.jdbc.PhoenixConnection
2.6.6、測試 Phoenix#查看Phoenix表0: jdbc:phoenix:node3,node4,node5:2181> !tables#Phoenix中創建表 test,指定映射到HBase的列族為f10: jdbc:phoenix:node3,node4,node5:2181> create table test(id varchar primary key ,f1.name varchar,f1.age integer);#向表 test中插入數據upsert into test values ('1','zs',18);#查詢插入的數據0: jdbc:phoenix:node3,node4,node5:2181> select * from test; ----- ------- ------ | ID | NAME | AGE | ----- ------- ------ | 1 | zs | 18 | ----- ------- ------ #在HBase中查看對應的數據,hbase中將非String類型的value數據全部轉為了16進位hbase(main):013:0> scan 'TEST'
注意:在 Phoenix 中創建的表,插入數據時,在 HBase 中查看發現對應的數據都進行了 16 進位編碼,這裡默認 Phoenix 中對數據進行的編碼,我們在 Phoenix 中建表時可以指定「column_encoded_bytes=0」參數,不讓 Phoenix 對 column family 進行編碼。例如以下建表語句,在 Phoenix 中插入數據後,在 HBase 中可以查看到正常格式數據:
create table mytable ("id" varchar primary key ,"cf1"."name" varchar,"cf1"."age" varchar) column_encoded_bytes=0;upsert into mytable values ('1','zs','18');
以上再次在 HBase 中查看,顯示數據正常
2.7、搭建 Kafka
這裡選擇 Kafka 版本為 0.11.0.3,對應的搭建節點如下:
搭建詳細步驟如下:
2.7.1、上傳解壓[root@node1 software]# tar -zxvf ./kafka_2.11-0.11.0.3.tgz
2.7.2、配置 Kafka在 node3 節點上配置 Kafka,進入/software/kafka_2.11-0.11.0.3/config/中修改 server.properties,修改內容如下:
broker.id=0 #注意:這裡要唯一的Integer類型port=9092 #kafka寫入數據的埠log.dirs=/kafka-logs #真實數據存儲的位置zookeeper.connect=node3:2181,node4:2181,node5:2181 #zookeeper集群
2.7.3、將以上配置發送到 node2,node3 節點上[root@node1 software]# scp -r /software/kafka_2.11-0.11.0.3 node2:/software/[root@node1 software]# scp -r /software/kafka_2.11-0.11.0.3 node3:/software/
2.7.4、修改 node2,node3 節點上的 server.properties 文件node2、node3 節點修改 $KAFKA_HOME/config/server.properties 文件中的 broker.id,node2 中修改為 1,node3 節點修改為 2。
2.7.5、創建 Kafka 啟動腳本在 node1,node2,node3 節點/software/kafka_2.11-0.11.0.3 路徑中編寫 Kafka 啟動腳本「startKafka.sh」,內容如下:
nohup bin/kafka-server-start.sh config/server.properties > kafkalog.txt 2>&1 &
node1,node2,node3 節點配置完成後修改「startKafka.sh」腳本執行權限:
chmod x ./startKafka.sh
2.7.6、啟動 Kafka 集群在 node1,node2,node3 三臺節點上分別執行/software/kafka/startKafka.sh 腳本,啟動 Kafka:
[root@node1 kafka_2.11-0.11.0.3]# ./startKafka.sh [root@node2 kafka_2.11-0.11.0.3]# ./startKafka.sh [root@node3 kafka_2.11-0.11.0.3]# ./startKafka.sh
2.7.7、Kafka 命令測試#創建topic ./kafka-topics.sh --zookeeper node3:2181,node4:2181,node5:2181 --create --topic testtopic --partitions 3 --replication-factor 3#console控制臺向topic 中生產數據./kafka-console-producer.sh --broker-list node1:9092,node2:9092,node3:9092 --topic testtopic#console控制臺消費topic中的數據./kafka-console-consumer.sh --bootstrap-server node1:9092,node2:9092,node3:9092 --topic testtopic
2.8、搭建 Redis這裡選擇 Redis 版本為 2.8.18 版本,Redis 安裝在 node4 節點上,節點分布如下:
具體搭建步驟如下:
2.8.1、將 redis 安裝包上傳到 node4 節點,並解壓[root@node4 ~]# cd /software/[root@node4 software]# tar -zxvf ./redis-2.8.18.tar.gz
2.8.2、node4 安裝需要的 C 插件[root@node4 ~]# yum -y install gcc tcl
2.8.3、編譯 Redis進入/software/redis-2.8.18 目錄中,編譯 redis。
2.8.4、創建安裝目錄安裝 Redis#創建安裝目錄[root@node4 ~]# mkdir -p /software/redis#進入redis編譯目錄,安裝redis[root@node4 ~]# cd /software/redis-2.8.18[root@node4 redis-2.8.18]# make PREFIX=/software/redis install
注意:現在就可以使用 redis 了,進入/software/redis/bin 下,就可以執行 redis 命令。
2.8.5、將 Redis 加入環境變量,加入系統服務,設置開機啟動#將redis-server連結到/usr/local/bin/目錄下,後期加入系統服務時避免報錯[root@node4 ~]# ln -sf /software/redis-2.8.18/src/redis-server /usr/local/bin/#執行如下命令,配置redis Server,一直回車即可[root@node4 ~]# cd /software/redis-2.8.18/utils/[root@node4 utils]# ./install_server.sh#執行完以上安裝,在/etc/init.d下會修改redis_6379名稱並加入系統服務[root@node4 utils]# cd /etc/init.d/[root@node4 init.d]# mv redis_6379 redisd[root@node4 init.d]# chkconfig --add redisd#檢查加入系統狀態,3,4,5為開,就是開機自動啟動[root@node4 init.d]# chkconfig --list
2.8.6、配置 Redis 環境變量
# 在node4節點上編輯profile文件,vim /etc/profileexport REDIS_HOME=/software/redisexport PATH=$PATH:$REDIS_HOME/bin#使環境變量生效source /etc/profile
2.8.7、啟動|停止 Redis 服務後期每次開機啟動都會自動啟動 Redis,也可以使用以下命令手動啟動|停止 redis
#啟動redis[root@node4 init.d]# service redisd start#停止redis[root@node4 init.d]# redis-cli shutdown
2.8.8、測試 redis#進入redis客戶端[root@node4 ~]# redis-cli#切換1號庫,並插入key127.0.0.1:6379> select 1127.0.0.1:6379[1]> hset rediskey zhagnsan 100#查看所有key並獲取key值127.0.0.1:6379[1]> keys *127.0.0.1:6379[1]> hgetall rediskey#刪除指定key127.0.0.1:6379[1]> del 'rediskey'
2.9、搭建 Flink這裡選擇 Flink 的版本為 1.11.6,原因是 1.11.6 與 Iceberg 的整合比較穩定。
Flink 搭建節點分布如下:
具體搭建步驟如下:
2.9.1、上傳壓縮包解壓將 Flink 的安裝包上傳到 node1 節點/software 下並解壓:
[root@node1 software]# tar -zxvf ./flink-1.11.6-bin-scala_2.11.tgz
2.9.2、修改配置文件在 node1 節點上進入到 Flink conf 目錄下,配置 flink-conf.yaml 文件,內容如下:
#進入flink-conf.yaml目錄[root@node1 conf]# cd /software/flink-1.11.6/conf/#vim編輯flink-conf.yaml文件,配置修改內容如下jobmanager.rpc.address: node1taskmanager.numberOfTaskSlots: 3
其中:taskmanager.numberOfTaskSlot 參數默認值為 1,修改成 3。表示數每一個 TaskManager 上有 3 個 Slot。
2.9.3、配置 TaskManager 節點在 node1 節點上配置 $FLINK_HOME/conf/workers 文件,內容如下:
node1
node2
node3
2.9.4、分發安裝包到 node2,node3,node4 節點[root@node1 software]# scp -r ./flink-1.11.6 node2:/software/[root@node1 software]# scp -r ./flink-1.11.6 node3:/software/#注意,這裡發送到node4,node4隻是客戶端[root@node1 software]# scp -r ./flink-1.11.6 node4:/software/
2.9.5、啟動 Flink 集群#在node1節點中,啟動Flink集群[root@node1 ~]# cd /software/flink-1.11.6/bin/[root@node1 bin]# ./start-cluster.sh
2.9.6、訪問 flink Webuihttp://node1:8081,進入頁面如下:
2.9.7、準備「flink-shaded-hadoop-2-uber-2.8.3-10.0.jar」包
在基於 Yarn 提交 Flink 任務時需要將 Hadoop 依賴包「flink-shaded-hadoop-2-uber-2.8.3-10.0.jar」放入 flink 各個節點的 lib 目錄中(包括客戶端)。
2.10、搭建 Flume這裡搭建 Flume 的版本為 1.9.0 版本,Flume 搭建使用單機模式,節點分配如下:
Flume 的搭建配置步驟如下:
2.10.1、首先將 Flume 上傳到 Mynode5 節點/software/路徑下,並解壓,命令如下:[root@ node5 software]# tar -zxvf ./apache-flume-1.9.0-bin.tar.gz
2.10.2、其次配置 Flume 的環境變量,配置命令如下:#修改 /etc/profile文件,在最後追加寫入如下內容,配置環境變量:[root@node5 software]# vim /etc/profileexport FLUME_HOME=/software/apache-flume-1.9.0-binexport PATH=$FLUME_HOME/bin:$PATH#保存以上配置文件並使用source命令使配置文件生效[root@node5 software]# source /etc/profile
經過以上兩個步驟,Flume 的搭建已經完成,至此,Flume 的搭建完成,我們可以使用 Flume 進行數據採集。
2.11、搭建 maxwell這裡搭建 Maxwell 的版本為 1.28.2 版本,節點分配如下:
2.11.1、開啟 MySQL binlog 日誌
此項目主要使用 Maxwell 來監控業務庫 MySQL 中的數據到 Kafka,Maxwell 原理是通過同步 MySQL binlog 日誌數據達到同步 MySQL 數據的目的。Maxwell 不支持高可用搭建,但是支持斷點還原,可以在執行失敗時重新啟動繼續上次位置讀取數據,此外安裝 Maxwell 前需要開啟 MySQL binlog 日誌,步驟如下:
2.11.1.1、登錄 mysql 查看 MySQL 是否開啟 binlog 日誌[root@node2 ~]# mysql -u root -p123456mysql> show variables like 'log_%';
2.11.1.2、 開啟 MySQL binlog 日誌
在/etc/my.cnf 文件中[mysqld]下寫入以下內容:
[mysqld]
# 隨機指定一個不能和其他集群中機器重名的字符串,配置 MySQL replaction 需要定義
server-id=123
#配置 binlog 日誌目錄,配置後會自動開啟 binlog 日誌,並寫入該目錄
log-bin=/var/lib/mysql/mysql-bin
# 選擇 ROW 模式
binlog-format=ROW
2.11.1.3、重啟 mysql 服務,重新查看 binlog 日誌情況[root@node2 ~]# service mysqld restart[root@node2 ~]# mysql -u root -p123456mysql> show variables like 'log_%';
2.11.2、安裝 Maxwell
這裡 maxwell 安裝版本選擇 1.28.2,選擇 node3 節點安裝,安裝 maxwell 步驟如下:
2.11.2.1、將下載好的安裝包上傳到 node3 並解壓[root@node3 ~]# cd /software/[root@node3 software]# tar -zxvf ./maxwell-1.28.2.tar.gz
2.11.2.2、在 MySQL 中創建 Maxwell 的用戶及賦權Maxwell 同步 mysql 數據到 Kafka 中需要將讀取的 binlog 位置文件及位置信息等數據存入 MySQL,所以這裡創建 maxwell 資料庫,及給 maxwell 用戶賦權訪問其他所有資料庫。
mysql> CREATE database maxwell;mysql> CREATE USER 'maxwell'@'%' IDENTIFIED BY 'maxwell';mysql> GRANT ALL ON maxwell.* TO 'maxwell'@'%';mysql> GRANT SELECT, REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO 'maxwell'@'%';mysql> flush privileges;
2.11.2.3、修改配置「config.properties」文件node3 節點進入「/software/maxwell-1.28.2」,修改「config.properties.example」為「config.properties」並配置:
producer=kafkakafka.bootstrap.servers=node1:9092,node2:9092,node3:9092kafka_topic=test-topic#設置根據表將binlog寫入Kafka不同分區,還可指定:[database, table, primary_key, transaction_id, thread_id, column]producer_partition_by=table#mysql 節點host=node2#連接mysql用戶名和密碼user=maxwellpassword=maxwell#指定maxwell 當前連接mysql的實例id,這裡用於全量同步表數據使用client_id=maxwell_first
注意:以上參數也可以在後期啟動 maxwell 時指定參數方式來設置。
2.11.2.4、啟動 zookeeper 及 Kafka,創建對應 test-topic[root@node1 bin]# ./kafka-topics.sh --zookeeper node3:2181,node4:2181,node5:2181 --create --topic test-topic --partitions 3 --replication-factor 3
2.11.2.5、在 Kafka 中監控 test-topic[root@node2 bin]# cd /software/kafka_2.11-0.11/[root@node2 bin]# ./kafka-console-consumer.sh --bootstrap-server node1:9092,node2:9092,node3:9092 --topic test-topic
2.11.2.6、啟動 Maxwell[root@node3 ~]# cd /software/maxwell-1.28.2/bin[root@node3 bin]# maxwell --config ../config.properties.
注意以上啟動也可以編寫腳本:
#startMaxwell.sh 腳本內容:/software/maxwell-1.28.2/bin/maxwell --config /software/maxwell-1.28.2/config.properties > ./log.txt 2>&1 &
修改執行權限:
chmod x ./start_maxwell.sh
注意:這裡我們可以通過 Maxwell 將 MySQL 業務庫中所有 binlog 變化數據監控到 Kafka test-topic 中,在此項目中我們將 MySQL binlog 數據監控到 Kafka 中然後通過 Flink 讀取對應 topic 數據進行處理。
2.11.2.7、在 mysql 中創建庫 testdb,並創建表 person 插入數據mysql> create database testdb;mysql> use testdb;mysql> create table person(id int,name varchar(255),age int);mysql> insert into person values (1,'zs',18);mysql> insert into person values (2,'ls',19);mysql> insert into person values (3,'ww',20);
可以看到在監控的 kafka test-topic 中有對應的數據被同步到 topic 中:
2.11.2.8、全量同步 mysql 數據到 kafka
這裡以 MySQL 表 testdb.person 為例將全量數據導入到 Kafka 中,可以通過配置 Maxwell,使用 Maxwell bootstrap 功能全量將已經存在 MySQL testdb.person 表中的數據導入到 Kafka,操作步驟如下:
#啟動Maxwell[root@node3 ~]# cd /software/maxwell-1.28.2/bin[root@node3 bin]# maxwell --config ../config.properties#啟動maxwell-bootstrap全量同步數據[root@node3 ~]# cd /software/maxwell-1.28.2/bin[root@node3 bin]# ./maxwell-bootstrap --database testdb --table person --host node2 --user maxwell --password maxwell --client_id maxwell_first --where "id>0"
執行之後可以看到對應的 Kafka test-topic 中將表 testdb.person 中的數據全部導入一遍
2.12、搭建 clickhouse這裡 clickhouse 的版本選擇 21.9.4.35,clickhouse 選擇分布式安裝,clickhouse 節點分布如下:
clickhouse 詳細安裝步驟如下:
2.12.1、選擇三臺 clickhouse 節點,在每臺節點上安裝 clickhouse 需要的安裝包這裡選擇 node1、node2,node3 三臺節點,上傳安裝包,分別在每臺節點上執行如下命令安裝 clickhouse:
rpm -ivh ./clickhosue-common-static-21.9.4.35-2.x86_64.rpm#注意在安裝以下rpm包時,讓輸入密碼,可以直接回車跳過rpm -ivh ./clickhouse-server-21.9.4.35-2.noarch.rpmrpm -ivh ./clickhouse-client-21.9.4.35-2.noarch.rpm
2.12.2、安裝 zookeeper 集群並啟動搭建 clickhouse 集群時,需要使用 Zookeeper 去實現集群副本之間的同步,所以這裡需要 zookeeper 集群,zookeeper 集群安裝後可忽略此步驟。
2.12.3、配置外網可訪問在每臺 clickhouse 節點中配置/etc/clickhouse-server/config.xml 文件第 164 行,把以下對應配置注釋去掉,如下:
::1#注意每臺節點監聽的host名稱配置當前節點host,需要強制保存wq!node1
2.12.4、在每臺節點創建 metrika.xml 文件,寫入以下內容在 node1、node2、node3 節點上/etc/clickhouse-server/config.d 路徑下下配置 metrika.xml 文件,默認 clickhouse 會在/etc 路徑下查找 metrika.xml 文件,但是必須要求 metrika.xml 上級目錄擁有者權限為 clickhouse ,所以這裡我們將 metrika.xml 創建在/etc/clickhouse-server/config.d 路徑下,config.d 目錄的擁有者權限為 clickhouse。
在 metrika.xml 中我們配置後期使用的 clickhouse 集群中創建分布式表時使用 3 個分片,每個分片有 1 個副本,配置如下:
vim /etc/clickhouse-server/config.d/metrika.xml
true node1 9000 true node2 9000 true node3 9000 node3 2181 node4 2181 node5 2181 01 node1 ::/0 10000000000 0.01 lz4
對以上配置文件中配置項的解釋如下:
remote_servers:clickhouse 集群配置標籤,固定寫法。注意:這裡與之前版本不同,之前要求必須以 clickhouse 開頭,新版本不再需要。
clickhouse_cluster_3shards_1replicas:配置 clickhouse 的集群名稱,可自由定義名稱,注意集群名稱中不能包含點號。這裡代表集群中有 3 個分片,每個分片有 1 個副本。
分片是指包含部分數據的伺服器,要讀取所有的數據,必須訪問所有的分片。
副本是指存儲分片備份數據的伺服器,要讀取所有的數據,訪問任意副本上的數據即可。
shard:分片,一個 clickhouse 集群可以分多個分片,每個分片可以存儲數據,這裡分片可以理解為 clickhouse 機器中的每個節點,1 個分片只能對應 1 服務節點。這裡可以配置一個或者任意多個分片,在每個分片中可以配置一個或任意多個副本,不同分片可配置不同數量的副本。如果只是配置一個分片,這種情況下查詢操作應該稱為遠程查詢,而不是分布式查詢。
replica:每個分片的副本,默認每個分片配置了一個副本。也可以配置多個,副本的數量上限是由 clickhouse 節點的數量決定的。如果配置了副本,讀取操作可以從每個分片裡選擇一個可用的副本。如果副本不可用,會依次選擇下個副本進行連接。該機制利於系統的可用性。
internal_replication:默認為 false,寫數據操作會將數據寫入所有的副本,設置為 true,寫操作只會選擇一個正常的副本寫入數據,數據的同步在後臺自動進行。
zookeeper:配置的 zookeeper 集群,注意:與之前版本不同,之前版本是「zookeeper-servers」。
macros:區分每臺 clickhouse 節點的宏配置,macros 中標籤代表當前節點的分片號,標籤代表當前節點的副本號,這兩個名稱可以隨意取,後期在創建副本表時可以動態讀取這兩個宏變量。注意:每臺 clickhouse 節點需要配置不同名稱。
networks:這裡配置 ip 為「::/0」代表任意 IP 可以訪問,包含 IPv4 和 IPv6。
注意:允許外網訪問還需配置/etc/clickhouse-server/config.xml 參照第三步驟。
clickhouse_compression:MergeTree 引擎表的數據壓縮設置,min_part_size:代表數據部分最小大小。min_part_size_ratio:數據部分大小與表大小的比率。method:數據壓縮格式。
注意:需要在每臺 clickhouse 節點上配置 metrika.xml 文件,並且修改每個節點的 macros 配置名稱。
#node2節點修改metrika.xml中的宏變量如下: 02 node2 #node3節點修改metrika.xml中的宏變量如下: 03 node3
2.12.5、在每臺節點上啟動/查看/重啟/停止 clickhouse 服務首先啟動 zookeeper 集群,然後分別在 node1、node2、node3 節點上啟動 clickhouse 服務,這裡每臺節點和單節點啟動一樣。啟動之後,clickhouse 集群配置完成。
#每臺節點啟動Clickchouse服務service clickhouse-server start#每臺節點查看clickhouse服務狀態service clickhouse-server status#每臺節點重啟clickhouse服務service clickhouse-server restart#每臺節點關閉Clikchouse服務service clickhouse-server stop
2.12.6、檢查集群配置是否完成在 node1、node2、node3 任意一臺節點進入 clickhouse 客戶端,查詢集群配置:
#選擇三臺clickhouse任意一臺節點,進入客戶端clickhouse-client #查詢集群信息,看到下圖所示即代表集群配置成功。node1 :) select * from system.clusters;
查詢集群信息,也可以使用如下命令
node1 :) select cluster,host_name from system.clusters;
2.12.7、測試 clickhouse
#在clickhouse node1節點創建mergeTree表 mtcreate table mt(id UInt8,name String,age UInt8) engine = MergeTree order by (id);#向表 mt 中插入數據insert into table mt values(1,'zs',18),(2,'ls',19),(3,'ww',20);#查詢表mt中的數據select * from mt;
以上就是湖倉一體電商項目所有基礎環境的搭建,希望對大家有幫助,下期會帶來項目開發和實操,敬請期待吧
,