Hadoop開發入門與實踐(二)
一、Linux Hadoop環境開發
(一)安裝JDK
1、下載Oracle JDK安裝文件
[root@localhost ~]# wget http://download.oracle.com/otn-pub/java/jdk/8u151-b12/e758a0de34e24606bca991d704f6dcbf/jdk-8u151-linux-x64.tar.gz
2、解壓下載文件
(1)創建Java目錄
[root@localhost ~]# mkdir /usr/java
(2)解壓文件
創建Java目錄:
[root@localhost ~]# mkdir /usr/java
[root@localhost ~]# tar zxvf jdk-8u151-linux-x64.tar.gz -C /usr/java
3、配置環境變量
[root@localhost ~]# vi /etc/profile
在文件結尾添加:
export JAVA_HOME=/usr/java/jdk1.8.0_151
export PATH=
4、驗證測試
[root@localhost ~]# echo $JAVA_HOME
[root@localhost ~]# java –version
(二)Hadoop佈署方式
Hadoo部署模式有:本地模式、僞分佈模式、完全分佈式模式。
區分的依據是 NameNode、DataNode、ResourceManager、NodeManager 等模塊運行在幾個JVM 進程、幾個機器。
模式名稱 | 各模塊佔用的JVM進程數 | 各模塊運行機器數 |
---|---|---|
本地模式 | 1 個 | 1 個 |
僞分佈式模式 | N 個 | 1 個 |
集羣模式 | N 個 | N 個 |
1、Hadoop下載:
[root@localhost ~]# curl -O http://mirror.bit.edu.cn/apache/hadoop/common/hadoop-2.7.4/hadoop-2.7.4.tar.gz
2、解壓文件
(1) 目錄創建hadoop目錄
[root@localhost /]# mkdir /hadoop
(2) 解壓文件:
[root@localhost hadoop]# tar -zxvf hadoop-2.7.4.tar.gz -C /hadoop
3、目錄結構
目錄 | 文件 | 說明 |
---|---|---|
bin | 存放的可執行腳本,所有的用戶都有執行的權限 | |
sbin | start-dfs.sh | 只有超級用戶(superuser)纔有權限執行的腳本 |
start-yarn.sh | 只有超級用戶(superuser)纔有權限執行的腳本 | |
stop-dfs.sh | 只有超級用戶(superuser)纔有權限執行的腳本 | |
stop-yarn.sh | 只有超級用戶(superuser)纔有權限執行的腳本 | |
etc | core-site.xml | 配置文件,common |
hdfs-site.xml | 配置文件, hdfs | |
mapred-site.xml | 配置文件, mapreduce(yarn)的配置信息。 | |
include | C語言接口開發用到的頭文件 | |
lib | 庫文件 | |
share | 存放的是doc文檔和最重要的Hadoop源代碼編譯生成的jar包文件。 | |
libexec | 目錄下存放的是hadoop的配置腳本 | |
logs | 日誌文件 |
(三)獨立模式(standalone或local mode)
本地模式是最簡單的模式,所有模塊都運行與一個JVM 進程中,使用的本地文件系統,而不是HDFS,本地模式主要是用於本地開發過程中的運行調試用。下載hadoop 安裝包後不用任何設置,默認的就是本地模式。
1、運行MapReduce程序測試:
(1)用hadoop自帶的 wordcount 例子來在本地模式下測試跑mapreduce:
創建目錄:data:
準備mapreduce輸入文件wordcount.txt
hello
hbase
spark
storm
sqoop
hadoop
hive
spark
hadoop
world
(2)運行測試
[root@localhost hadoop-2.7.4]#./bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.4.jar wordcount /root/wordcount.txt output
這裏可以看到 job ID 中有 local 字樣,說明是運行在本地模式下的。
本地模式下,mapreduce的輸出是輸出到本地。
[root@localhost hadoop-2.7.4]# ll output
總用量 4
-rw-r–r–. 1 root root 53 12月 12 08:02 part-r-00000
-rw-r–r–. 1 root root 0 12月 12 08:02 _SUCCESS
輸出目錄中有_SUCCESS 文件說明 JOB 運行成功,part-r-00000 是輸出結果文件。
part-r-0000這個文件時存放在hdfs上的,並非本地文件系統。
(3)查看輸出結果:
[root@localhost hadoop-2.7.4]# cat output/*
(四)僞分佈模式
1、修改配置文件:
(1)配置Hadoop環境變量
[root@localhost hadoop-2.7.4]# vi /etc/profile
追加內容:
export HADOOP_HOME=/hadoop/hadoop-2.7.4
export PATH=
(2) 環境驗證:
root@localhost /]# source /etc/profile
[root@localhost hadoop-2.7.4]# echo $HADOOP_HOME
/hadoop/hadoop-2.7.4
(3) 修改hadoop-env.hs中的Java環境變量:
export JAVA_HOME=/usr/java/jdk1.8.0_151
[root@localhost hadoop-2.7.4]# vi etc/hadoop/hadoop-env.sh
(4) 核心配置:core-site.xml
[root@localhost hadoop-2.7.4]# vi ${HADOOP_HOME}/etc/hadoop/core-site.xml
fs.defaultFS:用來指定HDFS的(NameNode)的地址:
Hadoop.tmp.dir:用來指定Hadoop運行時產生文件的存放目錄
比如 HDFS 的 NameNode 數據默認都存放這個目錄下, 查看*-default.xml等默認配置文件,就可以看到很多依賴${hadoop.tmp.dir}的配置。
默認hadoop.tmp.dir 是/tmp/hadoop-${user.name},此時有個問題就是 NameNode 會將 HDFS 的元 數據存儲在這個/tmp目錄下,如果操作系統重啓了,系統會清空/tmp 目錄下的東西,導致 NameNode 元數據丟失,是個非常嚴重的問題,所有我們應該修改這個路徑。
添加:
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoopmaster:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/hadoop/hadoop-2.7.4/tmp</value>
</property>
</configuration>
注意:
一定要修改主機名與之對應。
[root@localhost ~]# vi /etc/hosts
添加:
192.168.191.141 hadoopmaster
(5) 創建臨時目錄:
[root@localhost hadoop-2.7.4]# mkdir tmp
(6) HDFS配置文件:hdfs-site.xml
[root@localhost hadoop-2.7.4]# vi ${HADOOP_HOME}/etc/hadoop/hdfs-site.xml
fs.replicatio:指定hdfs保存數據副本的數量:
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
(7) 格式化 HDFS
[root@localhost hadoop-2.7.4]# ./bin/hdfs namenode -format
格式化是對 HDFS這個分佈式文件系統中的DataNode 進行分塊,統計所有分塊後的初始元數據的存儲在NameNode中。
格式化後,查看core-site.xml 裏 hadoop.tmp.dir指定的目錄下是否有了dfs目錄,如果有,說明格式化成功。
fsimage是NameNode元數據在內存滿了後,持久化保存到的文件。
fsimage*.md5是校驗文件,用於校驗 fsimage 的完整性。
seen_txid是 hadoop 的版本.
[root@localhost hadoop-2.7.4]# cat /hadoop/hadoop-2.7.4/tmp/dfs/name/current/VERSION
vession文件裏保存:
namespaceID:NameNode 的唯一ID。
clusterID:集羣ID,NameNode 和 DataNode的集羣ID應該一致,表明是一個集羣。
(8) mapreduce配置:
在etc/hadoop目錄下:mapred-site.xml
將:mapred-site.xml.template 改爲:mapred-site.xml
[root@localhost hadoop]# cp mapred-site.xml.template mapred-site.xml
指定 mapreduce 運行在 yarn 框架上。
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
(9) Yarn配置yarn-site.xml
[root@localhost hadoop]# vi yarn-site.xml
yarn.nodemanager.aux-services:nodemanager獲取數據的方式是shuffle
yarn:指定yarn的主機服務器地址
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoopmaster</value>
</property>
</configuration>
yarn.nodemanager.aux-services
配置了 yarn 的默認混洗方式,選擇爲 mapreduce 的默認混洗算法。
yarn.resourcemanager.hostname 指定了 Resourcemanager 運行在哪個節點上。
Yarn是一個資源調度系統。
2、hadoop初始化和測試
(1) 初始化文HDFS(格式化文件系統)
查找hadoop臨時目錄命令
[root@localhost hadoop]# which hadoop
/usr/hadoop/hadoop-2.7.4/bin/hadoop
(2) 啓動HDFS和YARN
A. 啓動NameNode
[root@localhost hadoop]# ${HADOOP_HOME}/sbin/hadoop-daemon.sh start namenode
[root@localhost hadoop]# jps
B. 啓動DataNode
[root@localhost hadoop]# ${HADOOP_HOME}/sbin/hadoop-daemon.sh start datanode
[root@localhost hadoop]# jps
C. 啓動SecondaryNameNode
[root@localhost hadoop]# ${HADOOP_HOME}/sbin/hadoop-daemon.sh start secondarynamenode
(3) start-all.sh啓動所有節點:
[root@localhost hadoop]# start-all.sh
[root@localhost sbin]# ./start-all.sh
[root@localhost sbin]# jps
NodeManager:數據節點
SecondaryNameNode:輔助NameNode
(4) 啓動Resourcemanager
需配置Yarn
[root@localhost hadoop]# ${HADOOP_HOME}/sbin/yarn-daemon.sh start nodemanager
(5) 瀏覽器訪問管理:
namenode管理界面:hdfs
http://192.168.146.128:50070/
資源管理:
YARN 的 Web 頁面
http://192.168.191.141:8088