大數據入門第五天——離線計算之hadoop(上)概述與集群安裝


一、概述

  根據之前的凡技術必登其官網的原則,我們當然先得找到它的官網:http://hadoop.apache.org/

  1.什么是hadoop

    先看官網介紹:

  The Apache™ Hadoop® project develops open-source software for reliable, scalable, distributed computing.

  The Apache Hadoop software library is a framework that allows for the distributed processing of large data sets across clusters of computers using simple programming models. It is designed to scale up from single servers to thousands of machines, each offering local computation and storage. Rather than rely on hardware to deliver high-availability, the library itself is designed to detect and handle failures at the application layer, so delivering a highly-available service on top of a cluster of computers, each of which may be prone to failures

    中文解釋:

  1. HADOOPapache旗下的一套開源軟件平台——使用Java開發
  2. HADOOP提供的功能:利用服務器集群,根據用戶的自定義業務邏輯,對海量數據進行分布式處理
  3. HADOOP的核心組件有
    1. HDFS(分布式文件系統)
    2. YARN(運算資源調度系統)
    3. MAPREDUCE(分布式運算編程框架)
  4. 廣義上來說,HADOOP通常是指一個更廣泛的概念——HADOOP生態圈

  W3C相關概述https://www.w3cschool.cn/hadoop/hadoop-3rpe22xm.html

  推薦閱讀:《hadoop權威指南》

    hadoop的定位:

  1. 現階段,雲計算的兩大底層支撐技術虛擬化”和“大數據技術

   2.而HADOOP則是雲計算的PaaS層的解決方案之一,並不等同於PaaS,更不等同於雲計算本身

  關於上面提到的PaaS的的概念,參考網友十分鍾看懂雲計算概念!

  這里重點應該注意雲計算的本質——社會分工!

   1.5.HADOOP版本變遷史

    2.0版本新增yarn模塊!

    混亂的hadoop版本變遷史:

    https://www.cnblogs.com/meet/p/5435979.html

    圖解:http://blog.csdn.net/matthewei6/article/details/50499343

    商業發行版本CDH:

    http://blog.csdn.net/duyuanhai/article/details/54908298

  2.hadoop核心組件

  • Hadoop Common: The common utilities that support the other Hadoop modules.
  • Hadoop Distributed File System (HDFS™): A distributed file system that provides high-throughput access to application data.
  • Hadoop YARN: A framework for job scheduling and cluster resource management.
  • Hadoop MapReduce: A YARN-based system for parallel processing of large data sets.

  翻譯過來就是:分布式文件系統、分布式資源管理、分布式運算程序開發框架

  當然,這只是狹義的hadoop,而廣義的hadoop則是hadoop生態圈:

  

 

  

HDFS:分布式文件系統 MAPREDUCE:分布式運算程序開發框架 HIVE:基於大數據技術(文件系統+運算框架)的SQL數據倉庫工具 HBASE:基於HADOOP的分布式海量數據庫 ZOOKEEPER:分布式協調服務基礎組件 Mahout:基於mapreduce/spark/flink等分布式運算框架的機器學習算法庫 Oozie:工作流調度框架 Sqoop:數據導入導出工具 Flume:日志數據采集框架

  3.離線數據處理流程

  

1)數據采集:定制開發采集程序,或使用開源框架FLUME 2)數據預處理:定制開發mapreduce程序運行於hadoop集群 3)數據倉庫技術:基於hadoop之上的Hive 4)數據導出:基於hadoop的sqoop數據導入導出工具 5)數據可視化:定制開發web程序或使用kettle等產品 6)整個過程的流程調度:hadoop生態圈中的oozie工具或其他類似開源產品

    大致架構如下:

    

 二、hadoop集群安裝

  主要包含兩個集群:HDFS集群、YARN集群,兩者經常是邏輯上分離,物理上一起的。

  角色分配: 

    HDFS集群:

      負責海量數據的存儲,集群中的角色主要有 NameNode / DataNode

    YARN集群:

      負責海量數據運算時的資源調度,集群中的角色主要有 ResourceManager /NodeManager

     相關的角色介紹,將會在HDFS詳解/YARN詳解篇等

     更多角色介紹,參考http://blog.csdn.net/gamer_gyt/article/details/51758881

    1.環境准備

    之前環境(如JDK等)的搭建,參考前面隨筆。

    虛擬機:VM搭建的3台虛擬機(安裝一台,克隆2台)

    網絡:NAT搭建的網絡(IP配置等請參考前文,這里配置為:192.168.137.128/138/148)

    (以上在zookeeper環節已經搭建完成)

    

     這里使用的是官方的hadoop的原始版本,還有個稱之為hadoop商業版本的CDH:https://www.cloudera.com/,這里由於是初次學習,我們安裝初始版本的hadoop(通過組件也可以實現類似CDH的功能),CDH將會在后續進行補充!

    2.服務器系統設置

    1.添加HADOOP用戶

      具體的用戶管理,參考linux用戶管理篇隨筆:http://www.cnblogs.com/jiangbei/p/7902663.html

useradd hadoop
passwd hadoop #設置密碼為hadoop

    2.為HADOOP用戶分配sudo權限

visudo
#在98行左右添加
hadoop    ALL=(ALL)       ALL

    // 打開連接,修改用戶為hadoop,可以通過sudo hostname測試!

     使用root用戶,關閉防火牆!

    3.下載hadoop

      所有的aapche的軟件都可以到archive的歸檔中心下載:http://archive.apache.org/dist/

       當然,通過hadoop的官網找到下載也是OK的:http://hadoop.apache.org/releases.html

      此處選擇2.6.4的版本,下載hadoop-2.6.4.tar.gz即可!

    4.安裝hadoop

      下載完成后選擇一台機器,通過rz進行上傳請使用ftp!

      解壓:當然解壓目錄隨個人意願,你可以解壓到例如自建目錄/apps下進行統一管理

#在hadoop自己的家目錄下進行目錄創建,方便統一管理 mkdir apps #再解壓 tar -zxvf hadoop-2.6.4.tar.gz -C apps/

       解壓后目錄及分析如下:

      

bin:Hadoop最基本的管理腳本和使用腳本所在目錄,這些腳本是sbin目錄下管理腳本的基礎實現,用戶可以直接使用這些腳本管理和使用hadoop etc:Hadoop配置文件所在目錄,包括core-site.xml, hdfs-site.xml, mapred-site.xml等從hadoop1.0繼承而來的配置文件和yarn-site.xml等hadoop 2.0新增的配置文件 include:對外提供的編程庫頭文件(具體動態庫和靜態庫在lib目錄中),這些頭文件均是用c++定義的,通常用於c++程序訪問hdfs或者編寫mapreduce程序 lib:該目錄包含了Hadoop對外提供的的編程動態庫和靜態庫,與include目錄中的頭文件結合使用。 libexec:各個服務對應的shell配置文件所在目錄,可用於配置日志輸出目錄,啟動參數(比如JVM參數)等基本信息。 sbin:Hadoop管理腳本所在目錄,主要包含HDFS和YARN中各類服務的啟動/關閉腳本 share:Hadoop各個模塊編譯后的jar包所在目錄

    5.配置hadoop

      進入hadoop的配置文件目錄:

[hadoop@localhost hadoop-2.6.4]$ cd etc/hadoop/ [hadoop@localhost hadoop]$ ls capacity-scheduler.xml      kms-env.sh configuration.xsl kms-log4j.properties container-executor.cfg      kms-site.xml core-site.xml log4j.properties hadoop-env.cmd              mapred-env.cmd hadoop-env.sh               mapred-env.sh hadoop-metrics2.properties  mapred-queues.xml.template hadoop-metrics.properties   mapred-site.xml.template hadoop-policy.xml slaves hdfs-site.xml               ssl-client.xml.example httpfs-env.sh               ssl-server.xml.example httpfs-log4j.properties     yarn-env.cmd httpfs-signature.secret     yarn-env.sh httpfs-site.xml             yarn-site.xml kms-acls.xml

     先配置hadoop-env.sh(hadoop環境)

    找到JAVA_HOME路徑:

[hadoop@localhost hadoop]$ echo $JAVA_HOME /opt/java/jdk1.8.0_151
[hadoop@localhost hadoop]$ vim hadoop-env.sh 

    看到大概25行的JAVA_HOME的配置,由於之前有提到過,如果直接遠程通過ssh的方式操作,由於是以一個bash的方式過去的,所以不會執行/etc/profile,也就導致了無法正確讀取JAVA_HOME,我們直接改為獲取到的JAVA_HOME的絕對路徑即可!

    

    接下來就是hadoop自己的配置,也就是圖中的site配置文件:

    

    配置core-site.xml

[hadoop@localhost hadoop]$ vim core-site.xml 

    這里我們可以先去hadoop官網的Documentation下找到這幾個參考的默認配置信息:

    

    //打開以后是可以通過經典的ctrl+F進行查找的

     最簡化的配置如下:(置於根標簽下即可)

<!-- 指定HADOOP所使用的文件系統schema(URI),HDFS的老大(NameNode)的地址 -->
        <property>
            <name>fs.defaultFS</name>
            <value>hdfs://mini1:9000</value>
        </property>
        <!-- 指定hadoop運行時產生文件的存儲目錄 -->
        <property>
            <name>hadoop.tmp.dir</name>
            <value>/home/hadoop/hdpdata</value>
        </property>

    配置hdfs-site.xml

      此項有很多默認配置,是可以不用配的,這里我們還是進行簡單的配置演示:

[hadoop@localhost hadoop]$ vim hdfs-site.xml 
<!-- 指定HDFS副本的數量(默認3) -->
        <property>
            <name>dfs.replication</name>
            <value>2</value>
        </property>

    配置mapred-site.xml.template(先更名)

[hadoop@localhost hadoop]$ mv mapred-site.xml.template mapred-site.xml
[hadoop@localhost hadoop]$ vim mapred-site.xml 
<!-- 指定mr運行在yarn上 -->
        <property>
            <name>mapreduce.framework.name</name>
            <value>yarn</value>
        </property>

     配置yarn-site.xml

[hadoop@localhost hadoop]$ vim yarn-site.xml 
<!-- 指定YARN的老大(ResourceManager)的地址 -->
        <property>
            <name>yarn.resourcemanager.hostname</name>
            <value>mini1</value>
        </property>
        <!-- reducer獲取數據的方式 -->
        <property>
            <name>yarn.nodemanager.aux-services</name>
            <value>mapreduce_shuffle</value>
        </property>

   以上是最簡化配置,常見重要配置,參考https://www.cnblogs.com/yinghun/p/6230436.html

     6.分發配置到其他機器

      通過遠程拷貝文件命令:scp進行!

[hadoop@localhost hadoop]$ cd [hadoop@localhost ~]$ scp -r apps/ mini2:/home/hadoop/

  //另一個同理,當然,我們這里是應該進行主機名和ip地址映射的,這里參考基礎系統設置篇!

     7.配置HADOOP環境變量

[hadoop@localhost hadoop]$ sudo vim /etc/profile

  加上最后兩行:

export JAVA_HOME=/opt/java/jdk1.8.0_151 export PATH=$PATH:$JAVA_HOME/bin export ZOOKEEPER_HOME=/opt/zookeeper/zookeeper-3.4.5 export PATH=$PATH:$ZOOKEEPER_HOME/bin export HADOOP_HOME=/home/hadoop/apps/hadoop-2.6.4 export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

    分發配置到其它服務器(后續將會配置hostname和hosts,這樣就可以使用主機名了!,當然,更好的解決方式是自己編寫一個自動化的腳本!)

sudo scp /etc/profile mini2:/etc/
sudo scp /etc/profile mini3:/etc/

    再source一下就可以了!

source /etc/profile

    8.格式化HDFS(namenode)

      與我們熟悉的文件系統一樣,HDFS也需要格式化一下才可以使用!

hadoop namenode -format

    9,啟動

    進入hadoop的sbin目錄:

[hadoop@localhost sbin]$ hadoop-daemon.sh start namenode

    //驗證方式是使用jps進行查看(注:jps為查看所有java程序)

     當然,由於內置了jeety,可以通過網頁訪問:

http://mini1:50070

    // 端口50070,IP可以換成主機名(需要關閉防火牆或者配置端口可以通過防火牆),yarn的端口為8088!

  再在另外的機器上啟動一個datanode

[hadoop@localhost ~]$ hadoop-daemon.sh start datanode

  此時再次刷新網頁就可以看到有變化了!(瀏覽器有緩存請刷新緩存!)

  原理就是每台機器都配置了namenode,這樣每次啟動都能找到namenode正確握手!

    10.一鍵啟動腳本

      之前已經有zk的一鍵啟動腳本的經驗了,這里直接借鑒即可!

      這里不需要重新編寫了,因為sbin目錄下已經存在了start-dfs.sh等腳本了!我們只需要修改etc/hadoop下的slaves即可指定小弟了!

[hadoop@localhost hadoop]$ vim slaves 

  //可以改為主機名!

    11.配置免密登錄(hadoop用戶下!)

      這里我們配置128到138/148的

[hadoop@localhost hadoop]$ ssh-keygen 

  //按3次enter即可

[hadoop@localhost hadoop]$ ssh-copy-id mini1 [hadoop@localhost hadoop]$ ssh-copy-id mini2 [hadoop@localhost hadoop]$ ssh-copy-id mini3

  //配置3台(包括自己!)

  如果配置出現什么意外導致失敗,可以直接刪除各個用戶家目錄下的.ssh/目錄,重新配置!

  更多ssh-copy-id實現免密登錄,參考http://blog.csdn.net/alifrank/article/details/48241699

   啟動:

    start-all已經過時了,請使用start-dfs.sh和start-yarn.sh進行啟動!配置了path則無需路徑!

sbin/start-dfs.sh sbin/start-yarn.sh

 三、問題小結

  1.datanode無法啟動:

     在salve上無法通過jps看到datanode

     http://www.linuxidc.com/Linux/2015-01/111891.htm

   2.日志文件

    注意查看日志輸出(位於安裝目錄的logs文件夾下)

    如果查看日志發現一些問題(例如datanode無法識別),可以刪除工作目錄(hdpdata目錄),再重新運行hadoop-daemon.sh start datanode重試!

  3.踩坑實錄

    之前的配置都成功,可是一直出現通過start-dfs.sh可以正常啟動3個機器,jps也都能看到進程;可是進入namenode頁面卻發現live nodes中活着的節點為0,百思不得其解。各種百度尋解未果。后面在群里詢問,慢慢去看重日志的輸出,通過尋找日志的位置:

/home/hadoop/apps/hadoop-2.6.4/logs

    通過日志的查看:

tail -100 hadoop-hadoop-datanode-mini3.log 

    看重點的because處,指出131解析失敗:

    

    可是我的靜態IP分別是192.168.137.128/138/148,這里居然來個131,於是通過ip addr(centos7)查看:

    

    發現mini2多了一個130,分別查看3台機器,發現多了3個靜態IP,分別是129/130/131,看來是靜態IP沒配置好,選擇不整IP的問題,通過hosts文件來,讓它認識這3個多的動態IP,於是,修改3台機器的/etc/hosts如下:

    

    這樣,就順利解析了!

     所以說,遇到報錯查看日志非常重要,比病急亂投醫要高效的多!

    //這里通過網友的方法還是沒能解決動態IP的問題!點擊查看

  4.集群的時間同步

    兩種方案:http://blog.csdn.net/xuejingfu1/article/details/52274143

  比較簡單是使用date命令:sudo date -s 09:37:00

  5.其他問題

2/初始化工作目錄結構
hdfs namenode -format 只是初始化了namenode的工作目錄
而datanode的工作目錄是在datanode啟動后自己初始化的

3/datanode不被namenode識別的問題
namenode在format初始化的時候會形成兩個標識:
blockPoolId:
clusterId:

新的datanode加入時,會獲取這兩個標識作為自己工作目錄中的標識

一旦namenode重新format后,namenode的身份標識已變,而datanode如果依然
持有原來的id,就不會被namenode識別
namenode不識別
5/關於副本數量的問題
副本數由客戶端的參數dfs.replication決定(優先級: conf.set >  自定義配置文件 > jar包中的hdfs-default.xml)
副本數量

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM