【Hadoop】Hadoop 3.2.1 真?zhèn)畏植际酱罱?/h2>

本人目前也是在學習階段,如在文章中有不對的地方歡迎指正~
OK,正篇開始~

Hadoop是一個由Apache基金會所開發(fā)的分布式系統(tǒng)基礎架構。用戶可以在不了解分布式底層細節(jié)的情況下,開發(fā)分布式程序。充分利用集群的威力進行高速運算和存儲。Hadoop實現(xiàn)了一個分布式文件系統(tǒng)(Hadoop Distributed File System),簡稱HDFS。HDFS有高容錯性的特點,并且設計用來部署在低廉的(low-cost)硬件上;而且它提供高吞吐量(high throughput)來訪問應用程序的數(shù)據(jù),適合那些有著超大數(shù)據(jù)集(large data set)的應用程序。HDFS放寬了(relax)POSIX的要求,可以以流的形式訪問(streaming access)文件系統(tǒng)中的數(shù)據(jù)。Hadoop的框架最核心的設計就是:HDFS和MapReduce。HDFS為海量的數(shù)據(jù)提供了存儲,而MapReduce則為海量的數(shù)據(jù)提供了計算

目錄

  • 一、安裝環(huán)境
  • 二、基本環(huán)境準備
  • 三、Hadoop偽·分布式搭建
  • 四、Hadoop真·分布式搭建
  • 五、搭建時可能遇到的坑
  • 六、Hadoop基本使用
  • 七、MapReduce簡析
  • 八、參考并致謝

一、安裝環(huán)境

操作系統(tǒng):CentOS 7
Hadoop版本:3.2.1

真·分布式搭建:
主機:192.168.111.249
從機1:192.168.111.247
從機2:192.168.111.248

偽·分布式搭建:
主機:192.168.111.123

二、基本環(huán)境準備

1、搭建的幾種模式說明
  • 本地/獨立模式:下載Hadoop在系統(tǒng)中,默認情況下之后,它會被配置在一個獨立的模式,用于運行Java程序。
  • 模擬分布式模式:這是在單臺機器的分布式模擬。Hadoop守護每個進程,如 hdfs, yarn, MapReduce 等,都將作為一個獨立的java程序運行。這種模式對開發(fā)非常有用。
  • 完全分布式模式:這種模式是完全分布式的最小兩臺或多臺計算機的集群。
2、Hadoop與JDK兼容情況

Hadoop版本與JDK版本兼容關系大致可總結為:
hadoop版本>=2.7:要求Java 7(openjdk/oracle)
hadoop版本<=2.6:要求Java 6(openjdk/oracle)

3、該網(wǎng)站可查閱到當前最新版本

https://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/stable/

4、基礎環(huán)境準備

這里使用的是VMware 14開的虛擬機,CentOS 7操作系統(tǒng)最小安裝,并配置好網(wǎng)絡,至于虛擬機怎么搭建,操作系統(tǒng)怎么裝,網(wǎng)絡怎么配置不在此篇章中,可自行度娘參考
具體配置如下:

三、Hadoop偽·分布式搭建

1、Java環(huán)境搭建配置

yum安裝java

[root@bogon ~]# yum install java-1.8.0-openjdk* -y
java環(huán)境變量配置

which java定位到的是java程序的執(zhí)行路徑,而不是安裝路徑,經(jīng)過兩次-lrt最后的輸出才是安裝路徑

/etc/profile文件中追加三行
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.242.b08-0.el7_7.x86_64  
export HADOOP_HOME=/home/hadoop-3.2.1  
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
刷新環(huán)境變量
[root@bogon ~]# source /etc/profile
2、修改主機名
依次在/etc/hostname文件中寫入master
在/etc/hosts文件中,將主機名寫入
使用ping命令ping自己本機,并保證能ping通
3、配置免密登錄
檢查openssh-server是否已安裝
確保安裝了openssh-server后,執(zhí)行ssh-keygen -t rsa命令,然后回車(三次回車)
檢查openssh-server是否已安裝
[root@bogon ~]# rpm -qa | grep ssh
確保安裝了openssh-server后,每臺機器執(zhí)行ssh-keygen -t rsa,然后回車(三次回車)
生成的公鑰私鑰都保存在~/.ssh下,在master上將公鑰放入authorized_keys,命令如下
[root@bogon ~]# cat ~/.ssh/id_rsa.pub > ~/.ssh/authorized_keys
使用 ssh master測試,檢查是否成功配置免密登錄(第一次登錄會詢問是否同意免密登錄,之后登錄此詢問不再出現(xiàn))
安裝Hadoop
從網(wǎng)站中下載對應的版本(這里下載了3.2.1)到/home/目錄下
解壓文件
[root@bogon ~]# tar zxvf hadoop-3.2.1
進入到解壓后的目錄,創(chuàng)建hdfs目錄,進入到hdfs目錄,創(chuàng)建name,data,tmp三個目錄

