hadoop單機及僞分佈式

hadoop的基本概念
僞分佈式hadoop集羣安裝
hdfs、MapReduce演示

互聯網正在從IT走向DT時代。

大數據應用分析
1、統計類的分析
2、推薦類的分析    
3、機器學習(分類,聚類)
4、人工智能、預測(算法)

一、什麼是hadoop


官網:http://hadoop.apache.org

hadoop是apache旗下的一套開源軟件平臺。
是一個可靠的、可擴展的、可分佈式計算的開源軟件。

apache hadoop平臺是一個框架,允許使用簡單的編程模型。
該平臺被設計成可以從單個服務器擴展到數千臺服務器,每個服務器都提供本地計算和存儲。
也被設計成可檢測和處理應用層的故障(即高可靠、高容錯),高可用服務是基於計算機集羣的,並且其中每一臺計算機都有可能失效。

hadoop提供的功能:利用服務器集羣,根據用戶的自定義業務邏輯,對海量數據進行分佈式處理

作者:doug  cutting

hadoop的核心組件:
    hadoop common:hadoop工具
    hadoop  distributed file system(HDFS):分佈式文件系統,解決海量數據的存儲
    hadoop  YARN:運算資源調度系統,解決資源管理調度
    hadoop MapReduce:分佈式運算編程框架,解決海量數據的分析模型

Hadoop在2.0將資源管理從MapReduce中獨立出來變成通用框架後,就從1.0的三層結構演變爲了現在的四層架構:
        1. 底層——存儲層,文件系統HDFS
        2. 中間層——資源及數據管理層,YARN以及Sentry等
        3. 上層——MapReduce、Impala、Spark等計算引擎
        4. 頂層——基於MapReduce、Spark等計算引擎的高級封裝及工具,如Hive、Pig、Mahout等等

廣義上來說,hadoop通常是指一個更廣泛的概念——Hadoop生態圈

二、hadoop產生背景

1、hadoop最早起源於Nutch。
Nutch的設計目標是構建一個大型的全網搜索引擎,包括網頁抓取、索引、查詢等功能,但隨着抓取網頁數量的增加,遇到了嚴重的可擴展性問題——如何解決數十億網頁的存儲和索引問題。

2、2003年、2004年穀歌發表的兩篇論文爲該問題提供了可行的解決方案。
分佈式文件系統(GFS),可用於處理海量網頁的存儲;
分佈式計算框架MapReduce,可用於處理海量網頁的索引計算問題。

3、Nutch的開發人員完成了相應的開源實現HDFS和MapReduce,並從Nutch中剝離成爲獨立項目hadoop,到2008年1月,hadoop成爲apache頂級項目,迎來了快速發展期。

三、hadoop在大數據、雲計算中的位置和關係

1、雲計算是分佈式計算、並行計算、網格計算、多核計算、網絡存儲、虛擬化、負載均衡等傳統計算機技術和互聯網技術融合發展的產物。藉助Iaas(基礎設施即服務)、Paas(平臺即服務)、Saas(軟件即服務)等業務模式,把強大的計算能力提供給終端用戶

2、現階段,雲計算的底層支撐技術爲“虛擬化”和“大數據技術”

3、而hadoop則是雲計算的Paas層的解決方案之一,並不等同於Paas,更不等同於雲計算本身。

四、大數據處理業務應用
1、大型網站web服務器的日誌分析:一個大型網站的web服務器集羣 ,每5分鐘收錄的點擊日誌高達800GB左右,峯值點擊每秒達到900萬次,每個5分鐘將數據裝載到內存中,高速計算網站的熱點URL,並將這些信息反饋給前端緩存服務器,以提高緩存命中率。

2、運營商流量分析:每天的流量數據在2TB~5TB左右,拷貝到HDFS上,通過交互式分析引擎框架,能運行幾百個複雜的數據清洗和報表業務,總時間比類似硬件配置的小型機集羣和DB2快2~3倍。

