目錄
1 hadoop概述
1.1 hadoop是什麼
- Hadoop是一個由Apache基金會所開發的分佈式系統基礎架構
- 集羣:多個機器共同完成一件事
- 分佈式:多個機器共同完成一件事,然後不同機器作用不同,各司其職
- 集羣不一定是分佈式,分佈式一定是集羣
- 主要解決,海量數據的存儲和海量數據的分析計算問題。
- 廣義上來說,HADOOP通常是指一個更廣泛的概念——HADOOP生態圈
1.2 hadoop的組成
- Hadoop HDFS:(hadoop distribute file system )一個高可靠、高吞吐量的分佈式文件系統。
- Hadoop MapReduce:一個分佈式的離線並行計算框架。
- Hadoop YARN:作業調度與集羣資源管理的框架。
- Hadoop Common:支持其他模塊的工具模塊(Configuration、RPC、序列化機制、日誌操作)。
1.2.1 hdfs架構概述
1.2.2 YARN概述
- ResourceManager(rm):處理客戶端請求、啓動/監控ApplicationMaster、監控NodeManager、資源分配與調度;
- NodeManager(nm):單個節點上的資源管理、處理來自ResourceManager的命令、處理來自ApplicationMaster的命令;
- ApplicationMaster:數據切分、爲應用程序申請資源,並分配給內部任務、任務監控與容錯。
- Container:對任務運行環境的抽象,封裝了CPU、內存等多維資源以及環境變量、啓動命令等任務運行相關的信息。
1.2.3 MapReduce架構概述
MapReduce將計算過程分爲兩個階段:Map(映射)和Reduce(歸約)
- Map階段並行處理輸入數據
- Reduce階段對Map結果進行彙總
1.3 大數據生態體系
圖中涉及的技術名詞解釋如下:
- Sqoop:sqoop是一款開源的工具,主要用於在Hadoop(Hive)與傳統的數據庫(mysql)間進行數據的傳遞,可以將一個關係型數據庫(例如 : MySQL ,Oracle 等)中的數據導進到Hadoop的HDFS中,也可以將HDFS的數據導進到關係型數據庫中。
- Flume:Flume是Cloudera提供的一個高可用的,高可靠的,分佈式的海量日誌採集、聚合和傳輸的系統,Flume支持在日誌系統中定製各類數據發送方,用於收集數據;同時,Flume提供對數據進行簡單處理,並寫到各種數據接受方(可定製)的能力。
- Kafka:Kafka是一種高吞吐量的分佈式發佈訂閱消息系統,有如下特性:
- 通過O(1)的磁盤數據結構提供消息的持久化,這種結構對於即使數以TB的消息存儲也能夠保持長時間的穩定性能。
- 高吞吐量:即使是非常普通的硬件Kafka也可以支持每秒數百萬的消息
- 支持通過Kafka服務器和消費機集羣來分區消息。
- 支持Hadoop並行數據加載。
- Storm:Storm爲分佈式實時計算提供了一組通用原語,可被用於“流處理”之中,實時處理消息並更新數據庫。這是管理隊列及工作者集羣的另一種方式。 Storm也可被用於“連續計算”(continuous computation),對數據流做連續查詢,在計算時就將結果以流的形式輸出給用戶。
- Spark:Spark是當前最流行的開源大數據內存計算框架。可以基於Hadoop上存儲的大數據進行計算。
- Oozie:Oozie是一個管理Hdoop作業(job)的工作流程調度管理系統。Oozie協調作業就是通過時間(頻率)和有效數據觸發當前的Oozie工作流程。
- Hbase:HBase是一個分佈式的、面向列的開源數據庫。HBase不同於一般的關係數據庫,它是一個適合於非結構化數據存儲的數據庫。
- Hive:hive是基於Hadoop的一個數據倉庫工具,可以將結構化的數據文件映射爲一張數據庫表,並提供簡單的sql查詢功能,可以將sql語句轉換爲MapReduce任務進行運行。 其優點是學習成本低,可以通過類SQL語句快速實現簡單的MapReduce統計,不必開發專門的MapReduce應用,十分適合數據倉庫的統計分析。
- R語言:R是用於統計分析、繪圖的語言和操作環境。R是屬於GNU系統的一個自由、免費、源代碼開放的軟件,它是一個用於統計計算和統計製圖的優秀工具。
- Mahout:
- Apache Mahout是個可擴展的機器學習和數據挖掘庫,當前Mahout支持主要的4個用例:
- 推薦挖掘:蒐集用戶動作並以此給用戶推薦可能喜歡的事物。
- 聚集:收集文件並進行相關文件分組。
- 分類:從現有的分類文檔中學習,尋找文檔中的相似特徵,併爲無標籤的文檔進行正確的歸類。
- 頻繁項集挖掘:將一組項分組,並識別哪些個別項會經常一起出現。
- ZooKeeper:Zookeeper是Google的Chubby一個開源的實現。它是一個針對大型分佈式系統的可靠協調系統,提供的功能包括:配置維護、名字服務、 分佈式同步、組服務等。ZooKeeper的目標就是封裝好複雜易出錯的關鍵服務,將簡單易用的接口和性能高效、功能穩定的系統提供給用戶。
1.4 推薦系統架構圖
2 Hadoop集羣搭建
安裝所需要的軟件鏈接:請點這裏;提取碼:i431
也可以去官網自行下載
2.1 虛擬機環境準備
- 三臺虛擬機
- 修改主機名 /etc/sysconfig/network sync然後重啓
主機名分別爲:hadoop101;hadoop102;hadoop103;
- 修改克隆虛擬機的靜態ip,分別爲:
IP分別爲:192.168.1.101;192.168.1.102;192.168.1.103
- 配置主機名和IP的映射關係(便於使用主機名訪問虛擬機)
[root@ hadoop101桌面]# vim /etc/hosts
添加如下內容
192.168.1.101 hadoop101
192.168.1.102 hadoop102
192.168.1.103 hadoop103
- 關閉防火牆 service iptables stop;chkconfig iptables off
- 在各個機器上使用root用戶在/opt目錄下創建module、software文件夾
2.2 安裝jdk和hadoop
安裝測略:現在一臺節點上配置,然後通過命令發送到另外兩臺節點上
1. 卸載現有的jdk
查詢是否安裝jdk,如果版本低於1.7,卸載該jdk
[root@hadoop101 opt]$ rpm -qa | grep java
[root@hadoop101 opt]$ rpm -e 軟件包
2. 將jdk和hadoop上傳到/opt/software目錄下
3.在Linux系統目錄下查看是否上傳成功
[root@hadoop101 opt]$ cd software/
[root@hadoop101 software]$ ls
hadoop-2.7.2.tar.gz jdk-8u144-linux-x64.tar.gz
4. 解壓jdk和hadoop到/opt/module目錄
[root@hadoop101 software]$ tar -zxvf jdk-8u144-linux-x64.tar.gz -C /opt/module/
[root@hadoop101 software]# tar -zxvf hadoop-2.7.2.tar.gz -C /opt/module/
5.配置jdk和hadoop的環境變量
打開/etc/profile文件,在最後添加下列內容
[root@hadoop101 software]$ vi /etc/profile
#JAVA_HOME
export JAVA_HOME=/opt/module/jdk1.8.0_144
export PATH=$PATH:$JAVA_HOME/bin
#HADOOP_HOME
export HADOOP_HOME=/opt/module/hadoop-2.7.2
export PATH=$PATH:$HADOOP_HOME/bin
保存退出 :wq
讓配置文件重新生效
[root@ hadoop101 software]$ source /etc/profile
6.測試是否安裝成功
[root@hadoop101 ~]# java -version
java version "1.8.0_144"
[root @hadoop101 ~]$ hadoop version
Hadoop 2.7.2
7.重啓(如果命令不成功再重啓)
2.3 集羣配置
1. 集羣部署規劃
|
hadoop101 |
hadoop102 |
hadoop103 |
HDFS
|
NameNode DataNode |
DataNode |
SecondaryNameNode DataNode |
YARN |
NodeManager |
ResourceManager NodeManager |
NodeManager |
2. 配置集羣
1. 配置hadoop所使用的Java的環境變量:hadoop-env.sh
[root@hadoop101 hadoop]$ vim hadoop-env.sh
export JAVA_HOME=/opt/module/jdk1.8.0_144
2. 核心配置文件:core-site.xml(hdfs的核心配置文件)
[root@hadoop101 hadoop]$ vim core-site.xml
<!-- 指定HDFS中NameNode的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop101:9000</value>
</property>
<!-- 指定hadoop運行時產生文件的存儲目錄 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-2.7.2/data/tmp</value>
</property>
3. hdfs配置文件:hdfs-site.xml
[root@hadoop101 hadoop]$ vim hdfs-site.xml
<!--副本數量-->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!--secondarynamenode的地址--> 輔助namenode工作
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop103:50090</value>
</property>
4. yarn配置文件
yarn-env.sh
[root@hadoop101 hadoop]$ vim yarn-env.sh
export JAVA_HOME=/opt/module/jdk1.8.0_144
yarn-site.xml
[root@hadoop101 hadoop]$ vim yarn-site.xml
<!-- reducer獲取數據的方式 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定YARN的ResourceManager的地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop102</value>
</property>
5. mapreduce配置文件
mapred-env.sh
[root@hadoop101 hadoop]$ vim mapred-env.sh
export JAVA_HOME=/opt/module/jdk1.8.0_144
mapred-site.xml
[root@hadoop101 hadoop]$ cp mapred-site.xml.template mapred-site.xml
[root@hadoop101 hadoop]$ vim mapred-site.xml
<!-- 指定mr運行在yarn上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
3. 配置集羣中從節點的信息
/opt/module/hadoop-2.7.2/etc/hadoop/slaves
[root@hadoop101 hadoop]$ vim slaves
hadoop101
hadoop102
hadoop103
4. 分發文件
scp:(secure copy)安全拷貝
①定義:scp可以實現服務器到服務器之間的數據拷貝。(from server1 to server2)
安裝scp命令,這個需要每個節點都安裝
yum install -y openssh-server openssh-clients
②使用:將hadoop101中/opt/module/目錄下的所有文件拷貝到hadoop102、hadoop103
[root@hadoop101 /]$ scp -r /opt/module/* hadoop102:/opt/module
[root@hadoop101 /]$ scp -r /opt/module/* hadoop103:/opt/module
5. 查看文件分發情況(驗證一個即可)
[root@hadoop102 hadoop]$ cat /opt/module/hadoop-2.7.2/etc/hadoop/core-site.xml
3 集羣啓動
- 單點啓動(不建議使用該方式啓動集羣,假如某個節點掛掉了,可以使用這個單獨啓動)
- 一鍵啓動(建議使用,各個服務組件逐一啓動,集羣中某個進程掛掉使用這種方式重啓)
3.1 集羣單點啓動
1. 如果集羣是第一次啓動,需要格式化NameNode(格式化只進行一次)
[root@hadoop101 hadoop-2.7.2]$ hadoop namenode -format
2. 在hadoop101上啓動NameNode
[root@hadoop101 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start namenode
[root@hadoop101 hadoop-2.7.2]$ jps
3461 NameNode
3. 在hadoop101、hadoop102、hadoop103上分別啓動DataNode
[root@hadoop101 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start datanode
[root@hadoop101 hadoop-2.7.2]$ jps
3461 NameNode
3608 Jps
3561 DataNode
[root@hadoop102 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start datanode
[root@hadoop102 hadoop-2.7.2]$ jps
3190 DataNode
3279 Jps
[root@hadoop103 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start datanode
[root@hadoop103 hadoop-2.7.2]$ jps
3237 Jps
3163 DataNode
3.2 SSH無密登陸設置
(一鍵啓動的必備條件)
1. 配置ssh
1. 基本語法: ssh 另一臺主機的ip地址
如果提示command not found,需要安裝ssh服務
yum install -y openssh-server openssh-clients
2. ssh連接時出現Host key verification failed 直接輸入yes即可
[root@hadoop101 opt] $ ssh hadoop102
The authenticity of host 'hadoop102(192.168.1.102)' can't be established.
RSA key fingerprint is cf:1e:de:d7:d0:4c:2d:98:60:b4:fd:ae:b1:2d:ad:06.
Are you sure you want to continue connecting (yes/no)?
Host key verification failed.
2. 無密鑰配置
1. 免密登陸原理
- A服務器通過ssh-key-gen生成密鑰對
- 將公鑰(A)拷貝到其他的服務器上
- 然後A服務器使用私鑰(A)加密數據後發送到其他的服務器
- 其他的服務器接受到數據後,在本機授權key中查找A的公鑰,並解密數據
- 數據處理完成後,使用公鑰(A)將數據加密後返回給A服務器
2. 生成密鑰對:
[root@hadoop101 .ssh]# pwd //.ssh是一個隱藏的文件夾
/root/.ssh[root@hadoop101 .ssh]$ ssh-keygen -t rsa //然後敲(三個回車),就會生成兩個文件id_rsa(私鑰)、id_rsa.pub(公鑰)
3. 將公鑰拷貝到要免密登錄的目標機器上
[root@hadoop101 .ssh]$ ssh-copy-id hadoop101
[root@hadoop101 .ssh]$ ssh-copy-id hadoop102
[root@hadoop101 .ssh]$ ssh-copy-id hadoop103
4.測試
[root@hadoop101 .ssh]# ssh hadoop102
Last login: Mon Apr 8 17:00:50 2019 from 192.168.1.1
[root@hadoop102 ~]# exit
logout
Connection to hadoop102 closed.
3. .ssh文件夾下(~/.ssh)的文件功能解釋
- known_hosts :記錄ssh訪問過計算機的公鑰(public key)
- id_rsa :生成的私鑰
- id_rsa.pub :生成的公鑰
- authorized_keys :存放授權過得無密登錄服務器公鑰
3.3 集羣一鍵啓動/停止方式
1. 各個服務組件逐一啓動/停止
分別啓動/停止hdfs組件
hadoop-daemon.sh start|stop namenode|datanode|secondarynamenode
啓動/停止yarn
yarn-daemon.sh start|stop resourcemanager|nodemanager
2. 各個模塊分開啓動/停止(配置SSH是前提)常用
整體啓動/停止hdfs(namenode節點啓動,也就是hadoop101)
[root@hadoop101sbin]# ./start-dfs.sh
[root@hadoop101 sbin]# ./start-dfs.sh
整體啓動/停止yarn(在resourceManager節點啓動,也就是hadoop102)
[root@hadoop102 sbin]# ./start-yarn.sh
[root@hadoop102 sbin]# ./stop-yarn.sh
4 測試
4.1啓動集羣
1. 如果集羣是第一次啓動,需要格式化namenode,如果單點啓動的時候已將格式化,就不需要格式化了!!
[root@hadoop101 hadoop-2.7.2]$ bin/hdfs namenode -format
2. 啓動HDFS
[root@hadoop101 hadoop-2.7.2]$ sbin/start-dfs.sh
[root@hadoop101 hadoop-2.7.2]$ jps
4166 NameNode
4482 Jps
4263 DataNode
[root@hadoop101 hadoop-2.7.2]$ jps
3218 DataNode
3288 Jps
[root@hadoop101 hadoop-2.7.2]$ jps
3221 DataNode
3283 SecondaryNameNode
3364 Jps
啓動之後查看hdfs的WEBUI界面:http://192.168.1.101:50070/
3. 啓動yarn
[root@hadoop102 hadoop-2.7.2]$ sbin/start-yarn.sh
注意:NameNode和ResourceManger如果不是同一臺機器,不能在NameNode上啓動 yarn,應該在ResouceManager所在的機器上啓動yarn。如果不在一臺機器上,則ResourceManger所在機器也需要配置到其他機器的ssh免密登錄
通過jps命令查看進程:
[root@hadoop101 .ssh]# jps
3584 NameNode
3718 DataNode
4872 NodeManager[root@hadoop102 sbin]# jps
3441 DataNode
5162 NodeManager
5053 ResourceManager[root@hadoop103 ~]# jps
3542 SecondaryNameNode
5095 NodeManager
3434 DataNode
Yarn的web頁面查看地址:http://hadoop102:8088/
4. 查看SecondaryNameNode的WEBUI界面
4.2 集羣基本測試
1. 上傳文件到集羣
上傳小文件
[root@hadoop101 hadoop-2.7.2]# hadoop fs -mkdir /upload //在hdfs上創建一個文件夾
[root@hadoop101 hadoop-2.7.2]# hadoop fs -put bigdata.txt /upload/
上傳大文件
[root@hadoop101 software]# hadoop fs -put hadoop-2.7.2.tar.gz /upload
2. 上傳文件後查看文件存放的位置
查看HDFS文件存儲位置
[root@hadoop101 subdir0]$ pwd
/opt/module/hadoop-2.7.2/data/tmp/dfs/data/current/BP-327200681-192.168.1.101-1551800072963/current/finalized/subdir0/subdir0
查看HDFS在磁盤存儲的文件內容
[root@hadoop101 subdir0]$ cat blk_1073741825
hadoop yarn
hadoop mapreduce
拼接
-rw-rw-r--. 1 hadoop hadoop 134217728 4月 8 20:01 blk_1073741836
-rw-rw-r--. 1 hadoop hadoop 1048583 4月 8 20:01 blk_1073741836_1012.meta
-rw-rw-r--. 1 hadoop hadoop 63439959 4月 8 20:01 blk_1073741837
-rw-rw-r--. 1 hadoop hadoop 495635 4月 8 20:01 blk_1073741837_1013.meta
[root@hadoop101 subdir0]$ cat blk_1073741836>>tmp.file
[root@hadoop101 subdir0]$ cat blk_1073741837>>tmp.file
[root@hadoop101 subdir0]$ tar -zxvf tmp.file
下載
[root@hadoop101 hadoop-2.7.2]$ hadoop fs -get /upload/hadoop-2.7.2.tar.gz ./
4.3 集羣時間同步
時間同步的方式:在集羣中找一臺機器,作爲時間服務器,集羣中其他機器與這臺機器定時的同步時間,比如,每隔十分鐘,同步一次時間。
4.3.1 時間服務器配置(必須是root用戶)
1. 檢查ntp是否安裝,沒有安裝則使用 yum install ntp -y 進行安裝
[root@hadoop101 桌面]# rpm -qa|grep ntp
ntp-4.2.6p5-10.el6.centos.x86_64
fontpackages-filesystem-1.41-1.1.el6.noarch
ntpdate-4.2.6p5-10.el6.centos.x86_64
2. 修改net配置文件
[root@hadoop101 桌面]# vim /etc/ntp.conf
修改內容如下
a)修改1(授權192.168.1.0網段上的所有機器可以從這臺機器上查詢和同步時間)
#restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap爲
restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap
b)修改2(集羣在局域網中,不使用其他的網絡時間)
server 0.centos.pool.ntp.org iburst
server 1.centos.pool.ntp.org iburst
server 2.centos.pool.ntp.org iburst
server 3.centos.pool.ntp.org iburst爲
#server 0.centos.pool.ntp.org iburst
#server 1.centos.pool.ntp.org iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst
c)添加3(當該節點丟失網絡連接,依然可以作爲時間服務器爲集羣中的其他節點提供時間同步)
server 127.127.1.0
fudge 127.127.1.0 stratum 10
3. 修改/etc/sysconfig/ntpd 文件
[root@hadoop101 桌面]# vim /etc/sysconfig/ntpd
增加內容如下(讓硬件時間與系統時間一起同步)
SYNC_HWCLOCK=yes
4. 重新啓動ntpd
[root@hadoop101 桌面]# service ntpd status
ntpd 已停
[root@hadoop101 桌面]# service ntpd start
正在啓動 ntpd: [確定]
5. 執行:
[root@hadoop101 桌面]# chkconfig ntpd on
4.3.2 其他機器配置(root用戶)
1. 在其他機器配置10分鐘與時間服務器同步一次
[root@hadoop102 hadoop-2.7.2]# crontab -e
編寫腳本
*/10 * * * * /usr/sbin/ntpdate hadoop101
2. 修改任意機器時間
[root@hadoop102 root]# date -s "2017-9-11 11:11:11"
3. 十分鐘後查看機器是否與時間服務器同步
[root@hadoop102 root]# date