Hadoop 入門實踐
來自: http://blog.rainy.im/2016/03/05/hadoop-101/
Hadoop 2.0 架構
Hadoop 包括如下幾個模塊:
- Hadoop Common:公共基礎組件;
- Hadoop Distributed File System(HDFS):分布式文件系統;
- Hadoop YARN:任務和資源管理框架;
- Hadoop MapReduce:基于YARN的并行數據處理系統;
- 其它基于Hadoop的項目(包括Pig,Hive,Spark等)。
圖片來源: Icons and Stencils for Hadoop
了解基本架構之后先在本地安裝一下最新版本的 Hadoop,我安裝在阿里云服務器:
Ubuntu 14.04.3 LTS
Hadoop 單節點安裝
依賴
- Java 1.5.X
- ssh
wget http://javadl.oracle.com/webapps/download/AutoDL?BundleId=116021
mv AutoDL\?BundleId=116021 jre-7u7-linux-x64.tar.gz
tar zxvf jre-7u7-linux-x64.tar.gzsudo mkdir -p /usr/java
sudo cp -r jre1.8.0_73/* /usr/java/export JAVA_PATH=/usr/java </pre>
下載 Hadoop
wget http://mirror.bit.edu.cn/apache/hadoop/common/hadoop-2.6.4/hadoop-2.6.4.tar.gz
tar zxvf hadoop-2.6.4.tar.gz
cd hadoop-2.6.4export HADOOP_INSTALL=/path/to/hadoop-2.6.4
export PATH=$PATH:$HADOOP_INSTALL/bin:$HADOOP_INSTALL/sbin </pre>三種集群模式
Hadoop 共有三種模式,運行前需要先了解它們的差別:
- 單機(本地)模式
- 偽分布式模式
- 完全分布式模式
單機模式只是運行一次 MapReduce 程序,不生成 daemon,適合調試程序;偽分布式模式 daemon 運行在本地,只是模擬集群;完全分布式的 daemon 運行在多個機器上。
文章開始介紹的 Hadoop 架構中提到兩個主要模塊:HDFS 和 YAEN,運行 Hadoop 前需要分別對其進行配置,在配置之前需要先了解一下它們分別是什么。
HDFS & YARN 配置
HDFS
HDFS 是基于 Google File System(GFS) 的一種實現,由 Java 實現的一種分布式、可擴展、可移植的文件系統。HDFS 由兩部分組成:
- NameNode:主機(master machine),用于管理所有集群數據的元數據;
- DataNode:HDFS 中真正用于保存數據的部分,通常包含多個DN;
除此之外,在多節點集群模式下,還配備一個 Secondary NameNode,用于生成主機數據操作的緩存鏡像,結構如下圖所示:
![]()
*圖片來源:見參考1*
選擇偽分布式模式,我們先配置啟動 HDFS。由于需要用到 ssh ,先對本機設置 ssh 無密碼登錄模式:
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys ssh localhost創建新的配置目錄:
mkdir init_config cp $HADOOP_INSTALL/etc/hadoop/\*.xml init_config/編輯 init\_config/core-site.xml 和 init\_config/hdfs-site.xml :
<!-- core-site.xml --> <configuration> <property> <name>fs.default.name</name> <value>hdfs://localhost:9000</value> </property> </configuration> <!-- hdfs-site.xml --> <configuration> <property> <name>dfs.replication</name> <value>1</value> </property> </configuration>格式化HDFS,然后運行啟動腳本:
hadoop namenode -format
start-dfs.sh --config /absolute/path/to/init_config遇到錯誤
localhost: Error: JAVA_HOME is not set and could not be found.
可能與我用 zsh 有關,JAVA_HOME 已設置在 ~/.zshrc
解決方案
cp $HADOOP_INSTALL/etc/hadoop/hadoop-env.sh init_config/
編輯 init_config/hadoop-env.sh
export JAVA_HOME=/usr/java </pre>
啟動之后,可以從通過瀏覽器訪問 http://localhost:50070 :
![]()
YARN
YARN 還是基于 Google MapReduce 的實現,具體 MapReduce 的原理有時間可以研究一下這篇論文。 MapReduce 的基本過程如下:
(input) <k1, v1>->map-><k2, v2>->combine-><k2, v2>->reduce-><k3, v3> (output)map/reduce 的過程對數據進行分塊并行處理,而 Hadoop 提供的 YARN 框架由 JobTracker 和 TaskTracker 兩部分組成,輸入和輸出都是來自/存入 HDFS,YARN 只是負責調度和監控,其架構如下圖所示:
*圖片來源:見參考1*
要啟動 YARN 同樣需要配置 init\_config/yarn-site.xml :
<!-- yarn-site.xml --> <configuration> <property> <name>yarn.resourcemanager.address</name> <value>localhost:8032</value> </property> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce.shuffle</value> </property> </configuration>之后運行:
start-yarn.sh --config /absolute/path/to/init_config若出現 cat: /path/to/init_config/slaves: No such file or directory
則需要從 $HADOOP_INSTALL/etc/hadoop/ 中 copy 過來。</pre>
啟動成功之后同樣可以通過 http://localhost:8088 訪問 Web 管理界面:
![]()
總結
到此為止已經完成了 Hadoop 單機節點下的偽分布式模式的啟動,接下來需要分別學習:
- HDFS 的一些指令操作以及 Web 管理界面
- MapReduce 原理
- 基于 Python 的 MapReduce 數據操作以及 YARN 的 Web 管理界面
Hadoop 負責數據的存儲于基本處理,HDFS 與 MapReduce 分別實現 數據存儲 于 處理過程 的分布式并行加工。有了數據基礎之后,才可以進一步應用到機器學習模型中,或者是實現更加高效的查詢或計算,這就需要后續更多基于 Hadoop 之上的應用,例如 Pig/Hive/Spark。