說明
./hdfs/name --存儲namenode文件
./hdfs/data --存儲數(shù)據(jù)

./hdfs/tmp --存儲臨時文件

[root@bogon ~]# mkdir /home/hadoop-3.2.1/hdfs
[root@bogon ~]# mkdir /home/hadoop-3.2.1/hdfs/name  
[root@bogon ~]# mkdir /home/hadoop-3.2.1/hdfs/data
[root@bogon ~]# mkdir /home/hadoop-3.2.1/hdfs/tmp


修改配置文件

需要修改的文件和所在目錄如下所示,要注意的是,2.9版本的slaves文件在3.0版本后名稱改為workers

hadoop-env.sh
文件修改的是java的安裝路徑,跟一開始配置JAVA環(huán)境變量的時候寫的Java路徑一致

core-site.xml
在configuration標簽中插入如下內容

<property>
<!-- 文件系統(tǒng)用hdfs -->
<name>fs.default.name</name>
<!-- namenode的地址 -->
<value>hdfs://master:9090</value>
</property>
<!--臨時文件的存放目錄-->
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop-3.2.1/hdfs/tmp</value>
</property>

hdfs-site.xml
在configuration標簽中插入如下內容

<!-- hdfs的副本數(shù)量  -->
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<!-- 存儲namenode的路徑  -->
<property>
<name>dfs.name.dir</name>
<value>/home/hadoop-3.2.1/hdfs/name</value>
</property>
<!--存儲上傳數(shù)據(jù)的路徑-->
<property>
<name>dfs.data.dir</name>
<value>/home/hadoop-3.2.1/hdfs/data</value>
</property>
<!-- 設置為false可以不用檢查權限 -->
<property>
<name>dfs.permissions</name>
<value>false</value>
<property>
  <name>dfs.http.address</name>
  <value>0.0.0.0:50070</value>
</property>
<property>
  <name>dfs.namenode.rpc-address</name>
  <value>192.168.111.249:9000</value>
</property>

mapred-site.xml
在configration標簽之間插入如下內容:

<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
  <name>mapred.job.tracker.http.address</name>
  <value>0.0.0.0:50030</value>
</property>
<property>
  <name>mapred.task.tracker.http.address</name>
  <value>0.0.0.0:50060</value>
</property>

yarn-site.xml
在configuration標簽中寫入:

<!-- 指定yarn的resourcemanager地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>master</value>
</property>
<!-- reducer獲取數(shù)據(jù)方式 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 忽略虛擬內存的檢查,如果是在實體機上并且內存足夠多可以不用配置此項 -->
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>

workers
將文件中的localhost刪掉,然后改為本機的主機名master

如果是使用linux的root用戶啟動和使用hadoop的話,那還需要在以下文件添加以下配置
在/hadoop/sbin路徑下:

將start-dfs.sh,stop-dfs.sh兩個文件頂部添加以下參數(shù)

HDFS_DATANODE_USER=root
HADOOP_SECURE_DN_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

start-dfs.sh


stop-dfs.sh

start-yarn.sh

stop-yarn.sh

啟動前進行格式化
[root@bogon ~]# hadoop namenode -format


最后出現(xiàn)successfully formatted說明格式化成功
此時name目錄下會多出一個current文件夾

使用start-all.sh啟動
使用jps查看進程
在瀏覽器網(wǎng)頁端管理各個節(jié)點狀態(tài)

打開瀏覽器,訪問master IP:50070(如192.168.111.123:50070)即可進入到圖形管理界面

