天天看點

湖倉一體電商項目(三):3萬字帶你從頭搭建12個大資料項目元件

上篇已經大概講述大資料元件版本和叢集矩陣配置說明,有不清楚的同學,可以閱讀上一篇

湖倉一體電商項目(二):項目使用技術及版本和基礎環境準備_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

湖倉一體電商項目(三):3萬字帶你從頭搭建12個大資料項目元件

;

通路Yarn WebUI :http://node1:8088

湖倉一體電商項目(三):3萬字帶你從頭搭建12個大資料項目元件

;

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/

湖倉一體電商項目(三):3萬字帶你從頭搭建12個大資料項目元件

;

将以上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目錄下可以看到建立的表目錄:

湖倉一體電商項目(三):3萬字帶你從頭搭建12個大資料項目元件

;

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 寫上路徑,将資料存儲在自定義對應路徑上。

湖倉一體電商項目(三):3萬字帶你從頭搭建12個大資料項目元件

;

除了可以将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”路徑下可以看到建立的表目錄:

湖倉一體電商項目(三):3萬字帶你從頭搭建12個大資料項目元件

;

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

湖倉一體電商項目(三):3萬字帶你從頭搭建12個大資料項目元件

;

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/

湖倉一體電商項目(三):3萬字帶你從頭搭建12個大資料項目元件

;

注意:不要下載下傳phoenix5.1.2版本,與Hbase2.2.6不相容

湖倉一體電商項目(三):3萬字帶你從頭搭建12個大資料項目元件

;

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'           
湖倉一體電商項目(三):3萬字帶你從頭搭建12個大資料項目元件

;

注意:在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中檢視,顯示資料正常

湖倉一體電商項目(三):3萬字帶你從頭搭建12個大資料項目元件

;

七、搭建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           
湖倉一體電商項目(三):3萬字帶你從頭搭建12個大資料項目元件

;

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,進入頁面如下:

湖倉一體電商項目(三):3萬字帶你從頭搭建12個大資料項目元件

;

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_%';           
湖倉一體電商項目(三):3萬字帶你從頭搭建12個大資料項目元件

;

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_%';           
湖倉一體電商項目(三):3萬字帶你從頭搭建12個大資料項目元件

;

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中:

湖倉一體電商項目(三):3萬字帶你從頭搭建12個大資料項目元件

;

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;           
湖倉一體電商項目(三):3萬字帶你從頭搭建12個大資料項目元件

;

查詢叢集資訊,也可以使用如下指令

node1 :) select cluster,host_name from system.clusters;           
湖倉一體電商項目(三):3萬字帶你從頭搭建12個大資料項目元件

;

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;           

繼續閱讀