- 企業大數據處理:Spark、Druid、Flume與Kafka應用實踐
- 肖冠宇
- 2091字
- 2019-01-02 20:35:55
1.2 集群環境準備
1.2.1 Zookeeper集群部署
Zookeeper是大數據系統中常用的分布式框架,主要用于公共配置管理、集群資源一致性管理、狀態管理、部分分布式系統Leader選舉等,下面通過完全分布式搭建方式進行介紹。
1.集群規劃
由于Zookeeper采用FastLeaderElection算法選舉Leader,集群中過半的機器正常運行才能夠成功選舉Leader,為保證集群正常運行,集群部署的節點數為奇數個,最少節點個數為3,生產環境建議部署5個以上的奇數個節點,因為3個實例其中只要有一個實例不可用,整個Zookeeper集群將無法成功選舉,仍然不可以提供服務。
2.部署過程
本例將以三個節點的部署為例,分別在192.168.1.1、192.168.1.2、192.168.1.3三臺服務器部署一個Zookeeper實例。詳細部署過程如下:
(1)下載安裝包并解壓
wget http://apache.fayea.com/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz
解壓到/data/soft目錄下:
tar -zxvf http://apache.fayea.com/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz -C /data/soft
(2)創建軟連接
創建軟連接便于以后升級版本,方便統一管理。
ls-s /data/soft/zookeeper-3.4.6./usr/local/zookeeper
(3)設置環境變量
vim /etc/profile export ZOOKEEPER_HOME=/usr/local/zookeeper export PATH=$PATH: $JAVA_HOME/bin:$M2_HOM/bin:$SCALA_HOME/bin : $ZOOKEEPER_HOME/bin
刷新環境變量使其生效:Source/etc/profile
(4)配置
進入到Zookeeper安裝目錄:cd /usr/local/zookeeper
拷貝一份conf目錄下的配置文件,重命名為zoo.cfg:cp ./conf/zoo_sample.cfg ./conf/zoo.cfg
編輯配置文件設置關鍵參數:
tickTime=2000 initLimit=5 syncLimit=3 dataDir=/data/zookeeper/data dataLogDir=/usr/local/zookeeper/logs clientPort=2181 server.1=192.168.1.1:2888:3888 server.2=192.168.1.2:2888:3888 server.3=192.168.1.3:2888:3888
關鍵參數說明:
tickTime:Zookeeper中的基礎參考時間,所有與時間相關的設置都為tickTime時間的整數倍,單位是毫秒。
initLimit:Zookeeper Leader與Follower初始連接時,Follower需要從Leader同步最新數據,該值表示Follower同步數據的最大超時時間,一般為整數,表示是tickTime的整數倍時間。
syncLimit:Leader和Follower之間心跳檢測的最大超時時間,超過這個時間則認為Follower已經下線。該參數值為整數,表示是tickTime的整數倍時間。
dataDir:Zookeeper持久化數據目錄,建議與安裝路徑不在同一個路徑下。
dataLogDir:日志文件目錄。
clientPort:監聽客戶端連接的端口號,默認值為2181。
server.X=A:B:C。其中X是一個數字,表示這是第幾號server; A是該server所在的IP地址;B配置該server和集群中的leader交換消息所使用的端口;C配置選舉leader時所使用的端口。
(5)創建myid文件
在配置參數dataDir對應的路徑下新建myid文件,寫入單獨的一個數字,表示集群中該實例的編號,該值在集群中是唯一值,不可以重復,數字必須和zoo.cfg配置文件中的server.X中的X一一對應。
(6)啟動Zookeeper
bin/zkServer.sh start
(7)驗證安裝是否成功
bin/zkServer.sh status(一個leader,兩個follower)
或者在Zookeeper安裝的任何一個節點執行客戶端連接命令:
bin/zkCli.sh -server 192.168.1.1:2181
1.2.2 Hadoop部署
1. Hadoop簡介
Apache Hadoop是由著名的Apache基金會開源的分布式存儲計算系統,能夠在廉價的硬件上輕松實現高可靠、高擴展、高性能、高容錯等特性。通過增加機器即可直線增加集群的存儲和計算能力。Hadoop在大規模分布式系統中起著重要的作用,目前已經形成一套完整的Hadoop生態系統,并且在不斷發展擴大。隨著Hadoop生態系統的不斷發展,Hadoop已應用到互聯網、大數據交通、智能醫療、氣象監測、金融服務、人工智能等眾多領域。
HDFS(Hadoop Distributed File System, Hadoop分布式文件系統):通過對文件分塊多備份分布式存儲的方式保證數據具有高效的容錯能力,并且有效提高數據的吞吐量。
MapReduce:應用于規模分布式計算的編程模型,該模型包含Map和Reduce兩種編程原語。Map階段常用于接入數據源,數據劃分、過濾、整理等操作。Reduce階段常用于接收Map階段的數據,聚合計算,持久化結果數據。
YARN:作業調度和集群資源管理框架。目前已經有很多開源項目部署到YARN上運行,將YARN作為統一的作業調度和資源管理框架,如Spark、HBase、Tez等。
2. Hadoop集群部署
本節主要介紹Hadoop2.6.4版本的Hadoop集群部署。
1.集群規劃
為保證集群的高可用能力,NameNode和ResourceManager都采用HA部署方式,各組件詳細分布情況如表1-1所示。
表1-1 Hadoop集群規劃