3、IPTV收視統計與點播推薦:一個實時收視率統計和點播推薦系統,可以實時收集用戶的遙控器操作,提供實時的收視率榜單;並且根據內容推薦和協同過濾算法,實現了點播推薦服務。

4、城市交通卡口視頻監控信息的實時分析:採用基於流式stream進行全省範圍的交通卡口通過視頻監控收錄的信息進行實時分析、告警和統計(計算實時路況),對全省範圍內未年檢車輛或×××的分析延時在300毫秒左右,可以做出實時告警。

大數據是個複合專業,包括應用開發、軟件平臺、算法、數據挖掘等,因此,大數據技術領域的就業選擇是多樣的,但就hadoop而言,通常都需要具備以下技能或知識:
1、hadoop分佈式集羣的平臺搭建
2、hadoop分佈式文件系統HDFS的原理理解及使用
3、hadoop分佈式運算框架MapReduce的原理理解及編程
4、hive數據倉庫工具的熟練應用
5、flume、sqoop、oozie等輔助工具的熟練使用
6、shell、python等腳本語言的開發能力

hadoop對海量數據處理的解決思路:


HDFS的架構:
主從結構:
主節點:namenode
從節點:有很多個datanode

namenode負責:
接受用戶操作請求
存儲文件的元數據以及每個文件的塊列表和塊所在的datanode等
維護文件系統的目錄結構
管理文件與block之間的關係,block與datanode之間關係

datanode負責:
存儲文件
在本地文件系統存儲文件塊數據,以及塊數據的校驗和
文件被分成block存儲在磁盤上
爲保證數據安全,文件會有多個副本

secondary  namenode(2nn):用於監控HDFS狀態的輔助後臺程序,每隔一段時間獲取和hdfs元數據的快照。

YARN架構:
1)ResourceManager(RM)主要作用如下:
(1)處理客戶端請求
(2)監控NodeManager
(3)啓動或監控ApplicationMaster

2)NodeManager(nm)主要作用如下:
(1)管理單個節點上的資源
(2)處理來自ResourceManager的命令
(3)處理來自ApplicationMaster的命令

3)ApplicationMaster(AM)作用:
(1)輔助數據的切分
(2)爲應用程序申請資源並分配給內部的任務
(3)任務的監控與容錯

4)Container
Container是YARN中的資源抽象,它封裝了某個節點上的多維度資源,如內存、CPU、磁盤、網絡等。

問題:怎麼解決海量數據的計算

Mapreduce架構:
兩個程序:
Map:局部並行處理輸入數據
reduce:彙總局部處理的結果,再統計全局

hadoop1.x和hadoop2.x版本的區別:

安裝部署,運維、開發、測試

HDFS三大核心:HDFS、MapReduce、YARN
四個模塊:
hadoop  common:爲其他hadoop模塊提供基礎設施
hadoop  dfs:一個高可靠、高吞吐量的分佈式文件系統
hadoop mapreduce:一個分佈式的離線並行計算框架
hadoop yarn:一個新的mapreduce框架,任務調度和資源管理

hadoop安裝:

Hadoop三種安裝模式


1.Hadoop單機模式
單機模式是Hadoop默認的安裝模式,這種安裝模式主要就是並不配置更多的配置文件,只是保守的去設置默認的幾個配置文件中的初始化參數,它並不與其他節點進行交互,並且也不使用HDFS文件系統,它主要就是爲了調試MapReduce程序而生。

2.Hadoop僞分佈式安裝模式
Hadoop僞分佈式安裝,需要配置5個常規的配置文件(XML),並且這裏涉及到了NameNode和DataNode節點交互問題,而且NameNode和DataNode在同一個節點上,還需要配置互信。其實從嚴格意義上來講,僞分佈式集羣,就已經可以稱之爲真正意義上的集羣了,而且這裏也包含了hdfs和MapReduce所有組件,只不過就是所有組件在同一個節點上而已。