至此偽·分布式的Hadoop已搭建完畢

四、Hadoop真·分布式搭建

1、Java環(huán)境搭建配置

yum安裝java

[root@bogon ~]# yum install java-1.8.0-openjdk* -y
java環(huán)境變量配置

which java定位到的是java程序的執(zhí)行路徑,而不是安裝路徑,經(jīng)過兩次-lrt最后的輸出才是安裝路徑

/etc/profile文件中追加三行
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.242.b08-0.el7_7.x86_64  
export HADOOP_HOME=/home/hadoop-3.2.1  
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
刷新環(huán)境變量
[root@bogon ~]# source /etc/profile
2、修改主機名
依次在/etc/hostname文件中,主節(jié)點寫入master,從節(jié)點寫入node1或node2


依次在/etc/hosts文件中,將本機和所有節(jié)點的主機名寫入
使用ping相互測試,并保證能ping通



3、配置節(jié)點之間免密登錄

效果就是在master上輸入ssh node1即可登陸node1,否則開啟集群服務時,master與node無法連接,會報出connection refused

檢查openssh-server是否已安裝
[root@bogon ~]# rpm -qa | grep ssh
確保安裝了openssh-server后,每臺機器執(zhí)行ssh-keygen -t rsa,然后回車(三次回車)
生成的公鑰私鑰都保存在~/.ssh下,在master上將公鑰放入authorized_keys,命令如下
[root@bogon ~]# cat ~/.ssh/id_rsa.pub > ~/.ssh/authorized_keys
將master上的authorized_keys放到其它機器上
[root@bogon ~]# scp ~/.ssh/authorized_keys root@node1:~/.ssh/
[root@bogon ~]# scp ~/.ssh/authorized_keys root@node2:~/.ssh

在master端使用 ssh node1測試,node2使用同樣的方法測試
安裝Hadoop
從網(wǎng)站中下載對應的版本(這里下載了3.2.1)到/home/目錄下
解壓文件
[root@bogon ~]# tar zxvf hadoop-3.2.1
進入到解壓后的目錄,創(chuàng)建hdfs目錄,進入到hdfs目錄,創(chuàng)建name,data,tmp三個目錄

說明

./hdfs/name --存儲namenode文件
./hdfs/data --存儲數(shù)據(jù)
./hdfs/tmp --存儲臨時文件

[root@bogon ~]# mkdir /home/hadoop-3.2.1/hdfs
[root@bogon ~]# mkdir /home/hadoop-3.2.1/hdfs/name  
[root@bogon ~]# mkdir /home/hadoop-3.2.1/hdfs/data
[root@bogon ~]# mkdir /home/hadoop-3.2.1/hdfs/tmp


修改配置文件

需要修改的文件和所在目錄如下所示,要注意的是,2.9版本的slaves文件在3.0版本后名稱改為workers

hadoop-env.sh
文件修改的是java的安裝路徑,跟一開始配置JAVA環(huán)境變量的時候寫的Java路徑一致

core-site.xml
在configuration標簽中插入如下內容

<property>
<!-- 文件系統(tǒng)用hdfs -->
<name>fs.default.name</name>
<!-- namenode的地址 -->
<value>hdfs://master:9090</value>
</property>
<!--臨時文件的存放目錄-->
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop-3.2.1/hdfs/tmp</value>
</property>

hdfs-site.xml
在configuration標簽中插入如下內容

<!-- hdfs的副本數(shù)量  -->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!-- 存儲namenode的路徑  -->
<property>
<name>dfs.name.dir</name>
<value>/home/hadoop-3.2.1/hdfs/name</value>
</property>
<!--存儲上傳數(shù)據(jù)的路徑-->
<property>
<name>dfs.data.dir</name>
<value>/home/hadoop-3.2.1/hdfs/data</value>
</property>
<!-- 設置為false可以不用檢查權限 -->
<property>
<name>dfs.permissions</name>
<value>false</value>
<property>
  <name>dfs.http.address</name>
  <value>0.0.0.0:50070</value>
</property>
<property>
  <name>dfs.namenode.rpc-address</name>
  <value>192.168.111.249:9000</value>
</property>

