Hadoop是大數據處理主流框架,如果要學習大數據處理與存儲,hadoop是必須掌握的一種框架技術。動手安裝是最基礎的實踐,下面介紹一下僞分佈式安裝與配置、測試過程,供有需要的參考。
(1)軟件準備
包括:VMWare Workstation虛擬機
Centos7 64位操作系統
JDK1.8.0 64位
Hadoop3.1.2 (可以在http://mirror.bit.edu.cn/apache/hadoop/common/下載)
(2)Centos安裝及網絡配置
第一步,虛擬機上安裝Centos64位操作系統,安裝過程比較簡單,許多地方都是默認設置,包括網絡設置採用nat方式默認設置。
需要提示的是:在安裝過程中有設置用戶和root密碼的地方,建議設置用戶時就設置hadoop用戶,密碼可以自行設置。後面再登錄時默認當前用戶就是hadoop。這樣避免再去使用useradd添加hadoop用戶。
第二步. 查看IP地址: 與ubuntu不一樣,輸入ifconfig會出現錯誤,這裏最簡單方法就是使用ping命令,如ping 192.168.58.130,雖然無法ping通,但可以發現在彈出的信息中有from 192.168.58.138字樣,這192.168.58.138就是本機的ip地址。
第三步,在centos系統上安裝SSH服務,便於上傳JDK和HADOOP包。centos最簡安裝只有命令窗口,沒有桌面環境,在使用過程中需要用戶比較熟悉linux相關命令。本步驟主要用到如下命令:
1. root賬號登錄安裝SSH : yum install -y openssl openssh-server
yum install rsync (rsync是一個遠程數據同步工具,可通過LAN/WAN快速同步多臺主機間的文件)
2. root賬戶修改配置文件: 用vim打開配置文件/etc/ssh/sshd_config, 找到permitrootlogin將其前面的註釋去掉
3. 啓動SSH服務: systemctl start sshd.service
設置SSH開機自啓動:systemctl enable sshd.service
第四步,修改機器hostname、設置host與ip映射
1. 修改hostname: root賬戶登錄後輸入: vi /etc/sysconfig/network, 然後修改如下:
2. 配置host與IP映射:root賬戶登錄後輸入: vi /etc/hosts,然後修改如下:
如上將本機IP地址192.168.58.138 映射爲master機器名,其他兩個節點也類似設置對應的機器名。可以在命令行輸入:ping master,如果ping成功,說明機器名修改生效:
第五步,測試SSH,可連接。在windows上安裝XSHELL或者SSH SECURE SHELL等軟件,測試是否能正常登錄連接。
第六步,設置SSH免密登錄。
爲了便於主節點與其他從節點之間的順暢通信,需要設置免密登錄。在主節點機器上當前用戶登錄,命令行輸入:ssh-keygen -t rsa,如下窗口。
由此生成一個私鑰和一個公鑰,存儲在/home/hadoop/.ssh/目錄下:
[hadoop@localhost ~]# cd ~/.ssh
[hadoop@localhost .ssh]# ll
total 8
-rw-------. 1 hadoop hadoop 1679 Aug 11 18:37 id_rsa
-rw-r--r--. 1 hadoop hadoop 408 Aug 11 18:37 id_rsa.pub
然後執行如下命令,cp id_rsa.pub authorized_keys,產生 authorized_keys文件
[hadoop@localhost .ssh]# cp id_rsa.pub authorized_keys
[hadoop@localhost .ssh]# ll
total 12
-rw-r--r--. 1 hadoop hadoop 408 Aug 11 19:34 authorized_keys
-rw-------. 1 hadoop hadoop 1679 Aug 11 18:37 id_rsa
-rw-r--r--. 1 hadoop hadoop 408 Aug 11 18:37 id_rsa.pub
然後修改權限ssh文件夾及authorized_keys文件:
[hadoop@localhost ~]$ chmod -R 700 .ssh
[hadoop@localhost ~]$ cd .ssh
[hadoop@localhost .ssh]$ chmod 600 authorized_keys
這裏的權限700和600功能參考如下:
-rw------- (600) 只有擁有者有讀寫權限。
-rw-r--r-- (644) 只有擁有者有讀寫權限;而屬組用戶和其他用戶只有讀權限。
-rwx------ (700) 只有擁有者有讀、寫、執行權限。
-rwxr-xr-x (755) 擁有者有讀、寫、執行權限;而屬組用戶和其他用戶只有讀、執行權限。
-rwx--x--x (711) 擁有者有讀、寫、執行權限;而屬組用戶和其他用戶只有執行權限。
-rw-rw-rw- (666) 所有用戶都有文件讀、寫權限。
-rwxrwxrwx (777) 所有用戶都有讀、寫、執行權限。
如下進行免密登錄測試:ssh hadoop@master,或者直接使用ssh master,不需要輸入密碼時就表示配置成功。
第7步,關閉防火牆
centos默認防火牆不是iptables,而是firewall。使用systemctl命令來開啓和關閉防火牆。
關閉: [root@master ~]# systemctl stop firewalld
查看狀態:[root@master ~]# service firewalld status
Redirecting to /bin/systemctl status firewalld.service
?firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
Active: inactive (dead) since Mon 2019-08-12 09:40:50 CST; 27s ago
Docs: man:firewalld(1)
Process: 6574 ExecStart=/usr/sbin/firewalld --nofork --nopid $FIREWALLD_ARGS (code=exited, status=0/SUCCESS)
Main PID: 6574 (code=exited, status=0/SUCCESS)
(3)JDK安裝配置
JDK安裝配置比較簡單,將JDK安裝包上傳到當前目錄下,如新建一個java文件夾,然後使用tar命令將壓縮包解壓,然後配置環境變量即可:
第一步,在當前用戶目錄下新建java文件夾: [hadoop@localhost ~]$ mkdir java
第二步,在新建的java文件夾中解壓jdk包: [hadoop@localhost java]$ tar -xvf jdk-8u11-linux-x64.tar.gz
第三步,查看內容,其中jdk1.8.0_11就是jdk包所在的文件夾
[hadoop@localhost java]$ ll
total 155296
drwxr-xr-x. 8 hadoop hadoop 255 Jun 17 2014 jdk1.8.0_11
-rw-r--r--. 1 hadoop hadoop 159019376 Aug 10 21:13 jdk-8u11-linux-x64.tar.gz
[hadoop@localhost java]$ cd jdk1.8.0_11/
[hadoop@localhost jdk1.8.0_11]$ ll
total 25428
drwxr-xr-x. 2 hadoop hadoop 4096 Jun 17 2014 bin
-r--r--r--. 1 hadoop hadoop 3244 Jun 17 2014 COPYRIGHT
drwxr-xr-x. 4 hadoop hadoop 122 Jun 17 2014 db
drwxr-xr-x. 3 hadoop hadoop 132 Jun 17 2014 include
-rw-r--r--. 1 hadoop hadoop 4673670 Jun 17 2014 javafx-src.zip
drwxr-xr-x. 5 hadoop hadoop 185 Jun 17 2014 jre
drwxr-xr-x. 5 hadoop hadoop 225 Jun 17 2014 lib
-r--r--r--. 1 hadoop hadoop 40 Jun 17 2014 LICENSE
drwxr-xr-x. 4 hadoop hadoop 47 Jun 17 2014 man
-r--r--r--. 1 hadoop hadoop 159 Jun 17 2014 README.html
-rw-r--r--. 1 hadoop hadoop 525 Jun 17 2014 release
-rw-r--r--. 1 hadoop hadoop 21047086 Jun 17 2014 src.zip
-rw-r--r--. 1 hadoop hadoop 110114 Jun 17 2014 THIRDPARTYLICENSEREADME-JAVAFX.txt
-r--r--r--. 1 hadoop hadoop 178445 Jun 17 2014 THIRDPARTYLICENSEREADME.txt
其中的bin文件夾、lib文件夾、jre文件夾都是熟悉的JAVA環境變量指向路徑
第四步,配置java環境變量
使用root賬戶登錄,然後命令行輸入: vi /etc/profile,在文件的最下端加入java環境變量設置:
export JAVA_HOME=/home/hadoop/java/jdk1.8.0_11
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$JAVA_HOME/bin:$PATH
第五步,保存上述文件並使環境變量生效:source /etc/profile.
第六步,測試java,在當前用戶命令行輸入: java -version,可以看到安裝成功。
也可以編輯一個HelloWorldjava程序測試:
然後在命令行:
[hadoop@localhost ~]$ javac HelloWorld.java
[hadoop@localhost ~]$ java HelloWorld
測試打印出程序中的hello結果。
(4)Hadoop單機安裝及配置
hadoop安裝也比較簡單,主要是配置比較麻煩。
將官網上下載的hadoop包上傳到當前目錄,然後tar解壓縮即完成安裝。然後麻煩的就是去配置相應的文件,包括core-site.xml、hadoop-env.sh、hdfs-site.xml、mapred-site.xml、yarn-site.xml等。
第一步,安裝hadoop,直接解壓就可以。如圖:
第二步,修改系統環境變量配置文件,將HADOOP的路徑加入profile,
即在root賬戶登錄後命令行輸入:
vi /etc/profile
然後在之前添加的JAVA環境變量文件下方添加HADOOP相關環境變量:
#JAVA環境變量設置
export JAVA_HOME=/home/hadoop/java/jdk1.8.0_11
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$JAVA_HOME/bin:$PATH
#HADOOP環境變量設置
export HADOOP_HOME=/home/hadoop/hadoop-3.1.2
export PATH=$PATH:$HADOOP_HOME/bin
修改完成後保存該文件,然後使用:source /etc/profile使環境設置生效。
第三步,可以測試hadoop是否安裝成功。在當前用戶目錄下命令行輸入: hadoop version,如下:
[hadoop@master ~]$ hadoop version
Hadoop 3.1.2
Source code repository https://github.com/apache/hadoop.git -r 1019dde65bcf12e05ef48ac71e84550d589e5d9a
Compiled by sunilg on 2019-01-29T01:39Z
Compiled with protoc 2.5.0
From source with checksum 64b8bdd4ca6e77cce75a93eb09ab2a9
This command was run using /home/hadoop/hadoop-3.1.2/share/hadoop/common/hadoop-common-3.1.2.jar
第四步,單機非分佈式測試hadoop。如下圖,命令執行後將會列出MapReduce一系列程序類名及其意義。如wordcount程序、pi程序、sort排序程序等。
在當前home目錄下新建一個input文件夾,使用vi命令編輯三個文件,
[hadoop@master ~]$ cd input
[hadoop@master input]$ ll
total 12
-rw-rw-r--. 1 hadoop hadoop 12 Aug 12 08:12 f1.txt
-rw-rw-r--. 1 hadoop hadoop 28 Aug 12 08:12 f2.txt
-rw-rw-r--. 1 hadoop hadoop 19 Aug 12 08:12 f3.txt
[hadoop@master input]$ more f1.txt
hello world
[hadoop@master input]$ more f2.txt
hello caojianhua my brother
[hadoop@master input]$ more f3.txt
hello dear brother
可以看到三個文件中分別有幾個單詞,其中hello重複出現了3次,brother重複出現了2次,其餘的出現了1次。接下來我們用hadoop提供的樣例調用其wordcount程序來執行單詞統計測試。
[hadoop@master ~]$ hadoop jar hadoop-3.1.2/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.2.jar wordcount input output //解釋:input爲輸入的文件夾,將處理input中的三個文件,output爲輸出結果文件夾。
回車執行後如果出現:2019-08-12 08:17:08,241 INFO mapreduce.Job: map 100% reduce 100%
也就是map任務和reduce任務均完成,說明程序執行正常。
然後可以使用more或者cat命令查看輸出結果:
[hadoop@master ~]$ ll
total 324652
drwxr-xr-x. 9 hadoop hadoop 149 Jan 29 2019 hadoop-3.1.2
-rw-r--r--. 1 hadoop hadoop 332433589 Aug 9 12:52 hadoop-3.1.2.tar.gz
-rw-rw-r--. 1 hadoop hadoop 460 Aug 11 21:24 HelloWorld.class
-rw-rw-r--. 1 hadoop hadoop 151 Aug 11 21:24 HelloWorld.java
drwxrwxr-x. 2 hadoop hadoop 48 Aug 12 08:12 input
drwxrwxr-x. 3 hadoop hadoop 58 Aug 11 18:01 java
drwxr-xr-x. 2 hadoop hadoop 88 Aug 12 08:17 output
[hadoop@master ~]$ cd output
[hadoop@master output]$ ll
total 4
-rw-r--r--. 1 hadoop hadoop 61 Aug 12 08:17 part-r-00000
-rw-r--r--. 1 hadoop hadoop 0 Aug 12 08:17 _SUCCESS
[hadoop@master output]$ more part-r-00000
brother 2
caojianhua 1
dear 1
hello 3
my 1
world 1
在output文件夾中使用more命令查看part-r-00000文件,結果顯示如上。
(5)Hadoop僞分佈配置
上面第4步安裝及配置表明本機可以當做hadoop服務器處理程序,也即是單機運行,不是分佈式的,map和reduce使用同一進程不同階段來執行。Hadoop 可以在單節點上以僞分佈式的方式運行,Hadoop 進程以分離的 Java 進程來運行,節點既作爲 NameNode 也作爲 DataNode,同時,讀取的是 HDFS 中的文件。
下面介紹僞分佈式配置。主要需要修改配置文件然後啓動相應的集羣服務。包括如下5個配置文件修改:
1. 修改hadoop-env.sh,設置JAVA_HOME路徑
export JAVA_HOME=/home/hadoop/java/jdk1.8.0_11
2. 修改core-site.xml,配置文件系統和公共目錄
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/home/hadoop/hadoop-3.1.2/tmp</value>
<description>a base for other tempory directories.</description>
</property>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
3. 修改配置文件 hdfs-site.xml:
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.name.dir</name>
<value>/home/hadoop/hadoop-3.1.2/tmp/dfs/name</value>
</property>
<property>
<name>dfs.data.dir</name>
<value>/home/hadoop/hadoop-3.1.2/tmp/dfs/data</value>
</property>
</configuration>
4. 修改配置文件 mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>yarn.app.mapreduce.am.env</name>
<value>HADOOP_MAPRED_HOME=$HADOOP_HOME</value>
</property>
<property>
<name>mapreduce.map.env</name>
<value>HADOOP_MAPRED_HOME=$HADOOP_HOME</value>
</property>
<property>
<name>mapreduce.reduce.env</name>
<value>HADOOP_MAPRED_HOME=$HADOOP_HOME</value>
</property>
<property>
<name>mapreduce.map.memory.mb</name>
<value>2048</value>
</property>
</configuration>
5.修改配置文件yarn-site.xml
<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>master</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
<property>
<name>yarn.nodemanager.vmem-pmem-ratio</name>
<value>5</value>
</property>
</configuration>
配置文件修改並保存後,就可以開始啓動Hadoop了。
(6)啓動HADOOP及僞分佈式測試
第一步,首先進行hadoop的初始化,在命令行輸入:
[hadoop@master ~]$hadoop namenode -format
在執行結果最後出現:
2019-08-12 09:14:42,139 INFO namenode.NameNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at master/192.168.58.138
************************************************************/
表明初始化成功。
第二步,啓動所有進程,在命令行輸入:
[hadoop@master ~]$cd /hadoop-3.1.2/sbin
執行sbin目錄中的start-all.sh腳本文件:
[hadoop@master sbin]$ ./start-all.sh
WARNING: Attempting to start all Apache Hadoop daemons as hadoop in 10 seconds.
WARNING: This is not a recommended production deployment configuration.
WARNING: Use CTRL-C to abort.
Starting namenodes on [localhost]
localhost: Warning: Permanently added 'localhost' (ECDSA) to the list of known hosts.
Starting datanodes
Starting secondary namenodes [master]
Starting resourcemanager
Starting nodemanagers
第三步,查看進程狀態,在命令行輸入:jps
[hadoop@master sbin]$ jps
17905 NameNode
18883 Jps
18198 SecondaryNameNode
18438 ResourceManager
18541 NodeManager
18015 DataNode
至此,單機上僞分佈式Hadoop環境配置好了,一臺機器上配置Hadoop集羣:NameNode、DataNode、SecondaryNameNode,YARN集羣:ResourceManager、NodeManager。Hadoop集羣負責分佈式存儲和預算,YARN集羣負責任務資源管理和調度。
第四步,可以在外部瀏覽器登錄hadoop,由於本處使用的centos最簡安裝,沒有圖形界面,因此無法從服務器本機測試,需要外部瀏覽器測試。首先要確定防火牆關閉,然後hadoop3.0開始採用端口爲:9870。因此在外部瀏覽器地址欄輸入:
http://192.168.58.138:9870, 這裏192.168.58.138是centos服務器的ip地址,9870爲hadoop所用端口。
通過上述web界面瀏覽整個集羣的狀態。
第五步,實例測試,還是選用系統自帶的MapReduce案例,進行wordcount測試。
(1)在hdfs系統裏新建一個test文件夾,這裏要理解不是真的在本地磁盤上建立文件夾,而是在虛擬的datanode上建立文件夾,實際存儲路徑在hdfs-site.xml設定了,即:/home/hadoop/hadoop-3.1.2/tmp/dfs/data,可以去這個目錄下查看。
[hadoop@master ~]$ hdfs dfs -mkdir /test
新建成功後,可以在web界面上查看browse directory:有新建的test文件夾。
(2)將之前本地單機測試時input文件夾中的三個文件上傳到test目錄中:
[hadoop@master ~]$ hdfs dfs -put input/* /test
(3)開始測試,如下命令行:
[hadoop@master hadoop-3.1.2]$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.2.jar wordcount /test /output2
2019-08-12 11:45:40,303 INFO mapreduce.Job: Running job: job_1565581394614_0001
2019-08-12 11:46:03,644 INFO mapreduce.Job: Job job_1565581394614_0001 running in uber mode : false
2019-08-12 11:46:03,714 INFO mapreduce.Job: map 0% reduce 0%
2019-08-12 11:47:56,955 INFO mapreduce.Job: map 100% reduce 0%
2019-08-12 11:48:44,873 INFO mapreduce.Job: map 100% reduce 100%
2019-08-12 11:48:48,055 INFO mapreduce.Job: Job job_1565581394614_0001 completed successfully
2019-08-12 11:48:53,548 INFO mapreduce.Job: Counters: 53
當測試結束後,可以在命令行輸入:
[hadoop@master hadoop-3.1.2]$ hdfs dfs -cat /output2/*
brother 2
caojianhua 1
dear 1
hello 3
my 1
world 1
結果與單機版hadoop處理是一樣的。
也可以在web界面查看
至此,整個單臺機器安裝Hadoop以及配置Hadoo僞分佈式集羣就結束了。
總體過程還比較順利,都是邊實踐邊記錄,有幾個地方需要注意的是:
(1)本次使用的是Hadoop3.1.2版本,在配置和使用時與hadoop2.0版本稍微有所差別,尤其是mapred-site配置和後面的yarn-site配置,增加了內存分配比例設置。
(2)在使用web訪問hadoop時,端口號爲9870,而不是之前的50070.如果要查看YARN集羣狀況,在web瀏覽器地址欄輸入:
http://192.168.58.138:8088/cluster/,端口號爲8088.