3.Hadoop完全分佈式安裝模式
Hadoop完全分佈式集羣主要分爲:常規Hadoop完全分佈式集羣和Hadoop HA集羣(這裏主要針對的是NameNode個數和NameNode的高可用保障機制而言)。由此可知較僞分佈式集羣而言,完全分佈式集羣,所有處理節點並不在同一個節點上,而是在多個節點上。

搭建一個僞分佈式集羣

一、環境搭建

1、系統環境
平臺:VMware Workstation 14
系統:centos  7.4

2、修改主機名:
hostnamectl  set-hostname  hadoop

useradd   hadoop
passwd hadoop

visodu
hadoop    ALL=(ALL)   ALL

注:改完主機名後,需要exit退出,重新啓動。

3、修改/etc/hosts域名解析配置文件
vi   /etc/hosts

192.168.80.100   hadoop

4、關閉防火牆和selinux
systemctl disable  firewalld
systemctl  stop firewalld
setenforce  0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config  

5、安裝時間同步
yum -y install ntpdate 

ntpdate time1.aliyun.com

6、安裝Java環境
1)解壓Java壓縮包
tar -xf jdk-8u11-linux-x64.tar.gz  -C /opt
cp -rf jdk1.8.0_11/   /usr/local/java

2)配置Java環境變量
vi /etc/profile
末尾新增:
export JAVA_HOME=/usr/local/java
export JRE_HOME=/usr/local/java/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$PATH:$JAVA_HOME/bin

3)生效環境變量
source  /etc/profile

4)驗證
java  -version

出現以下提示,代表java環境部署成功:
java version "1.8.0_11"
Java(TM) SE Runtime Environment (build 1.8.0_11-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.11-b03, mixed mode)

二、hadoop正式部署安裝
官方文檔:http://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-common/SingleCluster.html#Standalone_Operation

下載地址:http://archive.apache.org/dist/hadoop/core/hadoop-3.1.0/hadoop-3.1.0.tar.gz

1、解壓hadoop軟件包
tar xf hadoop-3.1.0.tar.gz  

2、重命名
mv hadoop-3.1.0/ /home/hadoop/hadoop

3、配置環境變量
vi  /etc/profile
export HADOOP_HOME=/home/hadoop/hadoop
export LD_LIBRARY_PATH=$HADOOP_HOME/lib/native
export HADOOP_COMMON_LIB_NATIVE_DIR=/home/hadoop/hadoop/lib/native
export HADOOP_OPTS="-Djava.library.path=/home/hadoop/hadoop/lib"
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/sbin:$HADOOP_HOME/bin

#hadoop-3.1.0必須添加如下5個變量否則啓動報錯,hadoop-2.x貌似不需要
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

hadoop單機及僞分佈式

4、生效環境變量
source /etc/profile

5、測試是否配置成功
hadoop version

出現以下信息,代表配置成功:
Hadoop 3.1.0
Source code repository https://github.com/apache/hadoop -r 16b70619a24cdcf5d3b0fcf4b58ca77238ccbe6d
Compiled by centos on 2018-03-30T00:00Z
Compiled with protoc 2.5.0
From source with checksum 14182d20c972b3e2105580a1ad6990
This command was run using /usr/local/hadoop/share/hadoop/common/hadoop-common-3.1.0.jar

hadoop單機及僞分佈式


7、hadoop目錄認識
修改配置文件之前,先看一下hadoop下的目錄:
bin:hadoop最基本的管理腳本和使用腳本所在目錄,這些腳本是sbin目錄下管理腳本的基礎實現,用戶可以直接使用這些腳本管理和使用hadoop
etc:配置文件存放的目錄,包括core-site.xml,hdfs-site.xml,mapred-site.xml等從hadoop1.x繼承而來的配置文件和yarn-site.xml等hadoop2.x新增的配置文件
include:對外提供的編程庫頭文件(具體動態庫和靜態庫在lib目錄中,這些頭文件軍事用c++定義的,通常用於c++程序訪問hdfs或者編寫mapreduce程序)
Lib:該目錄包含了hadoop對外提供的才變成動態庫和靜態庫,與include目錄中的頭文件結合使用
libexec:各個服務對應的shell配置文件所在目錄,可用於配置日誌輸出目錄、啓動參數等信息
sbin:hadoop管理腳本所在目錄,主要包含hdfs和yarn中各類服務的啓動、關閉腳本
share:hadoop各個模塊編譯後的jar包所在目錄。

