hadoop叢集-zookper高可用
-
文件地址: 百度網盤
提取碼:169f
WPS 2019文件,內附詳細安裝過程Linux安裝路徑及備份恢復都可在這裡恢復
如何將原來的系統匯入到virtualbox中
準備linux 準備一張centos的盤 Redhat:https://www.redhat.com/en
Ubuntu:https://www.ubuntu.com/download/desktop
Centos:https://www.centos.org/安裝包:CentOS-6.10-x86_64-minimal.iso 將光碟插入到光碟機中;
安裝linux
使用者名稱:root 密碼:123456
關機: Halt -n Init 0
備份–快照
硬碟空間夠用的話,有事木事就備份一下;
上網 上網方式:
https://jingyan.baidu.com/article/9f7e7ec04f73c66f28155484.html 現狀
真實機(宿主機)可以上外網 虛擬機器可以上外網;(但是真實機與虛擬機器網路不通) 虛擬機器即能上外網又能真實機互通; 修改網絡卡,防火牆
網絡卡Mac地址;網絡卡的身份證;12位16進位制組成;
操作命令如下:
進入到配置網絡卡的目錄 cd /etc/sysconfig/network-scripts/
檢視指定檔案的內容;
eth0:第一塊網絡卡,直接複製一下就可以 less ifcfg-eth0
列出當前目錄下面有哪些資料夾和資料夾;dos:dir Ls
#將網絡卡1,複製一份變成網絡卡2 cp ifcfg-eth0 ifcfg-eth1
編輯網絡卡2; vi ifcfg-eth1
檢視模式(預設的),編輯模式,命令模式;
如果想修改,按下i;就可以編輯;(編輯模式)
退出:儲存(按下esc鍵鬆了,g4再按下:x),或者(按下esc鍵,再按下:wq!):不儲存:(按下esc鍵,:q!)
將網路服務重啟; service network restart
檢視ip ifconfig
Ifcfg-eth1的內容; DEVICE=eth1 TYPE=Ethernet
UUID=e8d5353d-aa82-4804-8d1e-0683b3ece70b把no變成yes,就可以隨機啟動 ONBOOT=yes NM_CONTROLLED=yes
動態獲取ip BOOTPROTO=dhcp HWADDR=08:00:27:2F:C1:40 DEFROUTE=yes PEERDNS=yes PEERROUTES=yes IPV4_FAILURE_FATAL=yes IPV6INIT=no
NAME=“System eth0” 靜態IP DEVICE=eth1 TYPE=Ethernet
UUID=e8d5353d-aa82-4804-8d1e-0683b3ece70b把no變成yes,就可以隨機啟動 ONBOOT=yes NM_CONTROLLED=yes
靜態ip BOOTPROTO=static HWADDR=08:00:27:2F:C1:40 DEFROUTE=yes PEERDNS=yes PEERROUTES=yes IPV4_FAILURE_FATAL=yes IPV6INIT=no
NAME=“System eth0”
配置一下IP;先換成動態的,再換成靜態的; IPADDR=192.168.56.101
防火牆 臨時修改
永久修改
check config Chkconfig
查詢所有的隨機啟動程式 Chkcnofig
根目錄
一個軟體有三部分組成: Windows Java linux
可執行檔案:bin Exe,msi,bat,cmd 和作業系統相關 *.sh 配置檔案:conf xml Properties Xml
json Conf(etc目錄) 庫(工具) dll jar包 *.so
Windows和java一樣,都是把一個軟體的三部分放到了一個目錄中 Bin:可執行檔案;建議把所有軟體的可執行檔案都放到此目錄中
Boot:引導檔案;啟動的時候可以找到linux系統 Dev:裝置;dvd,usb; Etc:配置檔案
Home:每一個使用者在建立的時候會有一個home目錄;(建議使用者把自已的檔案放到home目錄下面) Lib:庫
lib64:64位作業系統的庫 lost+found: Media:多媒體;片;光盤裡面的內容
Mnt:掛載;插u盤,手動掛載一下;(快捷方式) Opt:使用者安裝的系統都擱到此目錄下面;c:/program file;
Proc:程序的相關資訊 Root:root使用者的home目錄 Sbin:多個bin檔案組合到一起;批量可執行檔案
Selinux:linux自帶的安全管理元件(一般禁用) Srv: sys
Tmp:臨時檔案;(重啟Linux,如果硬碟空間不夠,會優先刪除此目錄下面所有的檔案;不安全) Usr:和opt類似
Var:變數,哪些檔案經常發生變化,放到此目錄;如日誌(log4j2)硬碟分割槽
統一將軟體安裝到/data目錄;
修改的是/etc/fstab檔案
重啟 備份
yum yum源 自動下載rpm包(最新的) 自動驗證rpm是否完整 自動安裝, 自動測試 自動執行 安裝yum-程式
命令上傳lrzsz yum -y install lrzsz
上傳-y:如果檔案已經存存,-y表示覆蓋 rz -y
sz檔名 Sz -y
編輯器 vi–編輯器 檢視模式 Ctrl+f:翻下頁 Ctrl+b:翻上頁 輸入數字,然後輸入大寫的G;
直接輸入大寫的G是最後一行; 按下兩下d;刪除當前行 Shift+0以段落為單位進行切換; Home鍵,end鍵
按下回車鍵,一次一行 編輯模式 按下i進入到編輯模式 按下esc:從編輯模式進入到檢視模式;
:wq!(儲存退出),:x(儲存退出),:q!(不儲存退出) 命令模式;在檢視模式下面直接輸入:就會進入到命令模式; :set
nu打回車,就看到了行號 搜尋:查詢;/關鍵字;按下n,找下一個,按下大寫的n(shift+n)(找上一個)vim–編輯器 Vi和vim完全一樣,只不過vim有色兒;(顏色)
安裝–wget 下載工具;wget;windows版本的迅雷
檢查wget如何使用 wget --help
-y:相當一路下一步 yum -y install wget
wget url;在瀏覽器中彈出一個下載框 wget https://dldir1.qq.com/qqfile/qq/QQ9.0.8/24207/QQ9.0.8.24207.exe
斷點續傳 wget https://dldir1.qq.com/qqfile/qq/QQ9.0.8/24207/QQ9.0.8.24207.exe -c
備份 每當有需要改變或者增加新的程式,或者配置檔案時多備份 以上單獨一臺虛擬機器的基礎標配 hadoop–叢集標配
多臺虛擬機器–標配 建立虛擬機器趕緊要看一下,新複製出來的新電腦是不是可以上網; 要保證新複製出來的電腦,MAC地址不一樣(網絡卡的身份證);先關機
重新配置一下網路(參照初始安裝linux如何配置網路)
重啟兩次 Xshell必備
標準配置 保證網路暢通 虛擬機器之間相互通暢
真實機與虛擬機器之間暢通
修改主機名
修改hosts檔案(離線版dns); linux的hosts檔案
Windows的hosts檔案
免金鑰
上鎖;鎖和鑰匙 ssh-keygen -t rsa -P ‘’ -f ~/.ssh/id_rsa
是把鑰匙放到另外一個檔案中(給鄰居) cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
把這個檔案變成600; chmod 600 ~/.ssh/authorized_keys
把A的鑰匙給了B,A可以登陸B
做備份
四臺虛擬機器
叢集搭建 JDK Hadoop叢集 主機名 Node-1 Node-2 Node-3 Node-4 Namenode ✔
Datanode ✔ ✔ ✔ secondnamenode ✔ Resourcemanager ✔
nodemanager ✔ ✔ ✔ 先安裝jdk; 先將jdk上傳到node-1上,
將node-1上的jdk分別在node-2,node-3,node-4擱一份將jdk的rpm手動上傳到node-2,node-3,node-4;
本地的網路相當的慢;
利用伺服器的網路來傳輸內容;
scp -r(遞迴) 檔案或者資料夾的名字 使用者名稱@主機名(ip):目標伺服器的路徑 scp -r jdk-8u192-linux-x64.rpm [email protected]:/root
簡寫;使用者名稱可以省略(預設是當前的使用者名稱)
pwd:在源機器上,一定要進入到最終的目錄; 在目標伺服器上,最終目錄一定要存在;
在源機器上目錄是:root; 如果目標機器上木有root目錄,建議先建立好(一定要注意) scp -r jdk-8u192-linux-x64.rpm node-3:
pwd
第三種寫法 scp jdk-8u192-linux-x64.rpm node-4:$PWD
hadoop 先配置好一臺伺服器(node-1) 檢視jdk安裝路徑 Witch javac / whereis
javacJdk裝到哪了?
環境變數在哪配置 全域性的系統變數
先將hadoop上傳到node-1上;都放到了/data/hadoop/下面
配置檔案:(etc/hadoop/hadoop-env.sh)export HDFS_NAMENODE_USER=root export HDFS_DATANODE_USER=root export
HDFS_SECONDARYNAMENODE_USER=root export
YARN_RESOURCEMANAGER_USER=root export YARN_NODEMANAGER_USER=root配置檔案(etc/hadoop/core-site.xml) <?xml version=“1.0”
encoding=“UTF-8”?> <?xml-stylesheet type=“text/xsl”
href=“configuration.xsl”?>
fs.defaultFS
hdfs://node-1:9000
hadoop.tmp.dir
/data/hadoop/data/hadoop-${user.name}
配置檔案(etc/hadoop/hdfs-site.xml) <?xml version=“1.0”
encoding=“UTF-8”?> <?xml-stylesheet type=“text/xsl”
href=“configuration.xsl”?>
dfs.replication
2
<!-- 許可權檢查 --> <property> <name>dfs.permissions.enabled</name> <value>false</value> </property> <!-- namenode的訪問地址;http協議,網頁訪問 --> <property> <name>dfs.namenode.http-address</name> <value>node-1:9870</value> </property> <!-- secondary的訪問地址;http協議,網頁訪問 --> <property> <name>dfs.namenode.secondary.http-address</name> <value>node-2:9868</value> </property> <!-- dfs.namenode.name.dir:namenode的目錄放的路徑在hadoop.tmp.dir之上做了修改 file://${hadoop.tmp.dir}/dfs/name dfs.datanode.data.dir:namenode的目錄放的路徑在hadoop.tmp.dir之上做了修改 file://${hadoop.tmp.dir}/dfs/data --> </configuration>
配置檔案(etc/hadoop/mapred-site.xml) <?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
mapreduce.framework.name yarn
mapreduce.map.memory.mb 200
mapreduce.map.java.opts
-Xmx200M
mapreduce.reduce.memory.mb 200
mapreduce.reduce.java.opts
-Xmx200M配置檔案(etc/hadoop/yarn-site.xml) <?xml version="1.0"?>
yarn.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
<!-- resourcemanager的地址 --> <property> <name>yarn.resourcemanager.hostname</name> <value>node-1</value> </property> </configuration>
配置檔案(etc/hadoop/workers);(放的是datanode,每一個datanode預設都有一個nodemanager)
node-2 node-3 node-4將配置好的hadoop分發到node-2,node-3,node-4上面;用scp
一定是在hadoop軟體(框架)所在的目錄下面 /data/hadoop
在node-1執行此命令,將hadoop拷貝到node-2 scp -r hadoop/ node-2:$PWD
拷貝到node-3上 scp -r hadoop/ node-3:
pwd
拷貝到node-4上 scp -r hadoop/ node-4:/data/hadoop
在namenode上執行hadoop的啟動命令;(node-1)
格式化,只操作一次,要格式化的時候要慎重 bin/hdfs namenode -format
啟動dfs sbin/start-dfs.sh
啟動yarn sbin/start-yarn.sh
訪問 Node-1:9870
日誌 如果啟動報錯,看日誌
在namenode的內容
在datanode儲存的資料;(木有加密)
zookeeper高可用 內容: 分散式有缺點: 只有大哥和二哥,如果都掛了呢?
Namenod掛了,seconnamenode都不能自動接棒 Namenode和secondnamenode都掛了,沒有三哥;
Zookeeper: Zookeeper:動物園管理員 作用:(多臺伺服器)
把多臺伺服器中的硬碟當成一塊使用,如果沒有hadoop或者hadoop自己本身執行的時候也需要儲存資料
每臺伺服器都要裝zookeeper;自己有一個選舉的機制(如:選班長) 投票: 選leader;
Leader掛了;剩下的人自己選擇 如果leader活了,當成小弟,跟著leader走
自己主動檢測leader掛了,自動切換(通知所有人)官網(http://zookeeper.apache.org/)
實戰 Zookeeper 單機版本 Windows 版本
直接解壓此檔案”zookeeper-3.4.13.tar.gz”,最好別放在中文目錄中 去掉版本號 標準目錄Bin:可執行檔案 Conf:配置檔案 Contrib:第三方提供的jar包 Dist-maven:使用maven打包的釋出版本
Docs:文件 Lib:jar 包 Src:原始碼 核心的jar包:zookeeper-3.4.13.jar
Readme.md(讀我) 配置檔案(conf/zoo_sample.cfg複製一份為zoo.cfg)伺服器啟動 雙擊 bin/zkServer.cmd
啟動成功
啟動命令
客戶端啟動
客戶端常用命令:把zookeeper理解為 linux 上的檔案系統 也有檔案和資料夾,(資料夾上可以儲存內容)
建立一個目錄/檔案(在這叫路徑);
create:目錄/檔案,資料 create /hw test
檢視/表示根路徑和linux很像 Ls 路徑
修改 Set 路徑 值
檢視內容 Get 路徑
刪除(路徑) rmr /hw
建立一個子目錄; Create 路徑 值
路徑必須得存在; create /a/b test_2
create s:(永久性節點)e:(臨時性節點); 臨時檔案 Create -s /s a Create -e /e b
儲存位置
Linux版本
一定要將zookeeper的tar包傳到伺服器上,
解壓tar包 tar -xzvf zookeeper-3.4.13.tar.gz
改名 mv zookeeper-3.4.13/ zookeeper
配置檔案:(conf/zoo_sample.cfg到zoo.cfg);
一定要注意我的當前目錄 cp zoo_sample.cfg zoo.cfg
啟動 bin/zkServer.sh start
檢視是否啟動 Jps bin/zkServer.sh status !ps ps aux|grep
pwd
檢視日誌(zookeeper.out)
啟動客戶端 bin/zkCli.sh 退出客戶端: Quit/ctrl+d
Zookeeper多級版本 Node-1 Node-2 Node-3 Node-4 zk ✔ ✔ ✔
先裝好一個(不能完全裝完) 修改配置檔案(conf/zoo.cfg);
The number of milliseconds of each tick tickTime=2000
The number of ticks that the initial
synchronization phase can take initLimit=10
The number of ticks that can pass between
sending a request and getting an acknowledgement syncLimit=5
the directory where the snapshot is stored.
do not use /tmp for storage, /tmp here is just
example sakes. dataDir=/data/zookeeper/data/
the port at which the clients will connect clientPort=2181
the maximum number of client connections.
increase this if you need to handle more clients
#maxClientCnxns=60
Be sure to read the maintenance section of the
administrator guide before turning on autopurge.
http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
Purge task interval in hours
Set to “0” to disable auto purge feature
#autopurge.purgeInterval=1
叢集的配置
server.隨機起(zk自己識別的名字)=主機名:埠1:埠2 server.1=node-1:2888:3888 server.2=node-2:2888:3888 server.3=node-3:2888:3888
將zookeeper從node-1同步到node-2,和node-3;
一定要在/data/zookeeper下面;當前目錄下面得有zookeeper scp -r zookeeper/ node-2:
pwd
scp -r zookeeper/ node-3:pwd
一定要在 zoo.cfg配置檔案中data目錄下面建立一個myid;myid檔案中填寫的是zookeeper自己為伺服器起的別名
三臺伺服器一塊啟動 zokeeper
重啟 bin/zkServer.sh restart
檢視狀態 bin/zkServer.sh status
客戶端使用和單機版一樣
在三個zookeeper任意一臺操作,會自動的同步到其它伺服器上; 都是框架來和zookeeper互動
高可用–hight avaible
參照網址:
http://hadoop.apache.org/docs/r3.1.1/hadoop-project-dist/hadoop-hdfs/HDFSHighAvailabilityWithQJM.html 一定要讓zookeeper正常工作 Node-1 Node-2 Node-3 Node-4 Namenode ✔ ✔
Datanode ✔ ✔ ✔ Resourcemanager ✔ ✔ Zookeeper ✔ ✔ ✔
Journalnode ✔ ✔ ✔ Journal node:hadoop負責與zookeeper進行溝通;
Zkfc:zookeeper failover controller;大哥掛了自動切換;配置檔案 Hadoop-evn.sh
定義一些變數 export HDFS_NAMENODE_USER=root export HDFS_DATANODE_USER=root export HDFS_SECONDARYNAMENODE_USER=root
export YARN_RESOURCEMANAGER_USER=root export
YARN_NODEMANAGER_USER=root export HDFS_JOURNALNODE_USER=root export
HDFS_ZKFC_USER=rootCore-site.xml <?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
fs.defaultFS
hdfs://jh
hadoop.tmp.dir
/data/hadoop/data/hadoop-${user.name}
<!-- 告訴hadoop,zookeeper放哪了 --> <property> <name>ha.zookeeper.quorum</name> <value>node-1:2181,node-2:2181,node-3:2181</value> </property> </configuration>
Hdfs-site.xml <?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
dfs.replication
2
<!-- 許可權檢查 --> <property> <name>dfs.permissions.enabled</name> <value>false</value> </property> <!-- dfs.namenode.name.dir:namenode的目錄放的路徑在hadoop.tmp.dir之上做了修改 file://${hadoop.tmp.dir}/dfs/name dfs.datanode.data.dir:namenode的目錄放的路徑在hadoop.tmp.dir之上做了修改 file://${hadoop.tmp.dir}/dfs/data --> <!-- 為nameservice起一個別名 董事會 --> <property> <name>dfs.nameservices</name> <value>jh</value> </property> <!-- 董事會的成員 --> <property> <name>dfs.ha.namenodes.jh</name> <value>nn1,nn2</value> </property> <!-- 配置每一個攻事會成員 每一個配置的時候得有rpc(底層),http(上層==網頁) --> <property> <name>dfs.namenode.rpc-address.jh.nn1</name> <value>node-1:8020</value> </property> <property> <name>dfs.namenode.http-address.jh.nn1</name> <value>node-1:9870</value> </property> <!-- 第二個成員 --> <property> <name>dfs.namenode.rpc-address.jh.nn2</name> <value>node-2:8020</value> </property> <property> <name>dfs.namenode.http-address.jh.nn2</name> <value>node-2:9870</value> </property> <!-- journalnode:負責hadoop與zk進行溝通 --> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://node-2:8485;node-3:8485;node-4:8485/jh</value> </property> <!-- 哪個類決定了自動切換 哪個namenode是活著的(active) --> <property> <name>dfs.client.failover.proxy.provider.jh</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property> <!-- journal的儲存位置 --> <property> <name>dfs.journalnode.edits.dir</name> <value>/data/hadoop/data/journal/</value> </property> <!-- 大哥掛了,自動切換到二哥上 啟動故障轉移 --> <property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property> <!-- (ssh免密碼登入) --> <property> <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> </configuration>
將配置檔案傳遞到其他的伺服器上 檔案所在的目錄打包傳送
一定要注意,此命令的基礎是在hadoop的目錄下面 scp -r etc/ node-2:
pwd
scp -r etc/ node-3:pwd
scp -r etc/ node-4:pwd
啟動hadoop 刪除/data/hadoop/data 下所有檔案 Journalnode
在node-2,node-3,node-4三個伺服器上啟動journalnode伺服器,執行以下命令
sbin/hadoop-daemon.sh start journalnode bin/hdfs --daemon start
journalnode啟動namenode 格式化namenode ,在其中任何一臺namenode上格式化(我是在 node-1 上做得格式化)
bin/hdfs namenode -format把剛才格式化後的元資料拷貝到另外一個namenode上(將node-拷貝到node-2)
一定要進入到/data/hadoop/data中 scp -r hadoop-root/ node-2:
pwd
啟動剛剛格式化的namenode:(node-1) sbin/hadoop-daemon.sh start namenode
bin/hdfs --daemon start namenode在沒有格式化的namenode上執行:(node-2) bin/hdfs namenode -bootstrapStandby
啟動第二個namenode(node-2) sbin/hadoop-daemon.sh start namenode bin/hdfs
–daemon start namenode在其中一個節點上初始化zkfc(node-1)(一定要啟動zookeeper) bin/hdfs zkfc -formatZK
重新啟動hdfs
sbin/stop-dfs.sh sbin/start-dfs.sh
測試 停止active的namenode,自動切換 Kill -9 bin/hdfs --daemon stop namenode
高可用的yarn 參照網址:
http://hadoop.apache.org/docs/r3.1.1/hadoop-yarn/hadoop-yarn-site/ResourceManagerHA.html
配置檔案 <?xml version="1.0"?>
yarn.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開啟ha --> <property> <name>yarn.resourcemanager.ha.enabled</name> <value>true</value> </property> <!-- yarn董事會的名字 --> <property> <name>yarn.resourcemanager.cluster-id</name> <value>jh-yarn</value> </property> <!-- 董事會列表 --> <property> <name>yarn.resourcemanager.ha.rm-ids</name> <value>rm1,rm2</value> </property> <!-- hostname,webapp--> <property> <name>yarn.resourcemanager.hostname.rm1</name> <value>node-1</value> </property> <property> <name>yarn.resourcemanager.webapp.address.rm1</name> <value>node-1:8088</value> </property> <!-- 第二臺 --> <property> <name>yarn.resourcemanager.hostname.rm2</name> <value>node-2</value> </property> <property> <name>yarn.resourcemanager.webapp.address.rm2</name> <value>node-2:8088</value> </property> <!-- zookeeper --> <property> <name>yarn.resourcemanager.zk-address</name> <value>node-1:2181,node-2:2181,node-3:2181</value> </property> </configuration>
啟動yarn sbin/start-yarn.sh
Yarn相關的命令
檢查一下當前所在的節點,resource是active還是standby yarn rmadmin -getServiceState rm1
配置成功後 一旦配置成功以後,都是使用以下命令 sbin/stop-all.sh sbin/start-all.sh
Hadoop 往zookeeper都寫了啥