1. 配置網絡
① 修改虛擬機網絡適配器設置:
為了能夠在不同網絡下使用同一個靜態IP地址,我們使用自定義的NAT模式:
打開VMware Workstation
的虛擬網絡編輯器
(在菜單編輯
里):
選中VMnet8
,點擊NAT設置
,記住你的網關
:
和CloudStack
不同,配置Hadoop
並不需要禁用NetworkManager
服務,所以可以直接在有線設置
里面修改:
這里我僅以自己的地址為例,具體的請根據自己的網關修改:
IPv4
選手動
,地址填192.168.71.3
-192.168.71.127
都行;
DNS就填前面兩個就行了;
IPv6
直接禁用
;
然后應用
,打開網絡。
注意:如果原先就是開着的,需要先關閉再打開。
2. 卸載OpenJDK並安裝Oracle JDK
安裝好CentOS之后,我們需要把系統自帶的OpenJDK卸載,然后安裝功能更加完整的JDK。
有關OpenJDK和JDK的區別請參考這篇文章。
步驟如下:
① 查詢已安裝的OpenJDK:
rpm -qa | grep java -i
② 卸載查詢到的軟件包:
用法:
rpm -e --nodeps [查詢到的包]
示例:
rpm -e --nodeps java-1.8.0-openjdk-1.8.0.302.b08-0.el7_9.x86_64 \
java-1.8.0-openjdk-headless-1.8.0.302.b08-0.el7_9.x86_64 \
javapackages-tools-3.4.1-11.el7.noarch \
python-javapackages-3.4.1-11.el7.noarch \
tzdata-java-2021c-1.el7.noarch
注意:需要在root
權限下才能卸載,否則會提示權限不足
!
進入root
權限可使用:
su
然后輸入密碼(密碼不回顯,是看不見輸入的是什么的)
③ 從Oracle官網下載JDK:
嫌麻煩的也可以從我的分享下載天翼雲盤
④ 解壓下載好的JDK:
示例:
打開主文件夾
(桌面上那個文件夾),把軟件包直接拖進去,然后在主文件夾
中打開終端,並獲取root
權限;
注意:直接拖進來可能會因為VMware Tools
的bug發生錯誤,解決方法是直接在CentOS里面下載,或者通過U盤傳入!
創建一個目錄用來存放軟件包解壓后的內容:
mkdir /usr/local/src/jdk
把軟件包復制到這個目錄:
cp jdk-8u311-linux-x64.tar.gz /usr/local/src/jdk/
(可選)把主文件夾
中的軟件包刪除:
rm -f jdk-8u311-linux-x64.tar.gz
定位到目錄/usr/local/src/jdk
:
cd /usr/local/src/jdk
解壓剛才復制過來的軟件包:
tar -zxvf jdk-8u311-linux-x64.tar.gz
(可選)把當前文件夾中的軟件包刪除:
rm -f jdk-8u311-linux-x64.tar.gz
⑤ 添加環境變量:
打開全局環境變量配置文件:
vim /etc/profile
注意:vim
是vi
的高級版本,能用不同顏色高亮關鍵字。
移動到文件末尾,按小寫字母i
進入插入模式
,添加下面的內容:
export JAVA_HOME=/usr/local/src/jdk/jdk1.8.0_311
export PATH=$PATH:$JAVA_HOME/bin
按Esc
鍵,再按冒號:
,輸入小寫字母wq
,回車,即可保存退出。
順邊一說,不保存退出是:q!
。
使環境變量配置立即生效:
source /etc/profile
查看JDK版本:
java -version
3. 配置Hadoop
3.1. 准備工作
訪問官網:https://hadoop.apache.org/releases.html
在下載好的軟件包所在目錄中打開終端,獲取root權限,創建目錄:
mkdir /usr/local/src/hadoop
把軟件包復制到這個目錄:
cp hadoop-3.3.1.tar.gz /usr/local/src/hadoop/
(可選)把軟件包刪除:
rm -f hadoop-3.3.1.tar.gz
定位到新創建的目錄:
cd /usr/local/src/hadoop
解壓軟件包:
tar -zxvf hadoop-3.3.1.tar.gz
(可選)把軟件包刪除:
rm -f hadoop-3.3.1.tar.gz
定位到解壓出來的目錄:
cd /usr/local/src/hadoop/hadoop-3.3.1
創建一些后面要用到的目錄:
mkdir -p hdfs/data
mkdir hdfs/name
mkdir tmp
修改環境變量配置文件:
vim /etc/profile
移動到文件末尾,按小寫字母i
進入插入模式
,添加或修改下面的內容:
export HADOOP_HOME=/usr/local/src/hadoop/hadoop-3.3.1
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin
注意:PATH
是修改之前配置JDK的那個,僅較之前添加了:$HADOOP_HOME/bin
!
修改完大概是這樣的:
使環境變量配置立即生效:
source /etc/profile
查看Hadoop版本:
hadoop version
3.2. 修改配置文件
定位到Hadoop軟件包配置文件目錄(root別忘記):
cd /usr/local/src/hadoop/hadoop-3.3.1/etc/hadoop
① 修改hadoop-env.sh
文件:
vim hadoop-env.sh
找到下面的內容:
把export JAVA_HOME=
取消注釋,改為:
export JAVA_HOME=/usr/local/src/jdk/jdk1.8.0_311
② 修改core-site.xml
文件:
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://127.0.0.1:9000</value>
</property>
<property>
<name>fs.defaultFS</name>
<value>hdfs://127.0.0.1:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/src/hadoop/hadoop-3.3.1/tmp</value>
</property>
</configuration>
③ 修改hdfs-site.xml
文件:
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.name.dir</name>
<value>/usr/local/src/hadoop/hadoop-3.3.1/hdfs/name</value>
</property>
<property>
<name>dfs.data.dir</name>
<value>/usr/local/src/hadoop/hadoop-3.3.1/hdfs/data</value>
</property>
<property>
<name>dfs.http.address</name>
<value>0.0.0.0:9870</value>
</property>
</configuration>
注意:如果是老版本Hadoop
,端口不是9870
是50070
!
④ 修改mapred-site.xml
文件:
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
⑤ 修改yarn-site.xml
文件:
<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>localhost</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
⑥ 定位到Hadoop
的sbin
目錄下:
cd /usr/local/src/hadoop/hadoop-3.3.1/sbin
⑦ 修改start-dfs.sh
和stop-dfs.sh
文件,在文件頂部
添加如下內容:
HDFS_DATANODE_USER=root
HDFS_DATANODE_SECURE_USER=hdfs
HDFS_NAMENODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root
⑧ 修改start-yarn.sh
和stop-yarn.sh
文件,在文件頂部
添加如下內容:
YARN_RESOURCEMANAGER_USER=root
HADOOP_SECURE_DN_USER=yarn
YARN_NODEMANAGER_USER=root
3.3. 設置無密碼ssh
在任意目錄root
權限下執行下面的命令即可:
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 0600 ~/.ssh/authorized_keys
注意:某些教程里直接跳過了這一步,導致下面啟動Hadoop的時候報錯(類似Permission Denied
這類錯誤)。
3.4. 初始化HDFS文件系統
定位到Hadoop
的bin
目錄下:
cd /usr/local/src/hadoop/hadoop-3.3.1/bin
初始化文件系統:
hdfs namenode -format
3.5. 啟動Hadoop
定位到Hadoop
的sbin
目錄下:
cd /usr/local/src/hadoop/hadoop-3.3.1/sbin
開啟NameNode
和DataNode
守護進程:
./start-dfs.sh
好,現在就可以通過瀏覽器訪問下面的地址訪問NameNode
的網頁界面了:
http://localhost:9870/
注意:老版本的Hadoop應該訪問http://localhost:50070/
我們來創建幾個目錄用於后續執行MapReduce jobs
:
hdfs dfs -mkdir /user
hdfs dfs -mkdir /user/<username>
注意:這里的<username>
填你的用戶名
開啟ResourceManager
和NodeManager
守護進程:
./start-yarn.sh
好,現在就可以通過瀏覽器訪問下面的地址訪問ResourceManager
的網頁界面了:
http://localhost:8088/
4. 測試Hadoop性能
4.1. 查看可用測試工具
定位到MapReduce目錄:
cd $HADOOP_HOME/share/hadoop/mapreduce
注意:如果出現錯誤,多半是環境變量沒有應用,執行一下source /etc/profile
就能解決。
不帶參數執行jar包即可查看可用測試工具:
hadoop jar hadoop-mapreduce-client-jobclient-3.3.1-tests.jar
DFSCIOTest: Distributed i/o benchmark of libhdfs.
MRReliabilityTest: A program that tests the reliability of the MR framework by injecting faults/failures
TestDFSIO: Distributed i/o benchmark.
fail: a job that always fails
gsleep: A sleep job whose mappers create 1MB buffer for every record.
loadgen: Generic map/reduce load generator
mapredtest: A map/reduce test check.
mrbench: A map/reduce benchmark that can create many small jobs
nnbench: A benchmark that stresses the namenode w/ MR.
nnbenchWithoutMR: A benchmark that stresses the namenode w/o MR.
sleep: A job that sleeps at each map and reduce task.
testbigmapoutput: A map/reduce program that works on a very big non-splittable file and does identity map/reduce
testfilesystem: A test for FileSystem read/write.
testmapredsort: A map/reduce program that validates the map-reduce framework's sort.
testsequencefile: A test for flat files of binary key value pairs.
testsequencefileinputformat: A test for sequence file input format.
testtextinputformat: A test for text input format.
threadedmapbench: A map/reduce benchmark that compares the performance of maps with multiple spills over maps with 1 spill
timelineperformance: A job that launches mappers to test timeline service performance.
翻譯版:
DFSCIOTest: libhdfs 的分布式 i/o 基准測試。
MRReliabilityTest: 一個通過注入錯誤/故障來測試 MR 框架可靠性的程序。
TestDFSIO: 分布式 i/o 基准測試。
fail: 一次總是失敗的作業。
gsleep: 一次 sleep 作業,它的 mapper 為每條記錄創建 1MB 的緩沖區。
loadgen: 通用 map/reduce 負載生成器。
mapredtest: map/reduce 測試檢查。
mrbench: 一個可以創造大量小作業的 map/reduce 基准測試。
nnbench: 對 namenode w/ MR 的基准壓力測試。
nnbenchWithoutMR: 對 namenode w/o MR 的基准壓力測試。
sleep: 一次在每個 map 和 reduce 任務上 sleep 的作業。
testbigmapoutput: 一個在非常大的不可分割文件上作業的 map/reduce 程序,並執行一致性 map/reduce。
testfilesystem: 文件系統 read/write 測試。
testmapredsort: 一個驗證 map-reduce 框架排序的 map/reduce 程序。
testsequencefile: 一個對二進制鍵值對的平面文件的測試。
testsequencefileinputformat: 一個對序列文件輸入格式的測試。
testtextputformat: 一個對文本輸入格式的測試。
threadmapbench: 一個 map/reduce 基准測試,用於比較具有多個 spill 的 map 對具有單個 spill 的 map 的性能。
timelineperformance: 一次啟動 mapper 以測試 timeline 服務性能的作業。
先介紹一下查看文件系統的簡單方法:
4.2. TestDFSIO:測試HDFS讀寫性能
向HDFS
集群寫10個10MB的文件:
hadoop jar ./hadoop-mapreduce-client-jobclient-3.3.1-tests.jar \
TestDFSIO \
-write \
-nrFiles 10 \
-size 10MB
注意:有可能遇到錯誤: 找不到或無法加載主類 org.apache.hadoop.mapreduce.v2.app.MRAppMaster
這樣的報錯,解決方法參照這里。
讀取剛才寫入的10個文件:
hadoop jar ./hadoop-mapreduce-client-jobclient-3.3.1-tests.jar \
TestDFSIO \
-write \
-nrFiles 10 \
-size 10MB
查看測試結果:
cat TestDFSIO_results.log
刪除測試臨時文件:
hadoop jar ./hadoop-mapreduce-client-jobclient-3.3.1-tests.jar \
TestDFSIO \
-clean
4.3. mrbench:測試重復執行小作業效率
測試使用3個mapper和3個reducer運行一個小作業20次,生成輸入行數為5,降序排列:
hadoop jar hadoop-mapreduce-client-jobclient-3.3.1-tests.jar \
mrbench \
-numRuns 20 \
-maps 3 \
-reduces 3 \
-inputLines 5 \
-inputType descending
注意:運行直接比較長,可適當減少運行次數。
4.4. nnbench:測試NameNode負載
測試使用3個mapper和3個reducer來創建100個文件:
hadoop jar hadoop-mapreduce-client-jobclient-3.3.1-tests.jar \
nnbench \
-operation create_write \
-maps 3 \
-reduces 3 \
-numberOfFiles 100 \
-replicationFactorPerFile 3 \
-readFileAfterOpen true
查看結果:
cat NNBench_results.log
5. 編寫Hadoop實例
5.1. 安裝eclipse
瀏覽器訪問:https://www.eclipse.org/downloads/packages/
點這個地方下載:
有時候它選擇的鏡像可能不是很快,所以可以點這邊選其他鏡像:
比如這個就不錯,直接懟它:
注意:點擊之后可能會需要較長時間才彈出保存文件對話框,耐心等待即可。
下載完成后,來到下載
文件夾,在空白處右鍵並選擇在終端打開
:
執行su
進入root
賬戶,然后復制下載好的軟件包到其他地方:
cp eclipse-jee-2021-09-R-linux-gtk-x86_64.tar.gz /usr/local/src/
(可選)刪除當前目錄下的軟件包:
rm -f eclipse-jee-2021-09-R-linux-gtk-x86_64.tar.gz
轉到/usr/local/src/
:
cd /usr/local/src/
解壓軟件包:
tar -zxvf eclipse-jee-2021-09-R-linux-gtk-x86_64.tar.gz
(可選)刪除當前目錄下的軟件包:
rm -f eclipse-jee-2021-09-R-linux-gtk-x86_64.tar.gz
轉到eclipse
軟件目錄:
cd /usr/local/src/eclipse/
運行eclipse
:
./eclipse
注意:這個終端不要關,關了的話eclipse
也會關。
然后會提示選擇工作目錄(建議記一下這個默認路徑),直接Launch
:
這樣,就進入了eclipse
。
5.2. 編寫實例
創建Java Project
:
項目名隨便填就行,JRE版本不太確定,試了試JavaSE-1.8
是可以的:
項目建完沒彈出來?把Welcome
頁關掉就行。
接下來要導入一些包:
把$HADOOP_HOME/share/hadoop/common/
目錄下的2個jar包導入:
把$HADOOP_HOME/share/hadoop/common/lib/
目錄下的所有jar包導入:
注意:選中一個包,按Ctrl+A
即可全選。
把$HADOOP_HOME/share/hadoop/mapreduce/
目錄下的所有jar包導入:
5.2.1. 數據去重
創建一個類:
Package:dataUtil
Name:DataDedup
Modifiers:package
(其實這項不用改,反正后面復制粘貼)
替換為下面的內容:
package dataUtil;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;
public class DataDedup {
public static class Map extends Mapper<Object,Text,Text,Text>{
private static Text line=new Text();
public void map(Object key,Text value,Context context) throws IOException,InterruptedException{
line=value;
context.write(line, new Text(""));
}
}
public static class Reduce extends Reducer<Text,Text,Text,Text>{
public void reduce(Text key,Iterable<Text> values,Context context) throws IOException,InterruptedException{
context.write(key, new Text(""));
}
}
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
if (otherArgs.length != 2) {
System.err.println("Usage: datadedup <in> <out>");
System.exit(2);
}
Job job = Job.getInstance(conf, "data dedup");
job.setJarByClass(DataDedup.class);
job.setNumReduceTasks(1);
job.setMapperClass(Map.class);
job.setCombinerClass(Reduce.class);
job.setReducerClass(Reduce.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class);
FileInputFormat.addInputPath(job, new Path(otherArgs[0]));
FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
編譯運行:
這里直接OK
就行:
下面出現這個就對了:
導出可執行jar包:
選中創建的類,選擇導出路徑:
建議放在項目目錄中:
然后直接點Finish
就行了。(出現warning直接點ok)
5.3. 運行實例
打開終端,運行hadoop
:
$HADOOP_HOME/sbin/start-all.sh
創建2個文本文檔用於測試:
vim file1.txt
2021-10-11 a
2021-10-12 b
2021-10-13 c
2021-10-14 d
2021-10-15 a
2021-10-16 b
2021-10-17 c
2021-10-13 c
vim file2.txt
2021-10-11 b
2021-10-12 a
2021-10-13 b
2021-10-14 d
2021-10-15 a
2021-10-16 c
2021-10-17 d
2021-10-13 c
在hdfs上創建一個文件夾(<username>
填你自己的賬戶):
hdfs dfs -mkdir /user/<username>/test1
注意:/user/<username>
在之前配置hadoop時已經由我們創建,沒創建的需要現在創建一下。
上傳剛才創建的2個文本文檔:
hdfs dfs -put file1.txt /user/<username>/test1
hdfs dfs -put file2.txt /user/<username>/test1
運行:
hadoop jar /root/eclipse-workspace/MapReduceApplication/DataDedup.jar /user/<username>/test1 /user/<username>/output1
查看運行結果:
hdfs dfs -cat /user/<username>/output1/*