注意: 注意以上配置文件中的dfs.namenode.rpc-address配置項,該配置項的值填寫namenode所在的服務器,如果需要用到Hbase、spark等組件的話一定要配置這一項,否則在Hbase啟動的時候會報拒絕連接的錯誤,如果有多個namenode,那么配置值中各個namenode的值用逗號隔開

mapred-site.xml
在configration標簽之間插入如下內容:

<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
  <name>mapred.job.tracker.http.address</name>
  <value>0.0.0.0:50030</value>
</property>
<property>
  <name>mapred.task.tracker.http.address</name>
  <value>0.0.0.0:50060</value>
</property>

yarn-site.xml
在configuration標簽中寫入:

<!-- 指定yarn的resourcemanager地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>master</value>
</property>
<!-- reducer獲取數(shù)據(jù)方式 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 忽略虛擬內存的檢查,如果是在實體機上并且內存足夠多可以不用配置此項 -->
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>

workers
將文件中的localhost刪掉,然后改為節(jié)點主機的主機名

如果是使用linux的root用戶啟動和使用hadoop的話,那還需要在以下文件添加以下配置
在/hadoop/sbin路徑下:

將start-dfs.sh,stop-dfs.sh兩個文件頂部添加以下參數(shù)

HDFS_DATANODE_USER=root
HADOOP_SECURE_DN_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

start-dfs.sh


stop-dfs.sh

start-yarn.sh

stop-yarn.sh

啟動前進行格式化
[root@bogon ~]# hadoop namenode -format


最后出現(xiàn)successfully formatted說明格式化成功
此時name目錄下會多出一個current文件夾

在master端start-all.sh啟動
使用jps查看進程

master端


node1端

node2端

在瀏覽器網(wǎng)頁端管理各個節(jié)點狀態(tài)

打開瀏覽器,訪問master IP:50070(如192.168.111.249:50070)即可進入到圖形管理界面

至此真·分布式的Hadoop已搭建完畢

五、搭建時可能遇到的坑

問題1:瀏覽器master IP:50070網(wǎng)頁打不開
思路1,檢查selinux、防火墻是否已關閉,需要關閉selinux和防火墻,同時檢查IP地址、端口號是否填寫正確
思路2:

在/hadoop/sbin路徑下:

將start-dfs.sh,stop-dfs.sh兩個文件頂部添加以下參數(shù)

HDFS_DATANODE_USER=root
HADOOP_SECURE_DN_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

start-dfs.sh


stop-dfs.sh

start-yarn.sh

stop-yarn.sh

此辦法從網(wǎng)上貼吧中尋得,其中解決人提到CentOS上會出現(xiàn)該問題,而Ubuntu則可以不用配置也可以正常訪問,此處沒做具體測試

問題2:在執(zhí)行start-all.sh時報Attempting to operate on hdfs namenode as root,but there is not HDFS_NAMENODE_USER defined. Aborting operation Sstating datanodes
思路:由于使用了root的用戶啟動Hadoop,而在啟動文件中沒有授權(或定義)該用戶,解決方法如下:

在/hadoop/sbin路徑下:
start-dfs.shstop-dfs.sh兩個文件頂部添加以下參數(shù)

HDFS_DATANODE_USER=root
HADOOP_SECURE_DN_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

1、然后刪除主節(jié)點(master)上name目錄下的文件夾(即我們一開始創(chuàng)建的hdfs/name這個目錄下)
2、從節(jié)點上(node1和node2)刪除data目錄下的文件夾
3、然后在主節(jié)點重啟執(zhí)行格式化命令
4、接著在start-all.sh啟動
5、如果是偽分布式的話也是同樣的操作

六、Hadoop基本使用

# 常用命令簡要總結  

# 啟動Hadoop  
start-all.sh  -- 此命令默認將hdfs和yarn也啟動
starth.sh -- 只啟動Hadoop
# 運行dfs  
start-dfs.sh  
# 運行yarn  
start-yarn.sh  
# 停止Hadoop  
stop-all.sh  -- 此命令默認將hdfs和yarn也停止  
stoph.sh  -- 只停止Hadoop  

# 顯示目錄結構  
hdfs dfs -ls -R /  
# 在hadoop指定目錄中創(chuàng)建新目錄  
hdfs dfs -mkdir /wei  
# 將本地文件夾存儲至Hadoop  
hdfs dfs -put [本地目錄] [hadoop目錄]  
# 將本地文件存儲值Hadoop  
hdfs dfs put [本地文件地址] [hadoop目錄]  
# 查看指定目錄下內容  
hdfs dfs -ls [目錄路徑]  
# 打開某個已存在的文件  
cat dfs -cat [文件路徑]  
# 在hadoop指定目錄新建一個空文件   
hdfs dfs -touchz [絕對路徑/文件名]  
# 將hadoop上某個文件重命名  
hdfs dfs -mv [絕對路徑/原文件名] [絕對路徑/新文件名]  
# 將hadoop上某個文件下載至本地已有目錄  
hdfs dfs -get [hadoop文件絕對路徑] [本地絕對路徑]  

# 將Hadoop指定目錄下所有文件內容保存為一個文件,同時下載至本地  
hdfs dfs -getmerge /wei/hadoop-file /home/wei/test.txt  
# 刪除hadoop上指定文件  
hdfs dfs -rm [文件地址]  
# 刪除hadoop上指定文件夾【包含子目錄】  
hdfs dfs -rm -r [目錄地址]
hdfs dfs -rmr [目錄地址]  
# 將正在運行的hadoop作業(yè)kill掉  
hadoop job -kill [job-id]  
# 查看命令幫助  
hdfs dfs -help  

# 退出安全模式(NameNode在啟動時會自動進入安全模式,安全模式是NameNode的一種狀態(tài),在這個階段,文件系統(tǒng)不允許有任何修改。
系統(tǒng)顯示Name node in safe mode,說明系統(tǒng)正處于安全模式,這時只需要等待幾十秒即可,也可通過下面的命令退出安全模式:)  
hadoop dfsadmin -safemode leave  

# 進入安全模式  
hadoop dfsadmin -safemode enter  

# 查看文件最后1kb內容  
hdfs dfs –tail /wei/test.txt  
# 修改HDFS系統(tǒng)中/user/sunlightcs目錄所屬群組,選項-R遞歸執(zhí)行,跟linux命令一樣 
hdfs dfs –chgrp [-R] /user/sunlightcs    

# 修改HDFS系統(tǒng)中/user/sunlightcs目錄擁有者,選項-R遞歸執(zhí)行 
hdfs dfs –chown [-R] /user/sunlightcs    

# 修改HDFS系統(tǒng)中/user/sunlightcs目錄權限,MODE可以為相應權限的3位數(shù)或+/-{rwx},選項-R遞歸執(zhí)行
hdfs dfs –chmod [-R] MODE /user/sunlightcs  

# 顯示該目錄中每個文件或目錄的大小
hdfs dfs –du PATH    

# 類似于du,PATH為目錄時,會顯示該目錄的總大小
hdfs dfs –dus PATH    

# 查看PATH目錄下,子目錄數(shù)、文件數(shù)、文件大小、文件名/目錄名
hdfs dfs –count [-q] PATH     

七、MapReduce簡析

MapReduce

Hadoop原理和處理機制是MapReduce,而MapReduce其實是Map和Reduce兩個步驟,其中,Map可以理解為將任務分布出去,而Reduce可以理解為將分出去的任務合并回來,如下圖所示:

Mapper與Reducer

1、Map步驟,當主節(jié)點收到一個任務請求時(如是一個計算的任務),它會將這個任務按照子節(jié)點的數(shù)量拆分成多個子任務并分發(fā)出去
2、子節(jié)點收到任務后進行計算和處理數(shù)據(jù)
3、Reduce步驟,當數(shù)據(jù)處理完時,這些子節(jié)點會將任務的結果返回給主節(jié)點,之后主節(jié)點將所有的結果進行合并,并完成整個數(shù)據(jù)處理流程的過程
以下一個圖是從網(wǎng)上找來的一個例子,可以幫助理解整個MapReduce的基本原理
Mapper與Reducer

八、參考并致謝

https://www.cnblogs.com/thousfeet/p/8618696.html
https://www.cnblogs.com/chaofan-/p/9740408.html
https://blog.csdn.net/suixinlun/article/details/81630902

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容