上篇已經大概講述大資料元件版本和叢集矩陣配置說明,有不清楚的同學,可以閱讀上一篇
湖倉一體電商項目(二):項目使用技術及版本和基礎環境準備_Lansonli的部落格-CSDN部落格
接下帶大家一一搭建項目基礎元件
一、搭建Zookeeper
這裡搭建zookeeper版本為3.4.13,搭建zookeeper對應的角色分布如下:
節點IP | 節點名稱 | Zookeeper |
192.168.179.4 | node1 | |
192.168.179.5 | node2 | |
192.168.179.6 | node3 | ★ |
192.168.179.7 | node4 | ★ |
192.168.179.8 | node5 | ★ |
具體搭建步驟如下:
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/zookeeper
export PATH=$PATH:$ZOOKEEPER_HOME/bin
#使配置生效
source /etc/profile
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
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/
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/zookeeper
export PATH=$PATH:$ZOOKEEPER_HOME/bin
#使配置生效
source /etc/profile
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
6、各個節點啟動zookeeper,并檢查程序狀态
#各個節點啟動zookeeper指令
zkServer.sh start
#檢查各個節點zookeeper程序狀态
zkServer.sh status
二、搭建HDFS
這裡搭建HDFS版本為3.1.4,搭建HDFS對應的角色在各個節點分布如下:
節點IP | 節點名稱 | NN | DN | ZKFC | JN | RM | NM |
192.168.179.4 | node1 | ★ | ★ | ★ | |||
192.168.179.5 | node2 | ★ | ★ | ★ | |||
192.168.179.6 | node3 | ★ | ★ | ★ | |||
192.168.179.7 | node4 | ★ | ★ | ★ | |||
192.168.179.8 | node5 | ★ | ★ | ★ |
搭建具體步驟如下:
1、各個節點安裝HDFS HA自動切換必須的依賴
yum -y install psmisc
2、上傳下載下傳好的Hadoop安裝包到node1節點上,并解壓
[root@node1 software]# tar -zxvf ./hadoop-3.1.4.tar.gz
3、在node1節點上配置Hadoop的環境變量
[root@node1 software]# vim /etc/profile
export HADOOP_HOME=/software/hadoop-3.1.4/
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:
#使配置生效
source /etc/profile
4、配置$HADOOP_HOME/etc/hadoop下的hadoop-env.sh檔案
#導入JAVA_HOME export JAVA_HOME=/usr/java/jdk1.8.0_181-amd64/
5、配置$HADOOP_HOME/etc/hadoop下的hdfs-site.xml檔案
<configuration>
<property>
<!--這裡配置邏輯名稱,可以随意寫 -->
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<property>
<!-- 禁用權限 -->
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
<property>
<!-- 配置namenode 的名稱,多個用逗号分割 -->
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<property>
<!-- dfs.namenode.rpc-address.[nameservice ID].[name node ID] namenode 所在伺服器名稱和RPC監聽端口号 -->
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>node1:8020</value>
</property>
<property>
<!-- dfs.namenode.rpc-address.[nameservice ID].[name node ID] namenode 所在伺服器名稱和RPC監聽端口号 -->
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>node2:8020</value>
</property>
<property>
<!-- dfs.namenode.http-address.[nameservice ID].[name node ID] namenode 監聽的HTTP協定端口 -->
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>node1:50070</value>
</property>
<property>
<!-- dfs.namenode.http-address.[nameservice ID].[name node ID] namenode 監聽的HTTP協定端口 -->
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>node2:50070</value>
</property>
<property>
<!-- namenode 共享的編輯目錄, journalnode 所在伺服器名稱和監聽的端口 -->
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://node3:8485;node4:8485;node5:8485/mycluster</value>
</property>
<property>
<!-- namenode高可用代理類 -->
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<property>
<!-- 使用ssh 免密碼自動登入 -->
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<property>
<!-- journalnode 存儲資料的地方 -->
<name>dfs.journalnode.edits.dir</name>
<value>/opt/data/journal/node/local/data</value>
</property>
<property>
<!-- 配置namenode自動切換 -->
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
</configuration>
6、配置$HADOOP_HOME/ect/hadoop/core-site.xml
<configuration>
<property>
<!-- 為Hadoop 用戶端配置預設的高可用路徑 -->
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<property>
<!-- Hadoop 資料存放的路徑,namenode,datanode 資料存放路徑都依賴本路徑,不要使用 file:/ 開頭,使用絕對路徑即可
namenode 預設存放路徑 :file://${hadoop.tmp.dir}/dfs/name
datanode 預設存放路徑 :file://${hadoop.tmp.dir}/dfs/data
-->
<name>hadoop.tmp.dir</name>
<value>/opt/data/hadoop/</value>
</property>
<property>
<!-- 指定zookeeper所在的節點 -->
<name>ha.zookeeper.quorum</name>
<value>node3:2181,node4:2181,node5:2181</value>
</property>
</configuration>
7、配置$HADOOP_HOME/etc/hadoop/yarn-site.xml
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.env-whitelist</name>
<value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
</property>
<property>
<!-- 配置yarn為高可用 -->
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<property>
<!-- 叢集的唯一辨別 -->
<name>yarn.resourcemanager.cluster-id</name>
<value>mycluster</value>
</property>
<property>
<!-- ResourceManager ID -->
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<property>
<!-- 指定ResourceManager 所在的節點 -->
<name>yarn.resourcemanager.hostname.rm1</name>
<value>node1</value>
</property>
<property>
<!-- 指定ResourceManager 所在的節點 -->
<name>yarn.resourcemanager.hostname.rm2</name>
<value>node2</value>
</property>
<property>
<!-- 指定ResourceManager Http監聽的節點 -->
<name>yarn.resourcemanager.webapp.address.rm1</name>
<value>node1:8088</value>
</property>
<property>
<!-- 指定ResourceManager Http監聽的節點 -->
<name>yarn.resourcemanager.webapp.address.rm2</name>
<value>node2:8088</value>
</property>
<property>
<!-- 指定zookeeper所在的節點 -->
<name>yarn.resourcemanager.zk-address</name>
<value>node3:2181,node4:2181,node5:2181</value>
</property>
<property>
<!-- 關閉虛拟記憶體檢查 -->
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
<!-- 啟用節點的内容和CPU自動檢測,最小記憶體為1G -->
<!--<property>
<name>yarn.nodemanager.resource.detect-hardware-capabilities</name>
<value>true</value>
</property>-->
</configuration>
8、配置$HADOOP_HOME/etc/hadoop/mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
9、配置$HADOOP_HOME/etc/hadoop/workers檔案
[root@node1 ~]# vim /software/hadoop-3.1.4/etc/hadoop/workers
node3
node4
node5
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
11、配置$HADOOP_HOME/sbin/start-yarn.sh和stop-yarn.sh兩個檔案頂部添加以下參數,防止啟動錯誤
YARN_RESOURCEMANAGER_USER=root YARN_NODEMANAGER_USER=root
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/
13、在node2、node3、node4、node5節點上配置HADOOP_HOME
#分别在node2、node3、node4、node5節點上配置HADOOP_HOME
vim /etc/profile
export HADOOP_HOME=/software/hadoop-3.1.4/
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:
#最後記得Source
source /etc/profile
14、啟動HDFS和Yarn
#在node3,node4,node5節點上啟動zookeeper
zkServer.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叢集。
15、通路WebUI
通路HDFS : http://node1:50070
;
通路Yarn WebUI :http://node1:8088
;
16、停止叢集
#停止叢集
[root@node1 ~]# stop-dfs.sh
[root@node1 ~]# stop-yarn.sh
注意:以上也可以使用 stop-all.sh 停止叢集。
三、搭建Hive
這裡搭建Hive的版本為3.1.2,搭建Hive的節點劃分如下:
節點IP | 節點名稱 | Hive伺服器 | Hive用戶端 | MySQL |
192.168.179.4 | node1 | ★ | ||
192.168.179.5 | node2 | ★(已搭建) | ||
192.168.179.6 | node3 | ★ |
搭建具體步驟如下:
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、将解壓好的Hive安裝包發送到node3節點上
[root@node1 ~]# scp -r /software/hive-3.1.2/ node3:/software/
3、配置node1、node3兩台節點的Hive環境變量
vim /etc/profile
export HIVE_HOME=/software/hive-3.1.2/
export PATH=$PATH:$HIVE_HOME/bin
#source 生效
source /etc/profile
4、在node1節點$HIVE_HOME/conf下建立hive-site.xml并配置
<configuration>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://node2:3306/hive?createDatabaseIfNotExist=true&useSSL=false</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>123456</value>
</property>
</configuration>
5、在node3節點$HIVE_HOME/conf/中建立hive-site.xml并配置
<configuration>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
<property>
<name>hive.metastore.local</name>
<value>false</value>
</property>
<property>
<name>hive.metastore.uris</name>
<value>thrift://node1:9083</value>
</property>
</configuration>
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/
7、将“mysql-connector-java-5.1.47.jar”驅動包上傳到node1節點的$HIVE_HOME/lib目錄下
上傳後,需要将mysql驅動包傳入$HIVE_HOME/lib/目錄下,這裡node1,node3節點都需要傳入。
8、在node1節點中初始化Hive
#初始化hive,hive2.x版本後都需要初始化
[root@node1 ~]# schematool -dbType mysql -initSchema
9、在服務端和用戶端操作Hive
#在node1中登入Hive ,建立表test
[root@node1 conf]# hive
hive> 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]# hive
hive> select * from test;
OK
1 zs 18
四、Hive與Iceberg整合
Iceberg就是一種表格式,支援使用Hive對Iceberg進行讀寫操作,但是對Hive的版本有要求,如下:
操作 | Hive 2.x | Hive 3.1.2 |
CREATE EXTERNAL TABLE | √ | √ |
CREATE TABLE | √ | √ |
DROP TABLE | √ | √ |
SELECT | √ | √ |
INSERT INTO | √ | √ |
這裡基于Hive3.1.2版本進行Hive內建Iceberg。
1、開啟Hive支援Iceberg
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目錄下。
1.2、配置hive-site.xml
在Hive用戶端$HIVE_HOME/conf/hive-site.xml中追加如下配置:
<property>
<name>iceberg.engine.hive.enabled</name>
<value>true</value>
</property>
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.<catalog_name>.type”屬性來決定加載Iceberg表的方式,該屬性可以配置:hive、hadoop,其中“<catalog_name>”是自己随便定義的名稱,主要是在hive中建立Iceberg格式表時配置iceberg.catalog屬性使用。
在Hive中建立Iceberg格式表時,根據建立Iceberg格式表時是否指定iceberg.catalog屬性值,有以下三種方式決定Iceberg格式表如何加載(資料存儲在什麼位置)。
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;
OK
1 zs 18 20211212
在Hive預設的warehouse目錄下可以看到建立的表目錄:
;
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;
OK
2 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.<catalog_name>.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;
OK
3 ww 20 20211213
在指定的“iceberg.catalog.hadoop.warehouse”路徑下可以看到建立的表目錄:
;
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引擎建立表。
五、搭建HBase
這裡選擇HBase版本為2.2.6,搭建HBase各個角色分布如下:
節點IP | 節點名稱 | HBase服務 |
192.168.179.6 | node3 | RegionServer |
192.168.179.7 | node4 | HMaster,RegionServer |
192.168.179.8 | node5 | RegionServer |
具體搭建步驟如下:
1、将下載下傳好的安裝包發送到node4節點上,并解壓,配置環境變量
#将下載下傳好的HBase安裝包上傳至node4節點/software下,并解壓
[root@node4 software]# tar -zxvf ./hbase-2.2.6-bin.tar.gz
目前節點配置HBase環境變量
#配置HBase環境變量
[root@node4 software]# vim /etc/profile
export HBASE_HOME=/software/hbase-2.2.6/
export PATH=$PATH:$HBASE_HOME/bin
#使環境變量生效
[root@node4 software]# source /etc/profile
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
3、配置$HBASE_HOME/conf/hbase-site.xml
<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://mycluster/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>node3,node4,node5</value>
</property>
<property>
<name>hbase.unsafe.stream.capability.enforce</name>
<value>false</value>
</property>
</configuration>
4、配置$HBASE_HOME/conf/regionservers,配置RegionServer節點
node3 node4 node5
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-masters
node5
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/
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/profile
export HBASE_HOME=/software/hbase-2.2.6/
export PATH=$PATH:$HBASE_HOME/bin
#使環境變量生效
source /etc/profile
8、重新開機Zookeeper、重新開機HDFS及啟動HBase叢集
#注意:一定要重新開機Zookeeper,重新開機HDFS,在node4節點上啟動HBase叢集
[root@node4 software]# start-hbase.sh
通路WebUI,http://node4:16010。
停止叢集:在任意一台節點上stop-hbase.sh
;
9、測試HBase叢集
在Hbase中建立表test,指定'cf1','cf2'兩個列族,并向表test中插入幾條資料:
#進入hbase
[root@node4 ~]# hbase shell
#建立表test
create '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'
六、搭建Phoenix
這裡搭建Phoenix版本為5.0.0,Phoenix采用單機安裝方式即可,這裡将Phoenix安裝到node4節點上。
節點IP | 節點名稱 | Phoenix服務 |
192.168.179.7 | node4 | Phoenix Client |
Phoenix下載下傳及安裝步驟如下:
1、下載下傳Phoenix
Phoenix對應的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、上傳解壓
[root@node4 ~]# cd /software/
[root@node4 software]# tar -zxvf ./apache-phoenix-5.0.0-HBase-2.0-bin.tar.gz
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/
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/
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或者!exit
0: jdbc:phoenix:node3,node4,node5:2181> !quit
Closing: org.apache.phoenix.jdbc.PhoenixConnection
6、測試Phoenix
#檢視Phoenix表
0: jdbc:phoenix:node3,node4,node5:2181> !tables
#Phoenix中建立表 test,指定映射到HBase的列族為f1
0: 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中檢視,顯示資料正常
;
七、搭建Kafka
這裡選擇Kafka版本為0.11.0.3,對應的搭建節點如下:
節點IP | 節點名稱 | Kafka服務 |
192.168.179.4 | node1 | kafka broker |
192.168.179.5 | node2 | kafka broker |
192.168.179.6 | node3 | kafka broker |
搭建詳細步驟如下:
1、上傳解壓
[root@node1 software]# tar -zxvf ./kafka_2.11-0.11.0.3.tgz
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叢集
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/
4、修改node2,node3節點上的server.properties檔案
node2、node3節點修改$KAFKA_HOME/config/server.properties檔案中的broker.id,node2中修改為1,node3節點修改為2。
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
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
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
八、搭建Redis
這裡選擇Redis版本為2.8.18版本,Redis安裝在node4節點上,節點分布如下:
節點IP | 節點名稱 | Redis服務 |
192.168.179.7 | node4 | client |
具體搭建步驟如下:
1、将redis安裝包上傳到node4節點,并解壓
[root@node4 ~]# cd /software/
[root@node4 software]# tar -zxvf ./redis-2.8.18.tar.gz
2、node4安裝需要的C插件
[root@node4 ~]# yum -y install gcc tcl
3、編譯Redis
進入/software/redis-2.8.18目錄中,編譯redis。
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指令。
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
;
6、配置Redis環境變量
# 在node4節點上編輯profile檔案,vim /etc/profile
export REDIS_HOME=/software/redis
export PATH=$PATH:$REDIS_HOME/bin
#使環境變量生效
source /etc/profile
7、啟動|停止 Redis服務
後期每次開機啟動都會自動啟動Redis,也可以使用以下指令手動啟動|停止redis
#啟動redis
[root@node4 init.d]# service redisd start
#停止redis
[root@node4 init.d]# redis-cli shutdown
8、測試redis
#進入redis用戶端
[root@node4 ~]# redis-cli
#切換1号庫,并插入key
127.0.0.1:6379> select 1
127.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
#删除指定key
127.0.0.1:6379[1]> del 'rediskey'
九、搭建Flink
這裡選擇Flink的版本為1.11.6,原因是1.11.6與Iceberg的整合比較穩定。
Flink搭建節點分布如下:
節點IP | 節點名稱 | Flink服務 |
192.168.179.4 | node1 | JobManager,TaskManager |
192.168.179.5 | node2 | TaskManager |
192.168.179.6 | node3 | TaskManager |
192.168.179.7 | node4 | client |
具體搭建步驟如下:
1、上傳壓縮包解壓
将Flink的安裝包上傳到node1節點/software下并解壓:
[root@node1 software]# tar -zxvf ./flink-1.11.6-bin-scala_2.11.tgz
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: node1
taskmanager.numberOfTaskSlots: 3
其中:taskmanager.numberOfTaskSlot參數預設值為1,修改成3。表示數每一個TaskManager上有3個Slot。
3、配置TaskManager節點
在node1節點上配置$FLINK_HOME/conf/workers檔案,内容如下:
node1 node2 node3
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/
5、啟動Flink叢集
#在node1節點中,啟動Flink叢集
[root@node1 ~]# cd /software/flink-1.11.6/bin/
[root@node1 bin]# ./start-cluster.sh
6、通路flink Webui
http://node1:8081,進入頁面如下:
;
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目錄中(包括用戶端)。
十、搭建Flume
這裡搭建Flume的版本為1.9.0版本,Flume搭建使用單機模式,節點配置設定如下:
節點IP | 節點名稱 | Flume服務 |
192.168.179.8 | node5 | flume |
Flume的搭建配置步驟如下:
1、首先将Flume上傳到Mynode5節點/software/路徑下,并解壓,指令如下:
[root@ node5 software]# tar -zxvf ./apache-flume-1.9.0-bin.tar.gz
2、其次配置Flume的環境變量,配置指令如下:
#修改 /etc/profile檔案,在最後追加寫入如下内容,配置環境變量:
[root@node5 software]# vim /etc/profile
export FLUME_HOME=/software/apache-flume-1.9.0-bin
export PATH=$FLUME_HOME/bin:$PATH
#儲存以上配置檔案并使用source指令使配置檔案生效
[root@node5 software]# source /etc/profile
經過以上兩個步驟,Flume的搭建已經完成,至此,Flume的搭建完成,我們可以使用Flume進行資料采集。
十一、搭建maxwell
這裡搭建Maxwell的版本為1.28.2版本,節點配置設定如下:
節點IP | 節點名稱 | Maxwell 服務 |
192.168.179.6 | Node3 | maxwell |
1、開啟MySQL binlog日志
此項目主要使用Maxwell來監控業務庫MySQL中的資料到Kafka,Maxwell原理是通過同步MySQL binlog日志資料達到同步MySQL資料的目的。Maxwell不支援高可用搭建,但是支援斷點還原,可以在執行失敗時重新啟動繼續上次位置讀取資料,此外安裝Maxwell前需要開啟MySQL binlog日志,步驟如下:
1.1、登入mysql檢視MySQL是否開啟binlog日志
[root@node2 ~]# mysql -u root -p123456
mysql> show variables like 'log_%';
;
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
1.3、重新開機mysql 服務,重新檢視binlog日志情況
[root@node2 ~]# service mysqld restart
[root@node2 ~]# mysql -u root -p123456
mysql> show variables like 'log_%';
;
2、安裝Maxwell
這裡maxwell安裝版本選擇1.28.2,選擇node3節點安裝,安裝maxwell步驟如下:
2.1、将下載下傳好的安裝包上傳到node3并解壓
[root@node3 ~]# cd /software/
[root@node3 software]# tar -zxvf ./maxwell-1.28.2.tar.gz
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.3、修改配置“config.properties”檔案
node3節點進入“/software/maxwell-1.28.2”,修改“config.properties.example”為“config.properties”并配置:
producer=kafka
kafka.bootstrap.servers=node1:9092,node2:9092,node3:9092
kafka_topic=test-topic
#設定根據表将binlog寫入Kafka不同分區,還可指定:[database, table, primary_key, transaction_id, thread_id, column]
producer_partition_by=table
#mysql 節點
host=node2
#連接配接mysql使用者名和密碼
user=maxwell
password=maxwell
#指定maxwell 目前連接配接mysql的執行個體id,這裡用于全量同步表資料使用
client_id=maxwell_first
注意:以上參數也可以在後期啟動maxwell時指定參數方式來設定。
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.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.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.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.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中的資料全部導入一遍
十二、搭建clickhouse
這裡clickhouse的版本選擇21.9.4.35,clickhouse選擇分布式安裝,clickhouse節點分布如下:
節點IP | 節點名稱 | clickhouse服務 |
192.168.179.4 | node1 | clickhouse |
192.168.179.5 | node2 | clickhouse |
192.168.179.6 | node3 | clickhouse |
clickhouse詳細安裝步驟如下:
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.rpm
rpm -ivh ./clickhouse-client-21.9.4.35-2.noarch.rpm
2、安裝zookeeper叢集并啟動
搭建clickhouse叢集時,需要使用Zookeeper去實作叢集副本之間的同步,是以這裡需要zookeeper叢集,zookeeper叢集安裝後可忽略此步驟。
3、配置外網可通路
在每台clickhouse節點中配置/etc/clickhouse-server/config.xml檔案第164行<listen_host>,把以下對應配置注釋去掉,如下:
<listen_host>::1</listen_host>
#注意每台節點監聽的host名稱配置目前節點host,需要強制儲存wq!
<listen_host>node1</listen_host>
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
<yandex>
<remote_servers>
<clickhouse_cluster_3shards_1replicas>
<shard>
<internal_replication>true</internal_replication>
<replica>
<host>node1</host>
<port>9000</port>
</replica>
</shard>
<shard>
<internal_replication>true</internal_replication>
<replica>
<host>node2</host>
<port>9000</port>
</replica>
</shard>
<shard>
<internal_replication>true</internal_replication>
<replica>
<host>node3</host>
<port>9000</port>
</replica>
</shard>
</clickhouse_cluster_3shards_1replicas>
</remote_servers>
<zookeeper>
<node index="1">
<host>node3</host>
<port>2181</port>
</node>
<node index="2">
<host>node4</host>
<port>2181</port>
</node>
<node index="3">
<host>node5</host>
<port>2181</port>
</node>
</zookeeper>
<macros>
<shard>01</shard>
<replica>node1</replica>
</macros>
<networks>
<ip>::/0</ip>
</networks>
<clickhouse_compression>
<case>
<min_part_size>10000000000</min_part_size>
<min_part_size_ratio>0.01</min_part_size_ratio>
<method>lz4</method>
</case>
</clickhouse_compression>
</yandex>
對以上配置檔案中配置項的解釋如下:
- 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中标簽<shard>代表目前節點的分片号,标簽<replica>代表目前節點的副本号,這兩個名稱可以随意取,後期在建立副本表時可以動态讀取這兩個宏變量。注意:每台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中的宏變量如下:
<macros>
<shard>02</replica>
<replica>node2</replica>
</macros>
#node3節點修改metrika.xml中的宏變量如下:
<macros>
<shard>03</replica>
<replica>node3</replica>
</macros>
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
6、檢查叢集配置是否完成
在node1、node2、node3任意一台節點進入clickhouse用戶端,查詢叢集配置:
#選擇三台clickhouse任意一台節點,進入用戶端
clickhouse-client
#查詢叢集資訊,看到下圖所示即代表叢集配置成功。
node1 :) select * from system.clusters;
;
查詢叢集資訊,也可以使用如下指令
node1 :) select cluster,host_name from system.clusters;
;
7、測試clickhouse
#在clickhouse node1節點建立mergeTree表 mt
create 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;