一、集群規模確定
CDH體系結構
從數據量、計算性能要求、可靠穩定性、容錯性等方面考慮。
- 數據量
- 現有數據量(如現有歷史數據)和增量數據(日增、月增數據,一般需要考慮滿足1-2年的容量,后續再擴容);
- 數據的副本數(Hadoop默認3副本,乘3倍);
- 數據清洗、融合加工處理、共享等過程產生的,中間表、指標表、主題/專題庫等表(乘3-5倍)。注意:HDFS上不同格式的表壓縮比也不一樣,如文本txt表不壓縮,orc有一定的壓縮比(1:3),HBase(看是否采用壓縮),ES看索引是否有膨脹;
- 儲存的冗余量 + 20-30%;
如:現有各種形式的數據量總共30TB,月增數據1TB(算未來24個月),全部都要放到HDFS中存儲,默認3副本,ETL數據處理全部用txt表(共享服務HBase、ES等混用)就按照1:1的壓縮比儲存,算上ODS、清洗融合加工中間表、指標表、主題庫/專題課等取4倍。如下計算:
(30 + 1* 24) * 3 * 4 * 1.25 = 810 TB
需要總的磁盤空間810TB,如果是10個數據儲存節點,那么每個節點至少要大於81TB的空間,可以掛 9塊* 10TB。 - 計算
根據使用到的大數據組件服務來預估
如基於內存的服務對內存的要求,對磁盤IO使用比較頻繁的是否考慮多塊盤,清洗融合加工頻繁的對cpu的要求等等 - 可靠穩定性
集群規模大的,需要區分管理節點、數據儲存和計算節點(或者叫工作節點)。 - 容錯性
如果考慮對各個服務或者某些服務做HA的,需要再考慮加節點資源。
如果考慮做災備集群的,需要再加1倍的資源。
此外,還要考慮網絡,是否是雙網口?千兆還是萬兆網絡?
從上面幾方面確定集群規模,節點數、每個節點的物理配置(CPU、Memery、磁盤空間)、集群網絡等
軟件版本
需要注意的是CDH版本和mysql的對應關系,6.3.2最高對應mariadb10.1,不能兼容更高的版本,否則會出錯。通過官網查看,目前cdh6不支持mariadb10.4版本,后來改為10.1版本后正常啟動
參考文檔: https://docs.cloudera.com/documentation/enterprise/6/release-notes/topics/rg_database_requirements.html#cdh_cm_supported_db
https://blog.51cto.com/jinkcloud/2482685?source=drt
二、環境准備
1.CDH安裝包下載
CDH官方的網站已經無法直接下載安裝包了(需要賬號密碼),需要找一些之前下載過的人索取。
鏈接:https://pan.baidu.com/s/1dpyhF6TRXaqryab6ZVVXfw 提取碼:1cuo
CM
CDH
2.安裝配置操作系統
安裝CentOS 7.9
注意分區參考:
/boot 1G /swap 8G / 剩余全部給根目錄
注意:
如果沒有在裝機的時候分割出來,可以考慮添加8G的swap分區,參考下面方法:
https://www.cnblogs.com/CandiceW/p/10317918.html
使用dd命令創建名為swapfile 的swap交換文件(文件名和目錄任意):
dd if=/dev/zero of=/var/swapfile bs=1024 count=8192k
對交換文件格式化並轉換為swap分區:
mkswap /var/swapfile
掛載並激活分區:
swapon /var/swapfile
聽從系統的建議修改下權限:
chmod -R 0600 /var/swapfile
修改 fstab 配置,設置開機自動掛載該分區:
echo "/var/swapfile swap swap defaults 0 0" >> /etc/fstab
配置靜態IP
[root@master1 ~]# cat /etc/sysconfig/network-scripts/ifcfg-enp0s3 TYPE="Ethernet" PROXY_METHOD="none" BROWSER_ONLY="no" BOOTPROTO="static" DEFROUTE="yes" IPV4_FAILURE_FATAL="no" IPV6INIT="yes" IPV6_AUTOCONF="yes" IPV6_DEFROUTE="yes" IPV6_FAILURE_FATAL="no" IPV6_ADDR_GEN_MODE="stable-privacy" NAME="enp0s3" UUID="9c969854-3983-40d0-998b-31659eb363a8" DEVICE="enp0s3" ONBOOT="yes" IPV6_PRIVACY="no" IPADDR=192.168.50.189 NETMASK=255.255.255.0 GATEWAY=192.168.50.1 DNS1=192.168.50.1 DNS2=192.168.50.1
##########重啟network#################
[root@master1 ~]# systemctl restart network
配置yum源
下載新的阿里雲yum源
wget http://mirrors.aliyun.com/repo/Centos-7.repo
清除緩存
yum clean all # 清除系統所有的yum緩存
yum makecache # 生成yum緩存
配置Ip與主機名映射
[root@master1 ~]# cat /etc/hosts 192.168.50.189 master1.cluster master1 192.168.50.190 worker1.cluster worker1 192.168.50.191 worker2.cluster worker2 192.168.50.192 worker3.cluster worker3
配置無密碼登錄
###安裝Cloudera Manager本身並不需要ssh無密碼登陸,這里做配置主要是為了后續配置集群方便。實現多個機器的ssh免密碼登錄的核心思想是把每一個機器的rsa公鑰集中到一個文件中,並且把這個文件分發到所有的機器上面去。
詳細配置鏈接:https://blog.csdn.net/wjzholmes/article/details/100415396
mkdir -p /root/.ssh
進入/root/.ssh/目錄下執行命令生成id_rsa.pub文件 ssh-keygen -t rsa ###之后一路回車,產生秘鑰
並將秘鑰追加至authorized_keys文件中 cat id_rsa.pub >> authorized_keys ###在.ssh文件下運行此命令
將此節點authorized_keys文件傳至下一台機器 scp authorized_keys root@worker1:/root/.ssh
以此類推,將每台機器文件追加並傳至下一台機器,然后將最后一台機器的秘鑰再分發到每台機器中。
禁用防火牆 (所有節點執行)
在所有節點上關閉防火牆
systemctl status firewalld 檢查防火前狀態
systemctl stop firewalld 關閉防火牆
systemctl disable firewalld 主機重啟自動關閉防火牆
禁用SELinux(所有節點執行)
在命令行運行: sed -i 's/^SELINUX=.∗/SELINUX=disabled/g' /etc/selinux/config setenforce 0,使其立即生效 修改/etc/selinux/config文件(在某些系統中,可能是/etc/sysconfig/selinux文件),將SELINUX=enforcing修改為SELINUX=disabled 更新配置之后要重啟服務器生效。
設置swap空間、關閉大頁面壓縮
1.swap空間設置
swappiness=0:表示最大限度使用物理內存,之后才是swap空間;
swappiness=100:表示積極使用swap分區,並且把內存上的數據及時轉移到swap空間;
如果是混合服務器,不建議完全禁用swap,可以嘗試降低swappiness。
Cloudera 建議將 /proc/sys/vm/swappiness 設置為 10(也有說改為0的,Cloudera建議將交換空間設置為0,過多的交換空間會引起GC耗時的激增。)。當前設置為 60。使用 sysctl 命令在運行時更改該設置並編輯 /etc/sysctl.conf 以在重啟后保存該設置。
echo 10 > /proc/sys/vm/swappiness
這樣操作重啟機器還是還原,要永久改變:
echo "vm.swappiness = 10" >> /etc/sysctl.conf
2.已啟用透明大頁面壓縮,可能會導致重大性能問題,建議禁用此設置。
調整:
echo never > /sys/kernel/mm/transparent_hugepage/defrag
echo never > /sys/kernel/mm/transparent_hugepage/enabled
加入啟動生效配置中 [root@master1 ~]# cat /etc/rc.local echo never > /sys/kernel/mm/transparent_hugepage/enabled echo never > /sys/kernel/mm/transparent_hugepage/defrag
設置用戶最大可打開文件數,進程數,內存占用(所有節點)
vi /etc/security/limits.conf * soft nofile 32728 * hard nofile 1024999 * soft nproc 65535 * hard noroc unlimited * soft memlock unlimited * hard memlock unlimited
NTP服務安裝和設置
Hadoop對集群中各個機器的時間同步要求比較高,要求各個機器的系統時間不能相差太多,不然會造成很多問題。可以配置集群中各個機器和互聯網的時間服務器進行時間同步,但是在實際生產環境中,集群中大部分服務器是不能連接外網的,這時候可以在內網搭建一個自己的時間服務器(NTP服務器),集群的各個機器與這個時間服務器進行時間同步。我們選擇其中一個節點cdh01機器作為NTP服務器,其他機器和它自動同步。
安裝NTP(所有節點) yum -y install ntp 添加以下NTP服務器 server http://ntp.aliyun.com 重新啟動 ntp 服務和設置開機自啟(所有節點): service ntpd restart systemctl enable ntpd.service
查看和測試:
ntpdc -c loopinfo #查看與時間同步服務器的時間偏差 ntpq -p #查看當前同步的時間服務器 ntpstat #查看狀態定時同步crontab crontab -e #可以不用設置 10 * * * * /usr/sbin/ntpdate master1
配置和安裝CDH
1.配置CM源
注意:操作系統可以先配置本地yum。CDH的安裝包都是rpm包。如果使用rpm安裝方式安裝起來是比較復雜的,會有很多依賴問題需要解決,就需要使用yum幫助我們解決依賴問題。(也可以是在線的阿里yum源,之前在按照好操作系統之后已經設置了aliyun的yum,所有這里省略centos yum源)
配置CM源:
在cdh01節點上安裝並啟動httpd
#安裝
yum install httpd
#啟動
service httpd start
#開機自啟
systemctl enable httpd
或者chkconfig httpd on
cd /var/www/html/進入到這個目錄下 mkdir cm6; mkdir cdh6 #將cdh的安裝包和cm的包拷貝到創建的目錄 #拷貝cm安裝包和jdk到cm6 cp cloudera-manager-* /var/www/html/cm6/ cp enterprise-debuginfo-6.3.1-1466458.el7.x86_64.rpm /var/www/html/cm6 cp oracle-j2sdk1.8-1.8.0+update181-1.x86_64.rpm /var/www/html/cm6 #拷貝cdh安裝包和元數據文件 cp CDH-6.3.2-1.cdh6.3.2.p0.1605554-el7.parcel /var/www/html/cdh6/ cp manifest.json /var/www/html/cdh6/ 安裝createrepo命令,然后進入到cm6目錄創建yum源 yum install -y createrepo #下載createrepo cd /var/www/html/cm6 #命令進入到cm6安裝包的httpd資源位置 createrepo . #創建yum源的描述meta 配置yum源(每個節點) cat >> /etc/yum.repos.d/cm.repo << EOF [CM] name=cm6 baseurl=http://cdh01/cm6/ gpgcheck=0 EOF 查看yum配置源是否生效 yum clean all yum repolist
安裝Mariadb(master1)
#設置yum源
[root@master1 ~]# cat /etc/yum.repos.d/MariaDB.repo
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.1/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
#安裝 yum install -y MariaDB-server MariaDB-client MariaDB-compat MariaDB-devel MariaDB-common MariaDB-shared #啟動和開機自啟 systemctl start mariadb && systemctl enable mariadb #配置Mariadb數據庫 mysql_secure_installation #可以在遇[Y/n]輸入y設置密碼 [賬號/密碼:root/root]
初始化管理節點數據庫(master1)
mkdir -p /usr/share/java cp /mnt/lb/mysql-connector-java-5.1.34.jar /usr/share/java/mysql-connector-java.jar(這里需要分發到所有節點)
#創建CDH各服務使用的數據庫
-- 1. scm DROP DATABASE IF EXISTS scm; CREATE DATABASE IF NOT EXISTS scm DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; DROP USER IF EXISTS 'scm'@'%'; CREATE USER IF NOT EXISTS 'scm'@'%' IDENTIFIED BY 'Bdpp1234!'; GRANT ALL PRIVILEGES ON scm.* TO 'scm'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES; -- 2. amon DROP DATABASE IF EXISTS amon; CREATE DATABASE IF NOT EXISTS amon DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; DROP USER IF EXISTS 'amon'@'%'; CREATE USER IF NOT EXISTS 'amon'@'%' IDENTIFIED BY 'Bdpp1234!'; GRANT ALL PRIVILEGES ON amon.* TO 'amon'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES; -- 3. rman DROP DATABASE IF EXISTS rman; CREATE DATABASE IF NOT EXISTS rman DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; DROP USER IF EXISTS 'rman'@'%'; CREATE USER IF NOT EXISTS 'rman'@'%' IDENTIFIED BY 'Bdpp1234!'; GRANT ALL PRIVILEGES ON rman.* TO 'rman'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES; -- 4. hue DROP DATABASE IF EXISTS hue; CREATE DATABASE IF NOT EXISTS hue DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; DROP USER IF EXISTS 'hue'@'%'; CREATE USER IF NOT EXISTS 'hue'@'%' IDENTIFIED BY 'Bdpp1234!'; GRANT ALL PRIVILEGES ON hue.* TO 'hue'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES; -- 5. hive DROP DATABASE IF EXISTS hive; CREATE DATABASE IF NOT EXISTS hive DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; DROP USER IF EXISTS 'hive'@'%'; CREATE USER IF NOT EXISTS 'hive'@'%' IDENTIFIED BY 'Bdpp1234!'; GRANT ALL PRIVILEGES ON hive.* TO 'hive'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES; -- 6. sentry DROP DATABASE IF EXISTS sentry; CREATE DATABASE IF NOT EXISTS sentry DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; DROP USER IF EXISTS 'sentry'@'%'; CREATE USER IF NOT EXISTS 'sentry'@'%' IDENTIFIED BY 'Bdpp1234!'; GRANT ALL PRIVILEGES ON sentry.* TO 'sentry'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES; -- 7. nav DROP DATABASE IF EXISTS nav; CREATE DATABASE IF NOT EXISTS nav DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; DROP USER IF EXISTS 'nav'@'%'; CREATE USER IF NOT EXISTS