2.部署過程
(1)SSH免密碼登錄
使用root用戶登錄進入到.ssh目錄下
cd ~/.ssh
執行ssh-keygen -t rsa生成公鑰和私鑰。系統會一直提示信息,一直按回車就可以。生成私鑰文件id_rsa,公鑰文件id_rsa.pub,認證文件authorized_keys。
將公鑰文件內容追加到認證文件中
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
在免密碼登錄的機器之間互相拷貝公鑰然后追加到認證文件中,即可完成SSH免密碼登錄配置。
(2)創建hadoop用戶和組
groupadd hadoop useradd -m -g hadoophadoop
(3)下載安裝包并解壓
先安裝hadoop01,然后將配置好的安裝包拷貝到其他節點。
wget http://www.apache.org/dyn/closer.cgi/hadoop/common/hadoop-2.6.5/hadoop-2.6.5.tar.gz
解壓到指定目錄/data/soft/下
tar -zxvf hadoop-2.6.5.tar.gz-C /data/soft/
(4)創建軟連接并修改屬主為hadoop
創建軟連接便于以后升級版本,方便統一管理。
ln -s /data/soft/ hadoop-2.6.5 /usr/local/hadoop chown -R hadoop:hadoop /usr/local/hadoop
(5)設置環境變量
vim /etc/profile export HADOOP_HOME=/usr/local/hadoop export PATH=$PATH: $JAVA_HOME/bin:$M2_HOM/bin:$SCALA_HOME/bin : $ZOOKEEPER_HOME/bin:$ HADOOP_HOME/bin
刷新環境變量使其生效
source /etc/profile
(6)設置配置文件
a)HDFS相關的配置文件core-site.xml和hdfs-site.xml。
core-site.xml配置信息如下:
<configuration> <! -- 指定hdfs的nameservice為ns1 --> <property> <name>fs.defaultFS</name> <value>hdfs://ns1</value> </property> <! -- 指定hadoop臨時目錄 --> <property> <name>hadoop.tmp.dir</name> <value>/usr/local/hadoop/tmp</value> </property> <! -- 指定zookeeper地址 --> <property> <name>ha.zookeeper.quorum</name> <value>hadoop01:2181, hadoop02:2181, hadoop03:2181</value> </property> </configuration>
hdfs-site.xml配置信息如下:
<configuration> <! --指定hdfs的nameservice為ns1,需要和core-site.xml中的保持一致 --> <property> <name>dfs.nameservices</name> <value>ns1</value> </property> <! -- ns1下面有兩個NameNode,分別是nn1, nn2 --> <property> <name>dfs.ha.namenodes.ns1</name> <value>nn1, nn2</value> </property> <! -- nn1的RPC通信地址 --> <property> <name>dfs.namenode.rpc-address.ns1.nn1</name> <value>hadoop01:9000</value> </property> <! -- nn1的http通信地址 --> <property> <name>dfs.namenode.http-address.ns1.nn1</name> <value>hadoop01:50070</value> </property> <! -- nn2的RPC通信地址 --> <property> <name>dfs.namenode.rpc-address.ns1.nn2</name> <value>hadoop02:9000</value> </property> <! -- nn2的http通信地址 --> <property> <name>dfs.namenode.http-address.ns1.nn2</name> <value>hadoop02:50070</value> </property> <! -- 指定NameNode的元數據在JournalNode上的存放位置 --> <property> <name>dfs.namenode.shared.edits.dir</name> <value> qjournal://hadoop01:8485; hadoop02:8485; hadoop03:8485/ns1 </value> </property> <! -- 指定JournalNode在本地磁盤存放數據的位置 --> <property> <name>dfs.journalnode.edits.dir</name> <value>/usr/local/hadoop/journal</value> </property> <! -- 開啟NameNode失敗自動切換 --> <property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property> <! -- 配置失敗自動切換實現方式 --> <property> <name>dfs.client.failover.proxy.provider.ns1</name> <value>org.apache.hadoop.hdfs.server.namenode.ha .ConfiguredFailoverProxyProvider </value> </property> <! -- 配置隔離機制 --> <property> <name>dfs.ha.fencing.methods</name> <value>sshfence</value> </property> <! -- 使用隔離機制時需要ssh免登陸 --> <property> <name>dfs.ha.fencing.ssh.private-key-files</name> <value>/root/.ssh/id_rsa</value> </property> <! --導致DN停止工作的壞硬盤最大數,默認0就是只要有1個硬盤壞了,DN就會shutdown --> <property> <name>dfs.datanode.failed.volumes.tolerated</name> <value>2</value> </property> <! --Block塊副本數為3 --> <property> <name>dfs.replication</name> <value>3</value> </property> <! -- fsimage和edit文件存儲路徑--> <property> <name>dfs.namenode.name.dir</name> <value>/data/hadoop/data1/dfs/name</value> </property> <! -- 數據存儲物理路徑,可以配置多塊盤 --> <property> <name>dfs.datanode.data.dir</name> <value>/data/hadoop/data1/dfs/data, /data/hadoop/data2/dfs/data </value> </property> <! -- block塊大小512M--> <property> <name>dfs.block.size</name> <value>536870912</value> </property> </configuration>
向slaves文件添加datanode/nodemanager節點的hostname:
hadoop01 hadoop02 hadoop03
b)YARN相關配置文件。
yarn-site.xml配置信息如下:
<configuration> <! -- 開啟ResourceManager HA --> <property> <name>yarn.resourcemanager.ha.enabled</name> <value>true</value> </property> <! -- 開啟ResourceManager失敗自動切換 --> <property> <name>yarn.resourcemanager.ha.automatic-failover.enabled</name> <value>true</value> </property> <! --RM失敗后正在運行的任務在RM恢復之后重新啟動 --> <property> <name>yarn.resourcemanager.recovery.enabled</name> <value>true</value> </property> <! -- 運行ResourceManager的兩個節點 --> <property> <name>yarn.resourcemanager.ha.rm-ids</name> <value>rm1, rm2</value> </property> <! -- 當應用程序未指定隊列名時,指定用戶名作為應用程序所在的隊列名 --> <property> <name>yarn.scheduler.fair.user-as-default-queue</name> <value>true</value> </property> <! -- RM狀態信息存儲方式 --> <property> <name>yarn.resourcemanager.store.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.recovery .ZKRMStateStore </value> </property> <property> <name>yarn.resourcemanager.cluster-id</name> <value>yarn-ha</value> </property> <property> <name>yarn.resourcemanager.hostname.rm1</name> <value>rm1</value> </property> <! -- RM1 HTTP Web訪問地址 --> <property> <name>yarn.resourcemanager.webapp.address.rm1</name> <value>${yarn.resourcemanager.hostname.rm1}:8088</value> </property> <property> <name>yarn.resourcemanager.hostname.rm2</name> <value>rm2</value> </property> <! -- RM2 HTTP Web訪問地址 --> <property> <name>yarn.resourcemanager.webapp.address.rm2</name> <value>${yarn.resourcemanager.hostname.rm2}:8088</value> </property> <! -- NodeManger節點可使用的總內存大小 --> <property> <name>yarn.nodemanager.resource.memory-mb</name> <value>81920</value> </property> <! -- NodeManger節點可使用的總vcore數量 --> <property> <name>yarn.nodemanager.resource.cpu-vcores</name> <value>10</value> </property> <! -- Zookeeper鏈接地址,為了容錯應配置多個--> <property> <name>yarn.resourcemanager.zk-address</name> <value>hadoop01:2181, hadoop02:2181, hadoop03:2181</value> </property> <! -- NM本地任務運行日志存儲路徑--> <property> <name>yarn.nodemanager.log-dirs</name> <value>file:///data/hadoop/data1/yarn/log ,file:///data/hadoop/data2/yarn/log </value> </property> <! -- ApplicationMaster占用的內存大小--> <property> <name>yarn.app.mapreduce.am.resource.mb</name> <value>2048</value> </property> <! --單個任務可申請的最少物理內存量--> <property> <name>yarn.scheduler.minimum-allocation-mb</name> <value>1024</value> </property> <! --單個任務可申請的最多物理內存量--> <property> <name>yarn.scheduler.maximum-allocation-mb</name> <value>8192</value> </property> <! --單個任務可申請的最少vcore量--> <property> <name>yarn.scheduler.minimum-allocation-vcores</name> <value>1</value> </property> <! --單個任務可申請的最多vcore量--> <property> <name>yarn.scheduler.maximum-allocation-vcores</name> <value>10</value> </property> <! --開啟日志聚合到HDFS--> <property> <name>yarn.log-aggregation-enable</name> <value>true</value> </property> <! --聚合日志保存時長,單位秒--> <property> <name>yarn.log-aggregation.retain-seconds</name> <value>259200</value> </property> <! --聚合日志HDFS存儲路徑--> <property> <name>yarn.nodemanager.remote-app-log-dir</name> <value>/data/hadoop/yarn-logs</value> </property> <! -- 使用公平調度器--> <property> <name>yarn.resourcemanager.scheduler.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair .FairSchedule </value> </property> <! -- 使用公平調度器配置文件路徑 --> <property> <name>yarn.scheduler.fair.allocation.file</name> <value>/usr/local/hadoop/etc/hadoop/fair-scheduler.xml</value> </property> </configuration>
mapred-site.xml配置信息如下:
<configuration> <! --History Server配置 --> <property> <name>mapreduce.jobhistory.address</name> <value>hadoop01:10020</value> </property> <property> <name>mapreduce.jobhistory.webapp.address</name> <value>hadoop01:19888</value> </property> <property> <name>mapreduce.jobhistory.joblist.cache.size</name> <value>200000</value> </property> <! --MapReduce作業運行在Yarn上 --> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <property> <name>mapreduce.map.memory.mb</name> <value>1024</value> </property> <property> <name>mapreduce.reduce.memory.mb</name> <value>8192</value> </property> <property> <name>mapreduce.map.java.opts</name> <value>-Xmx1700m -Xms900m</value> </property> <property> <name>mapreduce.reduce.java.opts</name> <value>-Xmx7168m -Xms3000m</value> </property> <property> <name>mapreduce.client.submit.file.replication</name> <value>20</value> </property> <! -- 默認情況下是user.name,即每個用戶獨自一個pool; group.name,即一個linux group 一個pool, mapred.job.queue.name,即一個queue一個pool。 --> <property> <name>mapred.fairscheduler.poolnameproperty</name> <value>group.name</value> </property> </configuration>
fair-scheduler.xml公平調度策略配置信息如下(按組分配不同的內存和vcore資源):
<allocations> <pool name="group1"> <maxResources>50000 mb,10 vcores</maxResources> <maxRunningApps>10</maxRunningApps> <weight>1.0</weight> <schedulingPolicy>fair</schedulingPolicy> </pool> <pool name="group1"> <maxResources>80000 mb, 20 vcores</maxResources> <maxRunningApps>20</maxRunningApps> <weight>1.0</weight> <schedulingPolicy>fair</schedulingPolicy> </pool> <userMaxAppsDefault>99</userMaxAppsDefault> <queuePlacementPolicy> <rule name="primaryGroup" create="false" /> <rule name="secondaryGroupExistingQueue" create="false" /> <rule name="reject"/> </queuePlacementPolicy> </allocations>
將配置好的hadoop拷貝到其他節點:
scp -r /data/soft/hadoop-2.6.5 hadoo02: /data/soft/ scp -r/data/soft/hadoop-2.6.5 hadoo03: /data/soft/
(7)集群啟動
從root用戶切換到hadoop用戶:
su - hadoop
啟動journalnode(在hadoop01上啟動所有journalnode):
cd /usr/local/hadoop sbin/hadoop-daemons.sh start journalnode
jps驗證,后臺進程增加JournalNode進程。
格式化HDFS:
在hadoop01上執行命令:hadoop namenode -format
格式化后會根據在core-site.xml中的hadoop.tmp.dir配置生成一個文件,拷貝該文件到另外一個NameNode節點hadoop02的/usr/local/hadoop/tmp目錄下:
scp -r /usr/local/hadoop/tmp/ hadoop02:/usr/local/hadoop/
格式化ZK(在hadoop01上執行即可):
hdfs zkfc -formatZK
啟動HDFS(在hadoop01上執行):
sbin/start-dfs.sh
啟動YARN(在hadoop01上執行):
sbin/start-yarn.sh
Hadoop部署完成后在各個節點中使用jps命令查看各組件進程是否運行正常。如果發現有問題則查看日志進行排查。
(8)可以通過瀏覽器訪問查看
頁面顯示:NameNode 'hadoop01:9000' (active)
頁面顯示:NameNode 'hadoop02:9000' (standby)
- 企業數字化創新引擎:企業級PaaS平臺HZERO
- SQL Server 2016 數據庫教程(第4版)
- Java Data Science Cookbook
- SQL Server 2012數據庫技術與應用(微課版)
- Developing Mobile Games with Moai SDK
- 大話Oracle Grid:云時代的RAC
- 智能數據分析:入門、實戰與平臺構建
- 白話大數據與機器學習
- Apache Kylin權威指南
- SQL Server 2012數據庫管理教程
- R Object-oriented Programming
- 大數據技術原理與應用:概念、存儲、處理、分析與應用
- 計算機視覺
- 機器學習:實用案例解析
- 云計算