cd  /home/hadoop/hadoop/etc/hadoop     #此目錄是存放配置文件的

vi hadoop-env.sh     #hadoop的變量設置腳本
#hadoop-3.1.0是第54行,hadoop-2.7.7是第25行

export JAVA_HOME=/usr/local/java

測試:
mkdir  /home/input

hadoop  jar /home/hadoop/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.0.jar  wordcount  /home/input  /home/output

hadoop單機及僞分佈式

hdfs  dfs -ls / 

hadoop單機及僞分佈式

cd /home/hadoop/hadoop/etc/hadoop/

vi  core-site.xml   #hadoopg公共文件,全局配置文件
添加以下幾行:
<configuration>
    <!--指定HADOOP所使用的文件系統schema(URI),HDFS的老大(NameNode)的地址-->
<property>
        <name>fs.defaultFS</name>   
        <value>hdfs://hadoop:9000</value>  
    </property>
        <!--指定HADOOP運行時產生文件的存儲目錄-->
    <property>
        <name>hadoop.tmp.dir</name>    #指定臨時數據存儲目錄
        <value>/home/hadoop/hadoop/tmp</value>    #系統路徑
    </property>    
</configuration>

注意:在hadoop安裝目錄的文檔中有所有配置文件的默認參數表,用戶可以查看後,根據實際情況進行修改。
uri是使用自己的協議以及自己的地址端口

hadoop單機及僞分佈式

/usr/local/hadoop/share/doc/hadoop/hadoop-project-dist/hadoop-common/core-default.html文檔中可以看到:
hadoop.tmp.dir的默認值是/tmp/hadoop-${user.name}。/tmp/是Linux系統的臨時目錄,如果我們不重新指定的話,默認Hadoop工作目錄在Linux的臨時目錄,一旦Linux系統重啓,所有文件將會清空,包括元數據等信息都丟失了,需要重新進行格式化,非常麻煩。

vi  hdfs-site.xml    #hdfs站點配置文件
添加以下幾行:
<configuration>
    <!--指定HDFS副本的數量-->
    <property>
        <name>dfs.replication</name>   #指定hdfs的副本數
        <value>1</value>   #指定副本數量
    </property>
<!--設置默認端口,如果不加上會導致啓動hadoop-3.1.0後無法訪問50070端口查看HDFS管理界面,hadoop-2.x可以不加-->
    <property> 
        <name>dfs.http.address</name> 
        <value>192.168.80.100:50070</value> 
    </property>
</configuration>
注:
hdfs-default.xml文檔中可以看到:
dfs.replication的默認值是3,由於HDFS的副本數不能大於DataNode數,而我們此時安裝的hadoop中只有一個DataNode,所以將dfs.replication值改爲1。
dfs.namenode.http-address在hadoop-3.1.0版本上的默認值是?0.0.0.0:9870 ,在hadoop-2.7.7版本上的默認值是0.0.0.0:50070,所以不同版本可以通過不同端口訪問NameNode。

hadoop單機及僞分佈式

cp mapred-site.xml.templete mapred-site.xml #重命名,hadoop-3.1.0系統中就是mapred-site.xml不需要改名,hadoop-2.x需要改名

vi mapred-site.xml #添加如下幾行,指定hadoop運行在哪種計算框架上,這裏指定yarn框架。
<!--指定mr運行在yarn上-->
<property>
  <name>mapreduce.framework.name</name>   #指定MapReduce程序放在哪個服務上去啓用
  <value>yarn</value>
</property>

hadoop單機及僞分佈式

vi yarn-env.xml    #2.x版本需要更改jdk路徑
export JAVA_HOME = 

