hadoop2.7.5單機版安裝及wordCount執行
hadoop2.7.5單機版安裝
簡介
Hadoop主要完成兩件事,分散式儲存和分散式計算。
Hadoop主要由兩個核心部分組成:
1.HDFS:分散式檔案系統,用來儲存海量資料。
2.MapReduce:並行處理框架,實現任務分解和排程。
HDFS
是一個分散式檔案系統,用來儲存和讀取資料的。
檔案系統都有最小處理單元,而HDFS的處理單元是塊。HDFS儲存的檔案被分成塊進行儲存,預設的塊大小是64MB。
並且在HDFS中有兩類節點:
1.NameNode和DataNode。
NameNode:
NameNode是管理節點,存放檔案元資料。也就是存放著檔案和資料塊的對映表,資料塊和資料節點的對映表。
也就是說,通過NameNode,我們就可以找到檔案存放的地方,找到存放的資料。
DataNode:
DataNode是工作節點,用來存放資料塊,也就是檔案實際儲存的地方。
客戶端向NameNode發起讀取元資料的訊息,NameNode就會查詢它的Block Map,找到對應的資料節點。然後客戶端就可以去對應的資料節點中找到資料塊,拼接成檔案就可以了。這就是讀寫的流程。
作為分散式應用,為了達到軟體的可靠性,如圖上所示,每個資料塊都有三個副本,並且分佈在兩個機架上。
這樣一來,如果某個資料塊壞了,能夠從別的資料塊中讀取,而當如果一個機架都壞了,還可以從另一個機架上讀取,從而實現高可靠。
我們從上圖還可以看到,因為資料塊具有多個副本,NameNode要知道那些節點是存活的吧,他們之間的聯絡是依靠心跳檢測來實現的。這也是很多分散式應用使用的方法了。
我們還可以看到,NameNode也有一個Secondary NameNode,萬一NameNode出故障了,Secondary就會成替補,保證了軟體的可靠性。
HDFS具有什麼特點呢?
1.資料冗餘,軟體容錯很高。
2.流失資料訪問,也就是HDFS一次寫入,多次讀寫,並且沒辦法進行修改,只能刪除之後重新建立
3.適合儲存大檔案。如果是小檔案,而且是很多小檔案,連一個塊都裝不滿,並且還需要很多塊,就會極大浪費空間。
HDFS的適用性和侷限性:
1.資料批量讀寫,吞吐量高。
2.不適合互動式應用,延遲較高。
3.適合一次寫入多次讀取,順序讀取。
4.不支援多使用者併發讀寫檔案。
瞭解完了HDFS,就輪到MapReduce了。
MapReduce是什麼:
MapReduce是並行處理框架,實現任務分解和排程。
其實原理說通俗一點就是分而治之的思想,將一個大任務分解成多個小任務(map),小任務執行完了之後,合併計算結果(reduce)。
首先我們需要先知道幾個小概念:
1.job 2.task 3.jobTracker 4.taskTracker
job:在Hadoop內部,用Job來表示執行的MapReduce程式所需要用到的所有jar檔案和類的集合,>這些檔案最終都被整合到一個jar檔案中,將此jar檔案提交給JobTraker,MapReduce程式就會執行。
task:job會分成多個task。分為MapTask和ReduceTask。
jobTracker:管理節點。將job分解為多個map任務和reduce任務。
作用: 1.作業排程 2.分配任務,監控任務執行進度 3.監控TaskTracker狀態
taskTracker:任務節點。一般和dataNode為同一個節點,這樣計算可以跟著資料走,開銷最小化。
作用:
1.執行任務
2.彙報任務狀態
在MapReduce中,也有容錯機制。
1.重複執行。一個job最多被執行4次。
2.推測執行。因為Map全部算完之後才會執行Reduce,如果其中一個Map很慢,就會多開一個task來完成同樣的工作,哪個執行的快用哪個。
參考資料
基礎配置
基礎環境:Centos7.0 JDK1.8
關閉防火牆:
systemctl stop firewalld.service #停止firewall systemctl disable firewalld.service #禁止firewall開機啟動
修改hostname
sudo vim /etc/hosts
master master
** JAVA JDK安裝目錄 ** /mnt/java-1.8.0-232
##安裝hadooop
wget http://archive.apache.org/dist/hadoop/common/hadoop-2.7.5/hadoop-2.7.5.tar.gz
tar -zxvf hadoop-2.7.5.tar.gz
mv hadoop-2.7.5 /mnt
配置環境變數
[[email protected] mnt]# vi /etc/profile
[[email protected] mnt]# source /etc/profile
export HADOOP_HOME=/mnt/hadoop-2.7.5
export PATH=$PATH:$HADOOP_HOME/bin
檢視版本
[[email protected] mnt]# hadoop version
mkdir /mnt/hadoop
mkdir /mnt/hadoop/tmp
mkdir /mnt/hadoop/var
mkdir /mnt/hadoop/dfs
mkdir /mnt/hadoop/dfs/name
mkdir /mnt/hadoop/dfs/data
修改配置檔案
修改配置檔案cd /mnt/hadoop2.7.5/etc/hadoop/
core-site.xml hadoop-env.sh hdfs-site.xml mapred-site.xml
core-site.xml
vim core-site.xml 在下新增如下配置檔案
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>/mnt/hadoop/tmp</value>
<description>Abase for other temporary directories.</description>
</property>
<property>
<name>fs.default.name</name>
<value>hdfs://master:9000</value>
</property>
</configuration>
說明: master可以替換為主機的IP(叢集中多推薦hostname)
vim hadoop-env.sh 將${JAVA_HOME} 修改為自己的JDK路徑
export JAVA_HOME=/mnt/jdk1.8
hdfs-site.xml
修改 hdfs-site.xml 在新增:
<property>
<name>dfs.name.dir</name>
<value>/mnt/hadoop/dfs/name</value>
<description>Path on the local filesystem where theNameNode stores the namespace and transactions logs persistently.</description>
</property>
<property>
<name>dfs.data.dir</name>
<value>/mnt/hadoop/dfs/data</value>
<description>Comma separated list of paths on the localfilesystem of a DataNode where it should store its blocks.</description>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.permissions</name>
<value>false</value>
<description>need not permissions</description>
</property>
mapred-site.xml
修改mapred-site.xml,如果沒有此檔案,則 mv mapred-site.xml.template mapred-site.xml vim mapred-site.xml 修改這個新建的mapred-site.xml檔案,在節點內加入配置:
<property>
<name>mapred.job.tracker</name>
<value>master:9001</value>
</property>
<property>
<name>mapred.local.dir</name>
<value>/mnt/hadoop/var</value>
</property>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
Hadoop啟動
第一次啟動Hadoop需要初始化 切換到 /mnt/hadoop2.7.5/bin目錄下
1.初始格式化
./hadoop namenode -format
初始化成功後,可以在/mnt/hadoop/dfs/name 目錄下(該路徑在hdfs-site.xml檔案中進行了相應配置,並新建了該資料夾)新增了一個current 目錄以及一些檔案。
2.啟動Hadoop 主要是啟動HDFS和YARN 切換到/mnt/hadoop2.7.5/sbin目錄 啟動HDFS 輸入:
start-dfs.sh
全程yes,輸入密碼
3.啟動YARN 輸入:
start-yarn.sh
可以輸入 jps 檢視是否成功啟動
jps
57793 ResourceManager
57459 DataNode
57642 SecondaryNameNode
57355 NameNode
57885 NodeManager
57917 Jps
Hadoop啟動命令彙總
1.第一種方式
啟動:分別啟動HDFS和MapReduce
2.第二種方式
全部啟動或者全部停止
啟動:
啟動順序:NameNode,DateNode,SecondaryNameNode,JobTracker,TaskTracker
停止:
關閉順序性:JobTracker,TaskTracker,NameNode,DateNode,SecondaryNameNode
3.第三種啟動方式
每個守護執行緒逐一啟動,啟動順序如下:
NameNode,DateNode,SecondaryNameNode,JobTracker,TaskTracker
命令如下:
啟動:
hadoop-daemon.shdaemon(守護程序)
關閉命令:
datanode與tasktracker會分不到多臺機器上,從節點啟動,就使用
HDFS常用命令
hdfs dfs -ls / hdfs dfs -put file / hdfs dfs -mkdir /dirname hdfs dfs -text /filename hdfs dfs -rm /filename
##入門第一個程式WordCount
為了避免後面的測試出問題,請先修改如下配置 [[email protected] hadoop-2.7.5]# vi etc/hadoop/yarn-site.xml
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
修改後重啟hadoop
輸入源
建立資料
[[email protected] mnt]# mkdir input
[[email protected] mnt]# cd input/
[[email protected] input]# pwd
/mnt/input
[[email protected] input]# echo "hello world">test1.txt
[[email protected] input]# echo "hello hadoop">test2.txt
[[email protected] input]# cd /mnt/hadoop-2.7.5
提交資料來源到HDFS
[[email protected] hadoop-2.7.5]# hadoop fs -mkdir -p /mnt/hadoop/input
[[email protected] hadoop-2.7.5]# hadoop fs -ls /mnt/hadoop/input
[[email protected] hadoop-2.7.5]# hadoop fs -put /mnt/input/* /mnt/hadoop/input/
[[email protected] hadoop-2.7.5]# hadoop fs -ls /mnt/hadoop/input
Found 2 items
-rw-r--r-- 2 root supergroup 12 2018-09-14 05:12 /mnt/hadoop/input/test1.txt
-rw-r--r-- 2 root supergroup 13 2018-09-14 05:12 /mnt/hadoop/input/test2.txt
執行程式
[[email protected] hadoop-2.7.5]# hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar wordcount /mnt/hadoop/input out
執行完成輸出結果
[[email protected] hadoop-2.7.5]# hadoop dfs -cat out/*
DEPRECATED: Use of this script to execute hdfs command is deprecated.
Instead use the hdfs command for it.
hadoop 1
hello 2
world 1
遇到的問題
auxService:mapreduce_shuffle does not exist
Container launch failed for container_1536843899378_0001_01_000003 : org.apache.hadoop.yarn.exceptions.InvalidAuxServiceException: The auxService:mapreduce_shuffle does not exist
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
處理方式
[[email protected] hadoop-2.7.5]# vi etc/hadoop/yarn-site.xml
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
重啟hadoop
output already exists
除第一次執行外,每次執行時都會因為上次的執行產生一個輸出路徑,造成本次執行無法成功,因此需要手工刪除該了路徑才可以。
org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory hdfs://master:9000/user/root/out already exists
at org.apache.hadoop.mapreduce.lib.output.FileOutputFormat.checkOutputSpecs(FileOutputFormat.java:146)
at org.apache.hadoop.mapreduce.JobSubmitter.checkSpecs(JobSubmitter.java:266)
at org.apache.hadoop.mapreduce.JobSubmitter.submitJobInternal(JobSubmitter.java:139)
at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1290)
at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1287)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:422)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1754)
at org.apache.hadoop.mapreduce.Job.submit(Job.java:1287)
at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:1308)
at org.apache.hadoop.examples.WordCount.main(WordCount.java:87)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.hadoop.util.ProgramDriver$ProgramDescription.invoke(ProgramDriver.java:71)
at org.apache.hadoop.util.ProgramDriver.run(ProgramDriver.java:144)
at org.apache.hadoop.examples.ExampleDriver.main(ExampleDriver.java:74)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.hadoop.util.RunJar.run(RunJar.java:221)
at org.apache.hadoop.util.RunJar.main(RunJar.java:136)
處理方式:就是把提示埠號9000後面的那個路徑刪除既可,注意路徑不同
[[email protected] hadoop-2.7.5]# ./bin/hadoop fs -rmr /user/root/out
rmr: DEPRECATED: Please use 'rm -r' instead.
18/09/14 06:09:26 INFO fs.TrashPolicyDefault: Namenode trash configuration: Deletion interval = 0 minutes, Emptier interval = 0 minutes.
Deleted /user/root/out