學校有幾門課程的作業(yè)需要我們來寫個教程,好吧。
環(huán)境準備
軟件安裝
由于該系統(tǒng)是英文系統(tǒng),有可能對中文字符支持不友好,因此要安裝中文的UTF-8字符集。同時因為Hadoop是Java的杰出產(chǎn)物因此需要安裝Java,為了方便,在這里選用OpenJdk,版本Java8。而需要用到的vim、ssh等命令已內(nèi)置在Ubuntu16.04中,因此無需重復安裝。
sudo su
apt install -y language-pack-zh-hant language-pack-zh-hans
apt install -y openjdk-8-jre openjdk-8-jdk
創(chuàng)建用戶以及權(quán)限配置
本次實驗中我們創(chuàng)建一個hadoop用戶,而對hadoop的使用操作都通過hadoop用戶實現(xiàn)。同時為了方便hadoop操作中的ssh登錄,我們配置無密碼ssh登錄。
useradd -m hadoop -s /bin/bash
passwd hadoop
adduser hadoop sudo
su hadoop
此后,hadoop用戶便是運行hadoop程序的用戶,以下的操作便是以hadoop用戶的身份運行的。接下來生成密鑰用于無密碼登錄:
ssh-keygen -t rsa
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

配置完后即可通過ssh localhost命令無密碼登錄,需要注意的是要按提示輸入yes

下載hadoop并放置到約定俗成的位置
這次實驗的hadoop版本是2.8.0,下載使用wget命令,軟件源為了快速選用國內(nèi)的清華源,同時將hadoop文件夾移到約定俗成的/usr/local目錄下。
wget http://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/hadoop-2.8.0/hadoop-2.8.0.tar.gz
tar zxvf hadoop-2.8.0.tar.gz

mv hadoop-2.8.0 hadoop
sudo mv hadoop /usr/local/
sudo chown -R hadoop /usr/local/hadoop
cd /usr/local/hadoop/
此后,/usr/local/hadoop這個目錄便是hadoop目錄,下面的操作都是在目錄下操作的。
配置Java和Hadoop的環(huán)境變量
需要在/etc/profile和./etc/hadoop/hadoop-env.sh(目前在hadoop目錄下)這兩個文件的末尾加入以下變量:
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
CLASSPATH=$CLASSPATH.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin
export HADOOP_HOME=/usr/local/hadoop
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
修改第一個文件就是修改當前的環(huán)境變量,修改第二個文件就是修改ssh后的環(huán)境變量。
這些就是Java和Hadoop的環(huán)境變量,加載了這些環(huán)境變量即可在命令行運行特定命令,現(xiàn)在重新加載這配置文件:
. /etc/profile
配置偽分布式環(huán)境
初始化hdfs
編輯./etc/hadoop/core-site.xml和./etc/hadoop/hdfs-site.xml兩個文件
vim ./etc/hadoop/core-site.xml
修改里面配置,感興趣的可以查一下含義,主要是每一個property的name和value:
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/usr/local/hadoop/tmp</value>
<description>Abase for other temporary directories.</description>
</property>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
vim ./etc/hadoop/hdfs-site.xml
修改里面配置,指名name、data文件夾在這個服務(wù)器上的路徑(因為是偽分布式,所以都在這個服務(wù)器上):
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/usr/local/hadoop/tmp/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/usr/local/hadoop/tmp/dfs/data</value>
</property>
</configuration>
以上就完成了偽分布式的配置,接下來就是格式化這些存儲節(jié)點
./bin/hdfs namenode -format

中間太多了略過直接看末尾:

在此看到Exiting status為0,結(jié)合大多數(shù)程序和系統(tǒng)腳本,結(jié)束狀態(tài)碼為0即為正常運行結(jié)束。
開啟 NameNode 和 DataNode 守護進程
運行./sbin/start-dfs.sh命令即可啟動

注意本次運行以及以后的運行程序有可能出現(xiàn)以下WARN:
WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform… using builtin-java classes where applicable
該 WARN 提示可以忽略,并不會影響正常使用(該 WARN 可以通過編譯 Hadoop 源碼解決)。
而后即可通過 http://機器ip:50070 來訪問 NameNode 和 Datanode 信息,還可以在線查看 HDFS 中的文件。

在命令界面也可以通過jps來查看 NameNode 和 Datanode 信息是否在運行。
運行例子
命令查看
可以通過./bin/hdfs dfs -help命令來查看使用方法:

例如查看hadoop版本的命令:

在 HDFS 中創(chuàng)建用戶目錄
先通過./bin/hdfs dfs -mkdir -p /user/hadoop命令創(chuàng)建一個用戶目錄
例子一 解析配置文件
本次實驗可以就地取材,選擇hadoop的配置文件為材料,使用偽分布式hadoop平臺來解析。先用put命令把配置文件都放入hdfs的一個新建文件夾input:
./bin/hdfs dfs -mkdir /user/hadoop/input
./bin/hdfs dfs -put ./etc/hadoop/*.xml /user/hadoop/input/
./bin/hdfs dfs -ls input

然后運行例子,解析input里面的配置文件,并將解析結(jié)果放入output文件夾:
./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grep /user/hadoop/input/* /user/hadoop/output 'dfs[a-z.]+'

把output里面的解析結(jié)果通過cat命令輸出:
./bin/hdfs dfs -cat /user/hadoop/output/*

把output里面的解析結(jié)果從hdfs中取出(這個操作是常用的,盡管在偽分布式里面沒什么意義,但是在真實環(huán)境下特別有用):
./bin/hdfs dfs -get /user/hadoop/output ./output
例子二 WordCount
wordcount是一個hadoop內(nèi)置的范例程序,用于統(tǒng)計單詞數(shù)量。
首先,要刪除例子一留下的實驗痕跡:
./bin/hdfs dfs -rm -r -f /user/hadoop/output /user/hadoop/input

然后和實驗一一樣,創(chuàng)建hadoop的輸入文件夾,同時就地取材一個可讀文件:
./bin/hdfs dfs -mkdir /user/hadoop/input
./bin/hdfs dfs -put LICENSE.txt /user/hadoop/input/LICENSE.txt
./bin/hdfs dfs -ls /user/hadoop/input
運行例子,結(jié)果放置在output文件夾:
./bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.8.0.jar wordcount /user/hadoop/input /user/hadoop/output
./bin/hdfs dfs -cat /user/hadoop/output/*

可以看到,屏幕是被刷了好幾遍,因為輸出太多了,我們可以統(tǒng)計一下輸出了有多少行:
./bin/hdfs dfs -cat /user/hadoop/output/* | wc -l

噢,原來有2000多行的輸出呢!
結(jié)論
hadoop的思想已經(jīng)融入了我們很多分布式系統(tǒng)里面,熟悉hadoop的思想和操作有助于我們更宏觀地觀察這個現(xiàn)代化網(wǎng)絡(luò)世界。
若有錯誤之處請指出,更多地關(guān)注煎魚。