在前一章已經學習了Hadoop的基本結構,本章內容包括Hadoop的安裝以及Hello World。
安裝
博主電腦環境是Ubuntu 16.04 LTS
下載
首先,從Hadoop官網下載https://hadoop.apache.org/releases.html
然後使用tar -vxzf xxx.tar.gz
到目標軟件目錄
配置及使用
Hadoop根據不同使用情況提供了三種運行模式
- 單機模式(Local (Standalone) Mode),這種模式無需配置,這種方式,Hadoop被認爲是一個單獨的Java進程
- 僞分佈式(Pseudo-Distributed Mode),這種模式的Hadoop看作只有一個節點的集羣,這個節點既是Master,也是Slave
- 完全分佈式(Fully-Distributed Mode),這種則是正常生產集羣下使用模式
博主主要以第二種,即僞分佈式方式來進行安裝及使用。
配置
- Hadoop是Java語言實現,所以需要有Java環境,這裏不細說了,需要在
etc/hadoop/hadoop-env
中加入export JAVA_HOME=/usr/java/latest
聲明JAVA_HOME位置 - 在
etc/hadoop/core-site.xml:
中加入:
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
- 在
etc/hadoop/hdfs-site.xml:
中加入
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
- 檢測本機是否裝有
ssh
,使用ssh localhost
試下,記得電腦名字得爲localhost,博主屬於愛折騰類型,把名字改了(唔臉)
ssh localhost
如果沒有ssh
,則需要使用sudo apt-get install ssh
接着使用ssh來生成密鑰:
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 0600 ~/.ssh/authorized_keys
- 初始化namenode,即格式化文件系統HDFS
bin/hdfs namenode -format
- 接着啓動應用,博主選擇啓動所有相關進程:
./start-all.sh
坑
當然過程也不是一番風順的,這裏博主分享幾個在安裝時候的坑,以免大家繼續踩。
- 主機名字問題,博主曾經把名字改爲了mosquito,而Hadoop回去啓動localhost,所以會報錯,這裏解決方法需要在
/etc/hosts
和/etc/hostname
中將名字改回來 - 關於ssh驗證問題,樓主是按照上面三步生成似鑰以及公鑰,但是進去時候報了認證失敗的錯誤:
localhost: Permission denied (publickey,password).
後來發現還需要運行ssh-add
命令,將密鑰加入到agent節點 - 還有個問題,有不少人用Idea 來做編輯器,並且好多盜版,激活Idea時候,可能會更改0.0.0.0的映射地址,就會出現以下問題:
Stopping namenodes on [localhost]
Stopping datanodes
Stopping secondary namenodes [account.jetbrains.com]
Stopping nodemanagers
Stopping resourcemanager
此時,可以註釋host中的account.jetbrains.com,或者在hdfs-site.xml
添加
<property>
<name>dfs.secondary.http.address</name>
<value>127.0.0.1:50090</value>
</property>
因爲不寫的話默認是0.0.0.0:50090,改爲127.0.0.1就可以
- 最後訪問
http://localhost:50070
還是不行,後來查資料發現
網址改爲了http://localhost:9870
具體可以看https://issues.apache.org/jira/browse/HDFS-9427
最終界面圖:
MapReduce
MapReduce計算模型
MapReduce的載體是什麼,在Hadoop中,用於執行MapReduce任務的有兩個角色,一個是JobTracker,另一個是TaskTracker,JobTracker是用於管理和調度工作的,TaskTracker是用於執行工作的,一個Hadoop集羣只有一個JobTracker。
優化
MapReduce計算模型的優化涉及了方方面面內容,但是主要金鐘兩個方面,一個是計算性能的優化,另一個是IO操作方面優化
- 任務調度
- 數據預處理與InpuSplit的大小,MapReduce擅長處理少量的大數據,而在處理大量的小數據時候,MapReduce的性能會遜色很多
- Map和Reduce任務的數量
- Combine函數,Combine函數是用於本地合併數據的函數,在有些情況下,Map函數產生的中間數據是有很多重複的,若將所有這些記錄傳遞給Reduce是很耗時的,所以MapReduce框架運行用戶寫的combine函數用於本地合併,這會大量減少網絡IO操作
- 壓縮,對最終結果進行壓縮
- 自定義comparator,數據比較方面
參考資料:
7. http://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-common/SingleCluster.html#Pseudo-Distributed_Operation
8.
9. https://issues.apache.org/jira/browse/HDFS-9427
10. https://www.codetd.com/article/1560685