Hadoop 3.3.1 折騰記錄


1. 配置網絡

① 修改虛擬機網絡適配器設置:
為了能夠在不同網絡下使用同一個靜態IP地址,我們使用自定義的NAT模式:
1568101117361.png
打開VMware Workstation虛擬網絡編輯器(在菜單編輯里):
2240607130196.png
選中VMnet8,點擊NAT設置,記住你的網關
1534408126751.png
CloudStack不同,配置Hadoop並不需要禁用NetworkManager服務,所以可以直接在有線設置里面修改:
20211029091423.png
這里我僅以自己的地址為例,具體的請根據自己的網關修改:
IPv4手動,地址填192.168.71.3-192.168.71.127都行;
DNS就填前面兩個就行了;
IPv6直接禁用
然后應用,打開網絡。
注意:如果原先就是開着的,需要先關閉再打開。
20211030114439.png

2. 卸載OpenJDK並安裝Oracle JDK

安裝好CentOS之后,我們需要把系統自帶的OpenJDK卸載,然后安裝功能更加完整的JDK。
有關OpenJDK和JDK的區別請參考這篇文章。
步驟如下:
① 查詢已安裝的OpenJDK:

rpm -qa | grep java -i

1665941091068.png
② 卸載查詢到的軟件包:
用法:

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

注意:vimvi的高級版本,能用不同顏色高亮關鍵字。
移動到文件末尾,按小寫字母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

2044057135491.png

3. 配置Hadoop

3.1. 准備工作

訪問官網:https://hadoop.apache.org/releases.html
3405321140385.png
在下載好的軟件包所在目錄中打開終端,獲取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
修改完大概是這樣的:
4964055137989.png
使環境變量配置立即生效:

source /etc/profile

查看Hadoop版本:

hadoop version

4707757116732.png

3.2. 修改配置文件

定位到Hadoop軟件包配置文件目錄(root別忘記):

cd /usr/local/src/hadoop/hadoop-3.3.1/etc/hadoop

① 修改hadoop-env.sh文件:

vim hadoop-env.sh

找到下面的內容:
2806907149172.png
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,端口不是987050070
④ 修改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>

⑥ 定位到Hadoopsbin目錄下:

cd /usr/local/src/hadoop/hadoop-3.3.1/sbin

⑦ 修改start-dfs.shstop-dfs.sh文件,在文件頂部添加如下內容:

HDFS_DATANODE_USER=root
HDFS_DATANODE_SECURE_USER=hdfs
HDFS_NAMENODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root

⑧ 修改start-yarn.shstop-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文件系統

定位到Hadoopbin目錄下:

cd /usr/local/src/hadoop/hadoop-3.3.1/bin

初始化文件系統:

hdfs namenode -format

3.5. 啟動Hadoop

定位到Hadoopsbin目錄下:

cd /usr/local/src/hadoop/hadoop-3.3.1/sbin

開啟NameNodeDataNode守護進程:

./start-dfs.sh

好,現在就可以通過瀏覽器訪問下面的地址訪問NameNode的網頁界面了:

http://localhost:9870/

注意:老版本的Hadoop應該訪問http://localhost:50070/
我們來創建幾個目錄用於后續執行MapReduce jobs

hdfs dfs -mkdir /user
hdfs dfs -mkdir /user/<username>

注意:這里的<username>填你的用戶名
開啟ResourceManagerNodeManager守護進程:

./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 服務性能的作業。

先介紹一下查看文件系統的簡單方法:
1702224184308.png

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

5717138177854.png
刪除測試臨時文件:

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

2223454170988.png

5. 編寫Hadoop實例

5.1. 安裝eclipse

瀏覽器訪問:https://www.eclipse.org/downloads/packages/
點這個地方下載:
3152756111071.png
有時候它選擇的鏡像可能不是很快,所以可以點這邊選其他鏡像:
965859129497.png
比如這個就不錯,直接懟它:
5157759117364.png
注意:點擊之后可能會需要較長時間才彈出保存文件對話框,耐心等待即可。
下載完成后,來到下載文件夾,在空白處右鍵並選擇在終端打開
2959304147530.png
執行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
2889331151071.png
這樣,就進入了eclipse

5.2. 編寫實例

創建Java Project
184439169497.png
3634939157364.png
項目名隨便填就行,JRE版本不太確定,試了試JavaSE-1.8是可以的:
4702846177530.png
項目建完沒彈出來?把Welcome頁關掉就行。
接下來要導入一些包:
4489554170199.png
910456166754.png
$HADOOP_HOME/share/hadoop/common/目錄下的2個jar包導入:
3773459162508.png
$HADOOP_HOME/share/hadoop/common/lib/目錄下的所有jar包導入:
1215001190388.png
注意:選中一個包,按Ctrl+A即可全選。
$HADOOP_HOME/share/hadoop/mapreduce/目錄下的所有jar包導入:
2822804187992.png

5.2.1. 數據去重

創建一個類:
3433906185494.png
Package:dataUtil
Name:DataDedup
Modifiers:package(其實這項不用改,反正后面復制粘貼)
2036913166735.png
替換為下面的內容:

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);
	}
}

編譯運行:
690218189175.png
這里直接OK就行:
3755618184311.png
下面出現這個就對了:
404619177857.png
導出可執行jar包:
633420170991.png
1030243165857.png
選中創建的類,選擇導出路徑:
994344166466.png
建議放在項目目錄中:
2426323172972.png
然后直接點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/*

1313247193421.png


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM