什麼是hadoop?java
Hadoop 是 Apache 旗下的一個用 java 語言實現開源軟件框架,是一個開發和運行處理大規模數據的軟件平臺。容許使用簡單的編程模型在大量計算機集羣上對大型數據集進行分佈式處理。node
hadoop提供的功能:利用服務器集羣,根據用戶的自定義業務邏輯,對海量數據進行分佈式處理。python
狹義上來講hadoop 指 Apache 這款開源框架,它的核心組件有:mysql
擴展:linux
關於hdfs集羣: hdfs集羣有一個name node(名稱節點),相似zookeeper的leader(領導者),namenode記錄了用戶上傳的一些文件分別在哪些DataNode上,記錄了文件的源信息(就是記錄了文件的名稱和實際對應的物理地址),name node有一個公共端口默認是9000,這個端口是針對客戶端訪問的時候的,其餘的小弟(跟隨者)叫data node,namenode和datanode會經過rpc進行遠程通信。c++
Yarn集羣: yarn集羣裏的小弟叫作node manager,MapReduce程序發給node manager來啓動,MapReduce讀數據的時候去找hdfs(datanode)去讀。(注:hdfs集羣和yarn集羣最好放在同一臺機器裏),yarn集羣的老大主節點resource manager負責資源調度,應(最好)單獨放在一臺機器。算法
廣義上來講,hadoop一般指更普遍的概念--------hadoop生態圈 。sql
當下的 Hadoop 已經成長爲一個龐大的體系,隨着生態系統的成長,新出現的項目愈來愈多,其中不乏一些非 Apache 主管的項目,這些項目對 HADOOP 是很好的補充或者更高層的抽象。好比:shell
HDFS:分佈式文件系統
MAPREDUCE:分佈式運算程序開發框架
HIVE:基於 HADOOP 的分佈式數據倉庫,提供基於 SQL 的查詢數據操做
HBASE:基於 HADOOP 的分佈式海量數據庫
ZOOKEEPER:分佈式協調服務基礎組件
Mahout:基於 mapreduce/spark/flink 等分佈式運算框架的機器學習算法庫
Oozie:工做流調度框架
Sqoop:數據導入導出工具(好比用於 mysql 和 HDFS 之間)
Flume:日誌數據採集框架
Impala:基於 Hadoop 的實時分析數據庫
hadoop特性的優勢:
擴容能力(Scalable):Hadoop 是在可用的計算機集羣間分配數據並完成計算任務的,這些集羣可用方便的擴展到數以千計的節點中。
成本低(Economical):Hadoop 經過普通廉價的機器組成服務器集羣來分發以及處理數據,以致於成本很低。
高效率(Efficient):經過併發數據,Hadoop 能夠在節點之間動態並行的移動數據,使得速度很是快。
可靠性(Rellable):能自動維護數據的多份複製,而且在任務失敗後能自動地從新部署(redeploy)計算任務。因此 Hadoop 的按位存儲和處理數據的能力值得人們信賴。
hadoop集羣搭建準備工做:Linux下編譯hadoop
因爲從Apache官方下載的hadoop 2.X.X的編譯版本(binary)爲32位,小几率不能適應咱們的操做系統。另外,在企業中須要對hadoop源碼進行修改,因此須要本身處理hadoop源文件後再進行編譯。本文以Centos-6.7爲例,演示編譯hadoop-2.9.0。
Requirements:
建立三個文件夾
#servers爲軟件安裝路徑 mkdir -p /export/servers #software爲軟件壓縮包存放路徑 mkdir -p /export/software #data爲軟件運行產生數據的存放路徑 mkdir -p /export/hadoopdata
將壓縮包所有上傳至/export/software
yum install lrzsz cd /export/software rz
cd /export/software tar -zxvf jdk-8u111.tar.gz -C /export/servers cd /export/servers/ mv jdk-jdk-8u111 jdk1.8 vi /etc/profile #鍵盤輸入G調到文件末尾,i插入 export JAVA_HOME=/export/servers/jdk export PATH=.:$PATH:$JAVA_HOME/bin #ESC退出,shift+:,wq!保存 source /etc/profile
命令行敲入java -version出現以下代碼表示成功
java version "1.8.0_111" Java(TM) SE Runtime Environment (build 1.8.0_111-b14) Java HotSpot(TM) 64-Bit Server VM (build 25.111-b14, mixed mode) [root@node0 software]#
cd /export/software tar -zxvf apache-maven-3.3.9-bin.tar.gz -C /export/servers cd /export/servers/ mv apache-maven-3.3.9 maven vi /etc/profile #鍵盤輸入G調到文件末尾,i插入 export MAVEN_HOME=/export/servers/maven export PATH=.:$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin #ESC退出,shift+:,wq!保存 source /etc/profile
命令行敲入mvn -version出現以下代碼表示成功
Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-11T00:41:47+08:00) Maven home: /export/servers/maven Java version: 1.8.0_111, vendor: Oracle Corporation Java home: /export/servers/jdk/jre Default locale: en_US, platform encoding: UTF-8 OS name: "linux", version: "2.6.32-573.el6.x86_64", arch: "amd64", family: "unix"
使用yum安裝須要的C和C++編譯環境
yum install gcc yum install gcc-c++ yum install make
安裝protobuf
cd /export/software tar -zxvf protobuf-2.5.0.tar.gz -C /export/servers cd /export/servers/ mv protobuf-2.5.0 protobuf cd /protobuf ./configure make make install
輸入protoc --version,若是出現以下信息表示安裝成功
libprotoc 2.5.0
使用yum安裝
yum install cmake yum install openssl-devel yum install ncurses-devel
cd /export/software tar -zxvf apache-ant-1.9.7-bin.tar.gz -C /export/servers cd /export/servers/ mv apache-ant-1.9.7 ant vi /etc/profile export ANT_HOME=/export/servers/ant export PATH=.:$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin:$ANT_HOME/bin source /etc/profile
輸入ant -version,若是出現以下信息表示安裝成功
Apache Ant(TM) version 1.9.7 compiled on April 9 2016
cd /export/software tar -zxvf hadoop-2.9.0-src.tar.gz -C /export/servers cd /export/servers/hadoop-2.9.0-src
hadoop-2.9.0-src目錄
輸入以下命令進行編譯hadoop-2.9.0
mvn package -Pdist,native -DskipTests -Dtar
或者
mvn package -DskipTests -Pdist,native
通過漫長的等待,顯示以下信息,編譯完成
進入hadoop-dist查看編譯好的hadoop-2.9.0
注:maven倉庫用的是國外的鏡像,小几率會出現抽風,修改成aliyun鏡像
vi /export/servers/maven/conf/setting.xml
maven編譯hadoop過程當中可能會出現[ERROR]TEST...,這個是源碼中間存在某些test文件,而maven倉庫找不到相應的包。
解決:一、使用國外的maven倉庫。二、修改源碼,將test包下的文件刪除,同時刪除響應pom.xml中的依賴
終於終於完成了hadoop 的編譯!接下來咱們繼續!
一般咱們所說的hadoop集羣包含 2個集羣:HDFS 集羣和 YARN 集羣,二者邏輯上分離,但物理上常在一塊兒。
HDFS 集羣負責海量數據的存儲,集羣中的角色主要有:NameNode、DataNode、SecondaryNameNode
YARN 集羣負責海量數據運算時的資源調度,集羣中的角色主要有:ResourceManager、NodeManager
那 mapreduce 是什麼呢?它實際上是一個分佈式運算編程框架,是應用程序開發包,由用戶按照編程規範進行程序開發,後打包運行在 HDFS 集羣上,而且受到 YARN 集羣的資源調度管理。
Hadoop 部署方式分三種,Standalone mode (獨立模式)、Pseudo-Distributedmode(僞分佈式模式)、Cluster mode(羣集模式),其中前兩種都是在單機部署。
獨立模式又稱爲單機模式,僅 1 個機器運行 1 個 java 進程,主要用於調試。
僞分佈模式也是在 1 個機器上運行 HDFS 的 NameNode 和 DataNode、YARN 的ResourceManger 和 NodeManager,但分別啓動單獨的 java 進程,主要用於調試。
集羣模式主要用於生產環境部署。會使用 N 臺主機組成一個 Hadoop 集羣。這種部署模式下,主節點和從節點會分開部署在不一樣的機器上。
這裏咱們以 3 節點爲例進行搭建,角色分配以下:
mini4 NameNode DataNode ResourceManager
mini5 DataNode NodeManager SecondaryNameNode
mini6 DataNode NodeManager
分別啓動mini四、mini五、mini6,同步集羣各機器的時間:
#手動同步集羣各機器時間 date -s "2017-03-03 03:03:03" yum install ntpdate #網絡同步時間 ntpdate cn.pool.ntp.org
配置 IP 、主機名 映射
vi /etc/hosts 192.168.75.14 mini4 192.168.75.15 mini5 192.168.75.16 mini6
配置 ssh免密登陸
#生成 ssh 免登錄密鑰
ssh-keygen -t rsa (四個回車)
執行完這個命令後,會生成 id_rsa(私鑰)、id_rsa.pub(公鑰)
將公鑰拷貝到要免密登錄的目標機器上
ssh-copy-id mini4 ssh-copy-id mini5 ssh-copy-id mini6
關閉防火牆
#查看防火牆狀態 service iptables status #關閉防火牆 service iptables stop #查看防火牆開機啓動狀態 chkconfig iptables --list #關閉防火牆開機啓動 chkconfig iptables off
hadoop 安裝 包目錄結構說明:
bin:Hadoop 最基本的管理腳本和使用腳本的目錄,這些腳本是 sbin 目錄下管理腳本的基礎實現,用戶能夠直接使用這些腳本管理和使用 Hadoop。
etc:Hadoop 配置文件所在的目錄,包括 core-site,xml、hdfs-site.xml、mapred-site.xml 等從 Hadoop1.0 繼承而來的配置文件和 yarn-site.xml 等Hadoop2.0 新增的配置文件。
include:對外提供的編程庫頭文件(具體動態庫和靜態庫在 lib 目錄中),這些頭文件均是用 C++定義的,一般用於 C++程序訪問 HDFS 或者編寫 MapReduce程序。
lib:該目錄包含了 Hadoop 對外提供的編程動態庫和靜態庫,與 include 目錄中的頭文件結合使用。
libexec:各個服務對用的 shell 配置文件所在的目錄,可用於配置日誌輸出、啓動參數(好比 JVM 參數)等基本信息。
sbin:Hadoop 管理腳本所在的目錄,主要包含 HDFS 和 YARN 中各種服務的啓動/關閉腳本。
share:Hadoop 各個模塊編譯後的 jar 包所在的目錄。
hadoop配置文件修改
Hadoop 安裝主要就是配置文件的修改,通常在主節點進行修改,完畢後 scp下發給其餘各個從節點機器。
第一個:hadoop-env.sh
文件中設置的是 Hadoop 運行時須要的環境變量。JAVA_HOME是必須設置的,即便咱們當前的系統中設置了 JAVA_HOME,它也是不認識的,由於 Hadoop 即便是在本機上執行,它也是把當前的執行環境當成遠程服務器。
vi hadoop-env.sh
export JAVA_HOME=/export/servers/jdk1.8
第二個:core-site.xml
hadoop 的核心配置文件,有默認的配置項 core-default.xml。core-default.xml 與 core-site.xml 的功能是同樣的,若是在 core-site.xml 裏沒有配置的屬性,則會自動會獲取 core-default.xml 裏的相同屬性的值。
<!-- 指定HADOOP所使用的文件系統schema(URI),HDFS的老大(NameNode)的地址 --> <property> <name>fs.defaultFS</name> <value>hdfs://mini4:9000</value> </property> <!-- 指定hadoop運行時產生文件的存儲目錄,默認/tmp/hadoop-${user.name} --> <property> <name>hadoop.tmp.dir</name> <value>/export/data/hadoopdata</value> </property>
第三個:hdfs-site.xml
HDFS 的核心配置文件,有默認的配置項 hdfs-default.xml。hdfs-default.xml 與 hdfs-site.xml 的功能是同樣的,若是在 hdfs-site.xml 裏沒有配置的屬性,則會自動會獲取 hdfs-default.xml 裏的相同屬性的值。
<!-- 指定HDFS副本的數量 --> <property> <name>dfs.replication</name> <value>2</value> </property> <property> <name>dfs.namenode.secondary.http-address</name> <value>mini5:50090</value> </property>
第四個:mapred-site.xml
MapReduce 的核心配置文件,有默認的配置項 mapred-default.xml。mapred-default.xml 與 mapred-site.xml 的功能是同樣的,若是在 mapred-site.xml 裏沒有配置的屬性,則會自動會獲取 mapred-default.xml 裏的相同屬性的值。
<!-- 指定mr運行時框架,這裏指定在yarn上,默認是local --> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property>
第五個:yarn-site.xml
YARN 的核心配置文件,有默認的配置項 yarn-default.xml。yarn-default.xml 與 yarn-site.xml 的功能是同樣的,若是在 yarn-site.xml 裏沒有配置的屬性,則會自動會獲取 yarn-default.xml 裏的相同屬性的值。
<!-- 指定YARN的老大(ResourceManager)的地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>mini4</value>
</property>
<!-- NodeManager上運行的附屬服務。需配置成mapreduce_shuffle,纔可運行MapReduce程序默認值:"" -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
第六個:slaves文件,裏面寫上從節點所在的主機名字
vi slaves
mini4
mini5
mini6
將hadoop添加到環境變量
vi /etc/proflie export JAVA_HOME=/export/servers/jdk1.8 export HADOOP_HOME=/export/servers/hadoop-2.7.4 export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin source /etc/profile
格式化namenode(本質是對namenode進行初始化)
hdfs namenode -format (hadoop namenode -format)
啓動hadoop
先啓動HDFS
sbin/start-dfs.sh
再啓動YARN
sbin/start-yarn.sh
驗證是否啓動成功
使用jps命令驗證
27408 NameNode
28218 Jps
27643 SecondaryNameNode (secondarynamenode)
28066 NodeManager
27803 ResourceManager
27512 DataNode
http://192.168.75.14:50070 (HDFS管理界面) http://192.168.75.14:8088 (MR管理界面)