基本概念:
1. Hadoop是一個分佈式文件系統的基礎架構,用戶可以利用集羣進行高速運算和存儲
2. Hadoop實現了一個分佈式文件系統(Hadoop Distributed File System),簡稱HDFS。HDFS有高容錯性的特點,並且設計用來部署在低廉的(low-cost)硬件上;而且它提供高吞吐量(high throughput)來訪問應用程序的數據,適合那些有着超大數據集(large data set)的應用程序。HDFS放寬了(relax)POSIX的要求,可以以流的形式訪問(streaming access)文件系統中的數據。
Hadoop的框架最核心的設計就是:HDFS和MapReduce。HDFS爲海量的數據提供了存儲,則MapReduce爲海量的數據提供了計算
3. Hdfs主要模塊:NameNode、DataNode
4. HDFS主要模塊及運行原理:
(1)NameNode:
功能:是整個文件系統的管理節點。維護整個文件系統的文件目錄樹,文件/目錄的元數據和每個文件對應的數據塊列表。接收用戶的請求
(2)DataNode:
功能:是HA(高可用性)的一個解決方案,是備用鏡像,但不支持熱備
5. Hadoop的三種模式:
(1)單機模式Local或Standalone Mode
默認情況下,Hadoop即處於該模式,用於開發和調試,使用本地文件系統,而不是分佈式文件系統,Hadoop不會啓動NameNode、DataNode、JobTracker、TaskTracker等守護進程。用於對MapReduce程序的邏輯進行調試,確保程序的正確
(2)僞分佈式模式(Pseudo-Distrubuted Mode)
- 模擬一個小規模的集羣,在一臺主機模擬多主機。
- Hadoop啓動NameNode、DataNode、JobTracker、TaskTracker這些守護進 程都在同一臺機器上運行,是相互獨立的Java進程
- 在這種模式下,Hadoop使用的是分佈式文件系統,各個作業也是由JobTraker服務,來管理的獨立進程。在單機模式之上增加了代碼調試功能,允許檢查內存使用情況,HDFS輸入輸出,類似於完全分佈式模式
(3)完全分佈式模式
- Hadoop守護進程運行在一個集羣上,hadoop的守護進程namenode,datanode,jobTracker,TaskTracker運行在多臺主機上,也就是一個集羣不同機器上
一、單機分佈式
1.創建hadoop用戶,將安裝包傳到hadoop的家目錄下
[root@server1 ~]# useradd hadoop
[root@server1 ~]# id hadoop
uid=1000(hadoop) gid=1000(hadoop) groups=1000(hadoop)
[root@server1 ~]# ls
hadoop-3.0.3.tar.gz jdk-8u181-linux-x64.tar.gz
[root@server1 ~]# mv * /home/hadoop/
[root@server1 ~]# su - hadoop
[hadoop@server1 ~]$ ls
hadoop-3.0.3.tar.gz jdk-8u181-linux-x64.tar.gz
2.解壓安裝包,創建軟連接
(1)jdk
[hadoop@server1 ~]$ tar zxf jdk-8u181-linux-x64.tar.gz
[hadoop@server1 ~]$ ls
hadoop-3.0.3.tar.gz jdk1.8.0_181 jdk-8u181-linux-x64.tar.gz
[hadoop@server1 ~]$ ln -s jdk1.8.0_181/ java
[hadoop@server1 ~]$ ls
hadoop-3.0.3.tar.gz java jdk1.8.0_181 jdk-8u181-linux-x64.tar.gz
(2)hadoop
[hadoop@server1 ~]$ tar zxf hadoop-3.0.3.tar.gz
[hadoop@server1 ~]$ ls
hadoop-3.0.3 java jdk-8u181-linux-x64.tar.gz
hadoop-3.0.3.tar.gz jdk1.8.0_181
[hadoop@server1 ~]$ ln -s hadoop-3.0.3 hadoop
[hadoop@server1 ~]$ ls
hadoop hadoop-3.0.3.tar.gz jdk1.8.0_181
hadoop-3.0.3 java jdk-8u181-linux-x64.tar.gz
3.配置java環境變量
[hadoop@server1 hadoop]$ pwd
/home/hadoop/hadoop/etc/hadoop
[hadoop@server1 hadoop]$ vim hadoop-env.sh
54 export JAVA_HOME=/home/hadoop/java
4.添加系統環境變量
[hadoop@server1 hadoop]$ cd
[hadoop@server1 ~]$ vim .bash_profile
PATH=$PATH:$HOME/.local/bin:$HOME/bin:$HOME/java/bin
[hadoop@server1 ~]$ source .bash_profile
配置完後可以執行jps命令
[hadoop@server1 ~]$ jps
11515 Jps
5.創建input目錄
[hadoop@server1 ~]$ ls
hadoop hadoop-3.0.3.tar.gz jdk1.8.0_181
hadoop-3.0.3 java jdk-8u181-linux-x64.tar.gz
[hadoop@server1 ~]$ cd hadoop
[hadoop@server1 hadoop]$ ls
bin include libexec NOTICE.txt sbin
etc lib LICENSE.txt README.txt share
[hadoop@server1 hadoop]$ mkdir input
[hadoop@server1 hadoop]$ cd input
[hadoop@server1 input]$ ls
[hadoop@server1 input]$
[hadoop@server1 input]$ cd ..
[hadoop@server1 hadoop]$
[hadoop@server1 hadoop]$ cp etc/hadoop/*.xml input
[hadoop@server1 hadoop]$ ls input/
6.執行完之後會生成一個output目錄
[hadoop@server1 hadoop]$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.0.3.jar grep input output 'dfs[a-z.]+'
[hadoop@server1 hadoop]$ ls
[hadoop@server1 hadoop]$ cd output/
[hadoop@server1 output]$ ls
part-r-00000 _SUCCESS
[hadoop@server1 output]$ cat *
1 dfsadmin
二、僞分佈式
存和取都是在分佈式文件系統中和本地文件系統沒有任何關係
1.切換到hadoop/etc/hadoop目錄下編輯文件,寫入的內容如下
[hadoop@server1 ~]$ ls
[hadoop@server1 ~]$ cd hadoop/etc/hadoop
[hadoop@server1 hadoop]$ ls
[hadoop@server1 hadoop]$ vim core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
[hadoop@server1 hadoop]$ vim hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
2.生成密鑰,做ssh免密,方便部署
[hadoop@server1 ~]$ ssh-keygen
[hadoop@server1 ~]$ logout
[root@server1 ~]# passwd hadoop
[root@server1 ~]# su - hadoop
[hadoop@server1 ~]$ ssh-copy-id 172.25.19.1 ##這三步的目的只是刷掉yes
[hadoop@server1 ~]$ ssh-copy-id localhost
[hadoop@server1 ~]$ ssh-copy-id server1
3.節點初始化
[hadoop@server1 ~]$ ls
[hadoop@server1 ~]$ cd hadoop
[hadoop@server1 hadoop]$ bin/hdfs namenode -format
4.開啓服務,開啓服務的腳本在sbin目錄下
[hadoop@server1 hadoop]$ cd sbin
[hadoop@server1 sbin]$ ls
[hadoop@server1 sbin]$ ./start-dfs.sh
Starting namenodes on [localhost]
Starting datanodes
Starting secondary namenodes [server1]
開啓之後可以執行jps看到如下信息(查看到的是進程號)
[hadoop@server1 sbin]$ jps
12241 DataNode
12579 Jps
12423 SecondaryNameNode
12142 NameNode
5.瀏覽器訪問172.25.19.1:9870可以看到web界面
這裏hdfs使用的端口是9870,但是各版本之間存在差異
6.測試:
(1)創建目錄
[hadoop@server1 hadoop]$ bin/hdfs dfs -mkdir /user
[hadoop@server1 hadoop]$ bin/hdfs dfs -mkdir /user/hadoop
[hadoop@server1 hadoop]$ bin/hdfs dfs -ls
(2)瀏覽器中utiltles—>browes the file system 查看文件,現在/user/hadoop下什麼都沒有
(3)上傳文件
[hadoop@server1 hadoop]$ bin/hdfs dfs -put input
[hadoop@server1 hadoop]$ bin/hdfs dfs -ls
Found 1 items
drwxr-xr-x - hadoop supergroup 0 2019-05-19 13:28 input
(4)瀏覽器中刷新,可以看到input 目錄,點擊可以看到具體有那些文件
注意:現在的input文件不是/home/hadoop/hadoop下的input
可以點擊input查看目錄中的文件
(5)刪除input和output目錄,再次生成(證明瀏覽器中的input目錄不是hadoop目錄下的同名目錄)
[hadoop@server1 hadoop]$ ls
[hadoop@server1 hadoop]$ rm -fr input/ output/
[hadoop@server1 hadoop]$ ls
在當前目錄中沒有input和output目錄,但是瀏覽器中依然存在input目錄
(6)再次生成output目錄,將這個包的內容統計爲單詞個數輸出到output
[hadoop@server1 hadoop]$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.0.3.jar wordcount input output
[hadoop@server1 hadoop]$ ls
(7)瀏覽器中刷新,查看output,有兩個文件 ,點一第一個出來的是他的大小
三、完全分佈式
首先將dfs文件系統中的內容清除
1.關閉服務,清楚原來的數據
因爲這一步是要做集羣,需要保證每一個節點上的數據是一致的,但是新加的兩個節點是全新的虛擬機,所以要將server1上的數據清除
[hadoop@server1 hadoop]$ sbin/stop-dfs.sh
Stopping namenodes on [localhost]
Stopping datanodes
Stopping secondary namenodes [server1]
[hadoop@server1 hadoop]$ cd /tmp/
[hadoop@server1 tmp]$ ls
hadoop hadoop-hadoop hsperfdata_hadoop
[hadoop@server1 tmp]$ ll
[hadoop@server1 tmp]$ rm -fr *
[hadoop@server1 tmp]$ ls
[hadoop@server1 tmp]$ cd
[hadoop@server1 ~]$ ls
退出hadoop用戶
[hadoop@server1 ~]$ logout
2.server2和server3創建hadoop用戶,三個節點都安裝nfs
server1:
[root@server1 ~]# yum install -y nfs-utils
server2:
[root@server2 ~]# useradd -u 1000 hadoop
[root@server2 ~]# yum install -y nfs-utils
server3:
[root@server3 ~]# useradd -u 1000 hadoop
[root@server3 ~]# yum install -y nfs-utils
3.三個節點都開啓rpcbind服務(這個服務默認是開機自啓動的)
[root@server1 ~]# systemctl start rpcbind
[root@server1 ~]# systemctl enable rpcbind
[root@server2 ~]# systemctl start rpcbind
[root@server3 ~]# systemctl start rpcbind
4.server1編輯配置文件,配置NFS文件系統
[root@server1 ~]# ls
[root@server1 ~]# vim /etc/exports
/home/hadoop *(rw,anonuid=1000,anongid=1000)
[root@server1 ~]# systemctl start nfs
文件內容如下:
掃描
[root@server1 ~]# exportfs -v
/home/hadoop <world>(rw,wdelay,root_squash,no_subtree_check,anonuid=1000,anongid=1000,sec=sys,rw,secure,root_squash,no_all_squash)
[root@server1 ~]# showmount -e
Export list for server1:
/home/hadoop *
5.server2和server3掛載
(這兩步實際上是在配置NFS文件系統,這樣的話後面的操作只需要在一server1上做便可以達到整個集羣都部署的效果)
server2:
[root@server2 ~]# showmount -e server1
Export list for server1:
/home/hadoop *
[root@server2 ~]# mount 172.25.19.1:/home/hadoop/ /home/hadoop/
[root@server2 ~]# df
server3:
[root@server3 ~]# systemctl start rpcbind
[root@server3 ~]# showmount -e server1
Export list for server1:
/home/hadoop *
[root@server3 ~]# mount 172.25.19.1:/home/hadoop/ /home/hadoop/
[root@server3 ~]# df
6.三個節點都切換到hadoop用戶,server2和server3同步了server1的hadoop家目錄下的內容
[root@server1 ~]# su - hadoop
Last login: Sun May 19 13:11:42 CST 2019 on pts/0
[hadoop@server1 ~]$ ls
[root@server2 ~]# su - hadoop
[hadoop@server2 ~]$ ls
[root@server3 ~]# su - hadoop
[hadoop@server3 ~]$ ls
7.server1將密鑰傳給server2和server3
這一步的目的是刷掉yes
因爲做好了nfs文件系統,這三個結點的數據現在是同步的,server1之前創了密鑰,所以現在每個節點中都是有密鑰的
[hadoop@server1 ~]$ ssh-copy-id 172.25.19.2
[hadoop@server1 ~]$ ssh-copy-id 172.25.19.3
8.編輯配置文件
(1)編輯 core-site.xml配置文件
[hadoop@server1 ~]$ ls
[hadoop@server1 ~]$ cd hadoop
[hadoop@server1 hadoop]$ cd etc/hadoop/
[hadoop@server1 hadoop]$ pwd
/home/hadoop/hadoop/etc/hadoop
[hadoop@server1 hadoop]$
[hadoop@server1 hadoop]$ vim core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://172.25.19.1:9000</value> ##這裏指向的是master的9000端口
</property>
</configuration>
(2)編輯hdfs-site.xml文件
[hadoop@server1 hadoop]$ vim hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>2</value> ##改爲兩個節點,集羣中存儲數據的只有2個節點
</property>
</configuration>
9.編輯worker文件,文件中的內容是datanode的ip
[hadoop@server1 hadoop]$ vim workers
[hadoop@server1 hadoop]$ cat workers
172.25.19.2
172.25.19.3
10.初始化並開啓服務
(1)初始化集羣
[hadoop@server1 hadoop]$ pwd
/home/hadoop/hadoop/etc/hadoop
[hadoop@server1 hadoop]$ cd ../..
[hadoop@server1 hadoop]$ pwd
/home/hadoop/hadoop
[hadoop@server1 hadoop]$ bin/hdfs namenode -format
(2)開啓服務
[hadoop@server1 hadoop]$ sbin/start-dfs.sh
Starting namenodes on [server1]
Starting datanodes
Starting secondary namenodes [server1]
jps查看server1只有namenode,server2和server3都是datanode
[hadoop@server1 hadoop]$ jps
14902 SecondaryNameNode
15035 Jps
14716 NameNode
server2和server3只有datanode
[hadoop@server2 ~]$ jps
11895 Jps
11834 DataNode
[hadoop@server3 ~]$ jps
11888 Jps
11826 DataNode
注意:datanode是真正存儲的節點 相當於mfs中的chunkserver
11.測試
(1)瀏覽器中查看,沒有任何文件
(2)創建目錄,上傳文件
[hadoop@server1 hadoop]$ bin/hdfs dfs -mkdir /user
[hadoop@server1 hadoop]$ bin/hdfs dfs -mkdir /user/hadoop
[hadoop@server1 hadoop]$ bin/hdfs dfs -put etc/hadoop/ input
[hadoop@server1 hadoop]$ ls
(3)瀏覽器中查看到input目錄,並且有內容
(4)假如上傳錯了文件,可以刪除
[hadoop@server1 hadoop]$ bin/hdfs dfs -rm -r input
Deleted input![在這裏插入圖片描述](https://img-blog.csdnimg.cn/2019071314504519.png)
(5)瀏覽器中查看,會報錯
退回到上一級目錄不會報錯,但是沒有數據
補充:
1.hadoop集羣要做到做到全網一致(時間同步 數據一致 )
2.主機名要求解析
3.output自動生成 不能手動建立否則會報錯
4.在做hadoop的時候不建議用超級用戶,因爲是分佈式文件系統,超級用戶的權限太大,不安全
5.單機版分佈式中本機既是namenode又是datanode
在完全分佈式中只有一臺namenode,可以有多臺datanode
6.NameNode 可以控制所有文件操作