一. 什么是hadoop
hadoop是一個具有分布式存儲和分布式計算能力的分布式軟件系統(tǒng)
hadoop基本特點
- 可靠性(數(shù)據(jù)冗余)
- 成本低(把數(shù)據(jù)存儲在普通的計算機上)
- 效率高(把計算分發(fā)到多個節(jié)點)
- 可擴容(根據(jù)需求, 動態(tài)的調(diào)整節(jié)點集群的大小)
二. 解決的問題
- 海量數(shù)據(jù)可靠存儲
- 海量數(shù)據(jù)分析與計算
三. 應(yīng)用場景
- 搜索引擎
- 日志分類和檢索
- 數(shù)據(jù)報表(一般是內(nèi)網(wǎng), 不需要公網(wǎng)訪問)
四. NFS
NFS即網(wǎng)絡(luò)文件系統(tǒng), 多臺主機共享服務(wù)器中的數(shù)據(jù)
但是這種文件系統(tǒng)存在一些缺陷
- 缺少數(shù)據(jù)冗余
- 數(shù)據(jù)集中, 無法進行分布式計算
五. 系統(tǒng)架構(gòu)
主要分為三部分
- 海量數(shù)據(jù)存儲: hdfs
- 海量數(shù)據(jù)分析: mapreduce
- 資源調(diào)度: yarn
5.1 HDFS
HDFS是一個可靠的有容錯機制的分布式文件系統(tǒng)
- HDFS系統(tǒng)由一個命名節(jié)點(nameNode)和多個數(shù)據(jù)節(jié)點(dataDode)構(gòu)成
- 寫數(shù)據(jù)可以在dataNode中直接寫, 也可以先通過nameNode再隨機選一個dataNode
- 讀取數(shù)據(jù)的時候, 通過nameNode查詢映射關(guān)系,再查詢指定的數(shù)據(jù)節(jié)點
- 支持構(gòu)造一個偽分布式系統(tǒng), 在一臺機器上運行多個數(shù)據(jù)節(jié)點
- nameNode響應(yīng)用戶請求,執(zhí)行mkdir put get list等文件管理操作
5.1.1 數(shù)據(jù)分塊
一個文件被分為多個數(shù)據(jù)塊, 數(shù)據(jù)塊的大小可配置, 除了最后一個數(shù)據(jù)塊以外, 其他的數(shù)據(jù)塊大小一樣, 默認128M
5.1.2 副本選擇
5.1.2.1 數(shù)據(jù)塊寫
每個數(shù)據(jù)塊的冗余副本數(shù)可配置
首先了解下rack的概念, rack, 機架, 通過配置將一個區(qū)域的機器放到一個機架中, 通常一個機架內(nèi)部節(jié)點之間的通信速度較快
(簡單理解為一個機房即可)
副本選擇算法如下:
- 數(shù)據(jù)塊插入的節(jié)點存儲數(shù)據(jù)塊的第一副本(如果是通過nameNode插入, 那么隨機選一個數(shù)據(jù)節(jié)點存儲數(shù)據(jù)塊的第一副本)
- 選擇其他的rack(機架), 將第二和第三副本寫入這個rack(機架)的兩個不同的數(shù)據(jù)節(jié)點
- 如果副本數(shù)配置大于3, 則剩余的副本隨機分不到不同的dataNode節(jié)點
這種策略既保證了數(shù)據(jù)的可靠性, 又一定程度上提高了性能
示例:
該架構(gòu)中,存在1個hadoop集群, 3個機架(rack), 一個nameNode, 8個dataNode分布在3個機架上
以下是寫請求的全過程:
首先客戶端對文件進行切分
- 客戶端向nameNode發(fā)起寫請求
- nameNode創(chuàng)建文件名稱, 返回需要插入的節(jié)點列表信息
- 客戶端向host2寫入block1
3.1. host2數(shù)據(jù)寫成功后向客戶端返回響應(yīng)信息
3.1.1. 客戶端通知nameNode,block1數(shù)據(jù)寫入host2成功
3.2. host2數(shù)據(jù)寫成功后, host2向rack2(集群中其他的隨機rack)中的host1寫入block1
3.2.1. host1數(shù)據(jù)寫成功后, 向nameNode同步信息
3.2.2. host1數(shù)據(jù)寫成功后, host1向rack2(2號副本和3號副本寫入的rack是相同的)中的host3寫入block1
3.2.2.1. host3數(shù)據(jù)寫入成功后, 向nameNode同步信息
3.3. host2數(shù)據(jù)寫成功后,向nameNode同步信息 - 客戶端向host7寫入block2
4.1. host7數(shù)據(jù)寫成功后向客戶端返回響應(yīng)信息
4.1.1. 客戶端通知nameNode,block2數(shù)據(jù)寫入host7成功
4.2. host7數(shù)據(jù)寫成功后, host7向rack3(集群中其他的隨機rack)中的host8寫入block2
4.2.1. host8數(shù)據(jù)寫成功后, 向nameNode同步信息
4.2.2. host8數(shù)據(jù)寫成功后, host8向rack3(2號副本和3號副本寫入的rack是相同的)中的host4寫入block2
4.2.2.1. host4數(shù)據(jù)寫入成功后, 向nameNode同步信息
4.3. host2數(shù)據(jù)寫成功后,向nameNode同步信息 - 文件寫入完成
注:
- 3.1和3.2和3.3并行執(zhí)行
- 4.1和4.2和4.3并行執(zhí)行
- 3.2.1和3.2.2并行執(zhí)行
- 4.2.1和4.2.2并行執(zhí)行
在hadoop支持存儲類型和存儲策略之后, 保存文件的時候可以指定存儲策略, 只有支持對應(yīng)的存儲類型的數(shù)據(jù)節(jié)點上才可以
保存這種數(shù)據(jù), 如果支持這種存儲策略的節(jié)點不足(少于副本數(shù)配置),則執(zhí)行備選方案
5.1.2.2 數(shù)據(jù)庫讀
讀取數(shù)據(jù)的時候優(yōu)先選擇離用戶最近的rack(機架)
5.2 MapReduce
主要用于分布式數(shù)據(jù)計算, 可以使用上次分享的spark來替代
5.3 Yarn
主要用于資源調(diào)度, 2.x版本引入, 是hadoop重要組件
hadoop1.0和2.0的區(qū)別
yarn在hadoop中的角色
yarn運行過程
- resourceManager: 資源管理器, 全局只有一個
- nodeManager: 節(jié)點管理器, 每個節(jié)點對應(yīng)一個,向resourceManager同步節(jié)點信息(CPU內(nèi)存等等)
- application master: 應(yīng)用管理器,負責處理節(jié)點內(nèi)部的任務(wù)的分配
- container: 資源的抽象, application master負責分配自己所在節(jié)點的資源給某個task(任務(wù)),這組資源就被抽象為container
客戶端提交任務(wù)到resourceManager, 然后resourceManager進行資源分配
數(shù)據(jù)節(jié)點之間使用RPC通信,比如Container處理后的數(shù)據(jù)傳遞給其他節(jié)點的application master
六. 安裝
- 安裝JDK1.8
- 安裝hadoop3.1.2
七. 配置
單機偽分布式
1.配置環(huán)境變量~/.bashrc
export JAVA_HOME=/root/jdk1.8.0_121
export PATH=$PATH:$JAVA_HOME/bin
export HADOOP_HOME=/root/hadoop-3.1.2
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
- 配置hadoop-env.sh
export JAVA_HOME=/root/jdk1.8.0_121
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"
- 配置core-site.xml
<configuration>
<!-- 指定hdfs的nameservice -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://server1:9000</value>
</property>
<property>
<name>io.file.buffer.size</name>
<value>131072</value>
</property>
</configuration>
- 配置mapred-site.xml
<configuration>
<!-- Configurations for MapReduce Applications: -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!-- 以下是143內(nèi)存錯誤需要加的參數(shù)-->
<property>
<name>mapreduce.map.memory.mb</name>
<value>1500</value>
<description>每個Map任務(wù)的物理內(nèi)存限制</description>
</property>
<property>
<name>mapreduce.reduce.memory.mb</name>
<value>3000</value>
<description>每個Reduce任務(wù)的物理內(nèi)存限制</description>
</property>
<property>
<name>mapreduce.map.java.opts</name>
<value>-Xmx1200m</value>
</property>
<property>
<name>mapreduce.reduce.java.opts</name>
<value>-Xmx2600m</value>
</property>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
- 配置workers
server1 # 本機
- 配置yarn-site.xml
<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>server1</value>
</property>
<!-- 配置外網(wǎng)只需要替換外網(wǎng)ip為真實ip,否則默認為 localhost:8088 -->
<!-- <property>
<name>yarn.resourcemanager.webapp.address</name>
<value>外網(wǎng)ip:8088</value>
</property> -->
<!-- Configurations for NodeManager: -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
<property>
<!--執(zhí)行mapreduce任務(wù)時候類不存在錯誤,需要導(dǎo)入以下類庫; 執(zhí)行hadoop classpath命令獲取-->
<property>
<name>yarn.application.classpath</name>
<value>/root/hadoop-3.1.2/etc/hadoop:/root/hadoop-3.1.2/share/hadoop/common/lib/*:/root/hadoop-3.1.2/share/hadoop/common/*:/root/hadoop-3.1.2/share/hadoop/hdfs:/root/hadoop-3.1.2/share/hadoop/hdfs/lib/*:/root/hadoop-3.1.2/share/hadoop/hdfs/*:/root/hadoop-3.1.2/share/hadoop/mapreduce/lib/*:/root/hadoop-3.1.2/share/hadoop/mapreduce/*:/root/hadoop-3.1.2/share/hadoop/yarn:/root/hadoop-3.1.2/share/hadoop/yarn/lib/*:/root/hadoop-3.1.2/share/hadoop/yarn/*</value>
</property>
<!-- 以下是143內(nèi)存錯誤需要加的參數(shù)-->
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>22528</value>
<discription>每個節(jié)點可用內(nèi)存,單位MB</discription>
</property>
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>1500</value>
<discription>單個任務(wù)可申請最少內(nèi)存混移,默認1024MB</discription>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>16384</value>
<discription>單個任務(wù)可申請最大內(nèi)存溅潜,默認8192MB</discription>
</property>
</configuration>
- 配置hdfs-site.xml
<configuration>
<!-- Configurations for NameNode: -->
<property>
<name>dfs.namenode.name.dir</name>
<value>/var/lib/hadoop/hdfs/name/</value>
</property>
<property>
<name>dfs.blocksize</name>
<value>268435456</value>
</property>
<property>
<name>dfs.namenode.handler.count</name>
<value>100</value>
</property>
<!-- Configurations for DataNode: -->
<property>
<name>dfs.datanode.data.dir</name>
<value>/var/lib/hadoop/hdfs/data/</value>
</property>
<!--副本數(shù)配置, 不可以大于集群中的節(jié)點總數(shù)-->
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.http.address</name>
<value>server1:50070</value>
</property>
</configuration>
八. 啟動
start-dfs.sh
start-yarn.sh
兩個網(wǎng)站被啟動
server1:50070 文件查看
server:8088 節(jié)點狀態(tài)查看
九. 基本操作
hadoop fs -mkdir /testdir
hadoop fs -put /root/xxx /testdir
hadoop fs -get xxx xxx
hadoop fs -ls /
# 計算圓周率
hadoop jar hadoop-mapreduce-examples-3.1.2.jar pi 5 5
# word count
hadoop jar hadoop-mapreduce-examples-3.1.2.jar wordcount /wordcount/input /wordcount/output
十. 文件目錄
- 啟動命令執(zhí)行目錄: /hadoop-3.1.2/sbin
- 配置文件目錄: /hadoop-3.1.2/etc/hadoop
- mapreduce example所在目錄: /hadoop-3.1.2/share/hadoop/yarn
十一. 探討
- 數(shù)據(jù)分塊后, 數(shù)據(jù)就不完整了, 各個節(jié)點是否可以處理各自的數(shù)據(jù)塊? 比如一個很大的文本文件
答: mapreduce進行文件split操作后, 除了第一個split塊, 其他的split塊自動跳過第一行, 該行數(shù)據(jù)不作處理
參考: https://wiki.jikexueyuan.com/project/hadoop/read-data.html - 為啥不把整個文件多所有數(shù)據(jù)塊寫入同一個rack?
答: 因為寫入多個rack, 讀取的時候從不同的rack獲取數(shù)據(jù), 可以提高讀取數(shù)據(jù)的速度, 不會因為單個rack的帶寬瓶頸
而降低IO性能
參考: https://blog.csdn.net/u010670689/article/details/82715181
參考
安裝教程
https://blog.csdn.net/dream_an/article/details/80258283
hdfs 架構(gòu)
http://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html
hdfs rack只看一張圖
https://blog.51cto.com/zengzhaozheng/1347777
hadoop生態(tài)-圖片好
https://www.cnblogs.com/zhangwuji/p/7594725.html
yarn 架構(gòu)
https://www.cnblogs.com/wcwen1990/p/6737985.html