vi yarn-site.xml #添加如下幾行
<configuration>
    <!-- 指定YARN集羣的老大(ResourceManager)的地址-->
    <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>hadoop</value>
    </property>
    <!-- 指定reducer獲取數據的方式-->
    <property>
        <name>yarn.nodemanager.aux-services</name>   #
        <value>mapreduce_shuffle</value>
    </property>
</configuration>

hadoop單機及僞分佈式

8、免密碼交互
ssh-keygen -t rsa    #生成ssh密鑰對
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): #直接回車
Enter passphrase (empty for no passphrase): #直接回車
Enter same passphrase again: #直接回車
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:9NevFFklAS5HaUGJtVrfAlbYk82bStTwPvHIWY7as38 root@hadoop
The key's randomart image is:
+---[RSA 2048]----+
|                               |
|                               |
|                               |
|     .                         |
|    . o S =                |
|     ..O * =               |
|     =X.%.E . .        |
|    *+=%oBo+.o    |
|   o=B+o++o.oo.  |
+----[SHA256]-----+

cd /root/.ssh/
ls 
id_rsa  id_rsa.pub  known_hosts

注:
#id_rsa爲私鑰,id_rsa.pub爲公鑰

因爲搭建的是hadoop僞分佈式,所以namenode與datanode都在一個節點上。
cp id_rsa.pub authorized_keys #使主機之間可以免密碼登錄

ssh hadoop date #查看(不需要輸入密碼,直接輸出結果,說明免密成功)

9、啓動hadoop集羣
1)首先格式化NameNode

注意:如果格式化NameNode之後運行過hadoop,然後又想再格式化一次NameNode,那麼需要先刪除第一次運行Hadoop後產生的VERSION文件,否則會出錯,詳情見第四部分問題4。

cd
[root@hadoop ~]# hdfs namenode -format #中間沒有報錯並且最後顯示如下信息表示格式化成功
...
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at hadoop/192.168.80.100
************************************************************/

hadoop單機及僞分佈式


格式化完成後,系統會在dfs.data.dir目錄下生成元數據信息。

name/current
data/current

bin/hdfs  namenode -format

sbin/hadoop-daemon.sh start namenode

sbin/hadoop-daemon.sh start   datanode
或者:
start-dfs.sh
start-yarn.sh

2)輸入 start-all.sh 啓動
start-all.sh
Starting namenodes on [hadoop]
上一次登錄:四 4月 18 23:06:27 CST 2019從 192.168.80.1pts/1 上
Starting datanodes
上一次登錄:四 4月 18 23:53:44 CST 2019pts/1 上
localhost: Warning: Permanently added 'localhost' (ECDSA) to the list of known hosts.
Starting secondary namenodes [hadoop]
上一次登錄:四 4月 18 23:53:46 CST 2019pts/1 上
2019-04-18 23:54:08,969 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Starting resourcemanager
上一次登錄:四 4月 18 23:54:03 CST 2019pts/1 上
Starting nodemanagers
上一次登錄:四 4月 18 23:54:10 CST 2019pts/1 上

3)執行 jps 驗證集羣是否啓動成功

 jps #顯示以下幾個進程說明啓動成功
96662 Jps
95273 DataNode #可有可無
95465 SecondaryNameNode #重要
95144 NameNode #重要
95900 NodeManager #可有可無
95775 ResourceManager #非常重要

hadoop單機及僞分佈式


4)登錄HDFS管理界面(NameNode):http://ip:50070

hadoop單機及僞分佈式

5)登錄MR管理界面: http://ip:8088

hadoop單機及僞分佈式


使用:
上傳文件到hdfs中:
hadoop  fs  -put  aa    hdfs://192.168.80.100:9000/
注:aa是要上傳的文件名

hadoop單機及僞分佈式

hadoop單機及僞分佈式


簡寫:
hadoop  fs -put  aa  /

從hdfs中下載文件:
hadoop  fs  -get hdfs://192.168.80.100:9000/aa

hadoop單機及僞分佈式

在hdfs中創建目錄:
hadoop  fs  -mkdir  hdfs://192.168.80.100:9000/word
也可以簡寫:
hadoop  fs  -mkdir  /word

hadoop單機及僞分佈式


調用MapReduce程序:
hadoop  jar   hadoop-mapreduce-examples~   pi  5   5

注:
pi:主類,計算圓周率
5:參數,map的任務數量
5:每個map的取樣數

hadoop  jar  hadoop-mapreduce-example~   word   /word/input   /word/output

hadoop  fs -ls  /word/output

hadoop fs  -cat   /word/output/part~

HDFS的實現思想:
1、hdfs是通過分佈式集羣來存儲文件
2、文件存儲到hdfs集羣中去的時候是被切分成block的
3、文件的block存放在若干臺datanode節點上
4、hdfs文件系統中的文件與真實的block之間有映射關係,由namenode管理
5、每一個block在集羣中會存儲多個副本,好處是可以提高數據的可靠性,還可以提高訪問的吞吐量

我們可以看到不管是啓動還是關閉hadoop集羣,系統都會報如下錯誤:
 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable

解決方式:先看看我們安裝的hadoop是否是64位的
[root@hadoop hadoop]# file /usr/local/hadoop/lib/native/libhadoop.so.1.0.0  #出現以下信息表示我們的hadoop是64位的
/usr/local/hadoop/lib/native/libhadoop.so.1.0.0: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=8d84d1f56b8c218d2a33512179fabffbf237816a, not stripped

永久解決方式:
vi /usr/local/hadoop/etc/hadoop/log4j.properties #在文件末尾添加如下一句,保存退出
log4j.logger.org.apache.hadoop.util.NativeCodeLoader=Error

配置說明

    JDK :Hadoop和Spark 依賴的配置,官方建議JDK版本在1.7以上!!!
    Scala:Spark依賴的配置,建議版本不低於spark的版本。
    Hadoop: 是一個分佈式系統基礎架構。
    Spark: 分佈式存儲的大數據進行處理的工具。
    zookeeper:分佈式應用程序協調服務,HBase集羣需要。
    HBase: 一個結構化數據的分佈式存儲系統。
    Hive: 基於Hadoop的一個數據倉庫工具,目前的默認元數據庫是mysql。

配置歷史服務器
vi mapred-site.xml
<!-- 歷史服務器端地址 -->
<property>
    <name>mapreduce.jobhistory.address</name>
    <value>hadoop:10020</value>
</property>
<!-- 歷史服務器web端地址 -->
<property>
    <name>mapreduce.jobhistory.webapp.address</name>
    <value>hadoop:19888</value>
<property>

啓動歷史服務器:
sbin/mr-jobhistory-daemon.sh start historyserver

查看歷史服務器是否啓動
jps

查看jobhistory:
192.168.80.100:19888

配置日誌聚集
日誌聚集:應用運行完成以後,將程序運行日誌信息上傳到HDFS系統上
好處:可以方便的查看到程序運行詳情,方便開發調試

注:開啓日誌聚集功能,需要重新啓動NodeManager、ResourceManager和HistoryManager

步驟:

關閉所有
sbin/mr-jobhistory-daemon.sh  stop  historyserver
sbin/yarn-daemon.sh stop nodemanager
sbin/yarn-daemon.sh stop resourcemanager

jps

vi yarn-site.xml

<!-- 日誌聚集功能使能 -->
<property>
    <name>yarn.log-aggregation-enable</name>
    <value>true</value>
</property>
<!-- 日誌保留時間設置7天 -->
<property>
    <name>yarn.log-aggregation.retain-seconds</name>
    <value>604800</value>
<property>

sbin/yarn-daemon.sh start resourcemanager
sbin/yarn-daemon.sh start nodemanager
sbin/mr-jobhistory-daemon.sh  start  historyserver

測試:
hadoop  jar   hadoop-mapreduce-examples~   pi  5   5
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章