1. 程式人生 > >hadoop2.7.5單機版安裝及wordCount執行

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

文件資料參考