Hadoop分布式集群部署

一、系統參數配置優化

1、系統內核參數優化配置

修改文件/etc/sysctl.conf,添加如下配置,然后執行sysctl -p命令使配置生效

net.ipv4.conf.all.arp_notify = 1

kernel.shmmax = 500000000

kernel.shmmni = 4096

kernel.shmall = 4000000000

kernel.sem = 250 512000 100 2048

kernel.sysrq = 1

kernel.core_uses_pid = 1

kernel.msgmnb = 65536

kernel.msgmax = 65536

kernel.msgmni = 2048

net.ipv4.tcp_syncookies = 1

net.ipv4.ip_forward = 0

net.ipv4.conf.default.accept_source_route = 0

net.ipv4.tcp_tw_recycle = 1

net.ipv4.tcp_max_syn_backlog = 4096

net.ipv4.conf.all.arp_filter = 1

net.ipv4.ip_local_port_range = 1025 65535

net.core.netdev_max_backlog = 10000

net.core.rmem_max = 2097152

net.core.wmem_max = 2097152

vm.overcommit_memory = 2

2、修改Linux最大限制

追加如下配置到文件/etc/security/limits.conf

* soft nofile 65536

* hard nofile 65536

* soft nproc 131072

* hard nproc 131072

3、磁盤I/O優化調整

Linux磁盤I/O調度器對磁盤的訪問支持不同的策略,默認的為CFQ,建議設置為deadline。

我這里是sda磁盤,你需要根據你的磁盤進行IO調度策略設置,如下設置:

#echo deadline > /sys/block/sda/queue/scheduler

如果想永久生效,加入到/etc/rc.local即可。

以上3步都配置完畢后,重啟操作系統生效。


二、安裝前環境配置

1、部署環境清單說明

2、設置主機名

192.168.10.91:

#hostname hadoop-nn

#echo "hostname hadoop-nn" >> /etc/rc.local

192.168.10.92:

#hostname hadoop-snn

#echo "hostname hadoop-snn" >> /etc/rc.local

192.168.10.93:

#hostname hadoop-dn-01

#echo "hostname hadoop-dn-01" >> /etc/rc.local

?3、關閉防火墻(所有節點)

#systemctl stop firewalld

#systemctl disable firewalld

4、關閉SELinux(所有節點)

#setenforce 0

#sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

5、添加以下配置到/etc/hosts(所有節點)

192.168.10.91 hadoop-nn master

192.168.10.92 hadoop-snn slave01

192.168.10.93 hadoop-dn-01 slave02

6、NTP時間同步

在Hadoop namenode節點安裝ntp服務器,然后其他各個節點都同步namenode節點的時間。

192.168.10.91:

#yum -y install ntp

#systemctl start ntpd

#systemctl enable ntpd

然后在其他節點同步ntp時間。

192.168.10.92;192.168.10.93:

#yum -y install ntp

#ntpdate hadoop-nn

添加一個計劃任務,Hadoop需要各個節點時間的時間都是一致的,切記。


三、開始部署Hadoop

1、 安裝JAVA(所有節點)

#yum -y install java java-devel

查看java版本,確保此命令沒有問題

#java -version

openjdk version "1.8.0_161"

OpenJDK Runtime Environment (build 1.8.0_161-b14)

OpenJDK 64-Bit Server VM (build 25.161-b14, mixed mode)

另外openjdk安裝后,不會默許設置JAVA_HOME環境變量,要查看安裝后的目錄,可以用命令。

#update-alternatives --config jre_openjdk

There is 1 program that provides 'jre_openjdk'.

? Selection? ? Command

-----------------------------------------------

*+ 1? ? ? ? ? java-1.8.0-openjdk.x86_64 (/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.161-0.b14.el7_4.x86_64/jre)

默認jre目錄為:/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.161-0.b14.el7_4.x86_64/jre

設置環境變量,可用編輯/etc/profile.d/java.sh

#!/bin/bash

#

export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.161-0.b14.el7_4.x86_64

export CLASSPATH=$JAVA_HOME/lib/rt.jar:$JAVA_HOME/../lib/dt.jar:$JAVA_HOME/../lib/tools.jar

export PATH=$PATH:$JAVA_HOME/bin

完成這項操作之后,需要重新登錄,或source一下profile文件,以便環境變量生效,當然也可以手工運行一下,以即時生效

#source /etc/profile.d/java.sh

2、創建hadoop用戶(所有節點)

#useradd hadoop

#passwd hadoop

設置密碼,為簡單起見,3臺機器上的hadoop密碼最好設置成一樣,比如123456。為了方便,建議將hadoop加入root用戶組,操作方法:

#usermod -g root hadoop

執行完后hadoop即歸屬于root組了,可以再輸入id hadoop查看輸出驗證一下,如果看到類似下面的輸出:

#id hadoop

uid=1002(hadoop) gid=0(root) groups=0(root)

3、在NameNode節點創建秘鑰?

192.168.10.91:

創建RSA秘鑰對

#su - hadoop

$ssh-keygen

在NameNode節點復制公鑰到所有節點Hadoop用戶目錄下,包括自己:

$ssh-copy-id hadoop@192.168.10.91

$ssh-copy-id hadoop@192.168.10.92

$ssh-copy-id hadoop@192.168.10.93

4、解壓Hadoop二進制包并設置環境變量(所有節點)

#wget http://mirror.bit.edu.cn/apache/hadoop/common/hadoop-2.8.4/hadoop-2.8.4.tar.gz

#tar xf hadoop-2.8.4.tar.gz -C /usr/local/

#ln -sv /usr/local/hadoop-2.8.4/ /usr/local/hadoop

編輯環境配置文件/etc/profile.d/hadoop.sh,定義類似如下環境變量,設定Hadoop的運行環境。

#!/bin/bash

#

export HADOOP_PREFIX="/usr/local/hadoop"

export PATH=$PATH:$HADOOP_PREFIX/bin:$HADOOP_PREFIX/sbin

export HADOOP_COMMON_HOME=${HADOOP_PREFIX}

export HADOOP_HDFS_HOME=${HADOOP_PREFIX}

export HADOOP_MAPRED_HOME=${HADOOP_PREFIX}

export HADOOP_YARN_HOME=${HADOOP_PREFIX}

創建數據和日志目錄:

#mkdir -pv /data/hadoop/hdfs/{nn,snn,dn}

#chown -R hadoop:hadoop /data/hadoop/hdfs

#mkdir -pv /var/log/hadoop/yarn

#chown -R hadoop:hadoop /var/log/hadoop/yarn

而后,在Hadoop的安裝目錄中創建logs目錄,并修改Hadoop所有文件的屬主和屬組。

#cd /usr/local/hadoop

#mkdir logs

#chmod g+w logs

#chown -R hadoop:hadoop ./*


四、配置所有Hadoop節點

1、hadoop-nn節點

需要配置以下幾個文件。

core-site.xml

core-size.xml文件包含了NameNode主機地址以及其監聽RPC端口等信息(NameNode默認使用的RPC端口為8020),對于分布式環境,每個節點都需要設置NameNode主機地址,其簡要的配置內容如下所示:

#su - hadoop

$vim /usr/local/hadoop/etc/hadoop/core-site.xml

添加以下配置:

<configuration>

????<property>

????????<name>fs.defaultFS</name>

????????<value>hdfs://master:8020</value>

? ? ? ? <final>true</final>

????</property>

</configuration>

hdfs-site.xml

hdfs-site.xml主要用于配置HDFS相關的屬性,例如復制因子(即數據塊的副本數),NN和DN用于存儲數據的目錄等。數據塊的副本數對于分布式的Hadoop應該為3,這里我設置為2,為了減少磁盤使用。而NN和DN用于存儲數據的目錄為前面的步驟中專門為其創建的路徑。另外,前面的步驟中也為SNN創建了相關的目錄,這里也一并配置為啟用狀態。

#su - hadoop

$vim /usr/local/hadoop/etc/hadoop/hdfs-site.xml

<configuration>

? ? ? ? <property>

? ? ? ? ? ? ? ? <name>dfs.replication</name>

? ? ? ? ? ? ? ? <value>2</value>? ??

? ? ? ? </property>

? ? ? ? <property>

? ? ? ? ? ? ? ? <name>dfs.namenode.name.dir</name>

? ? ? ? ? ? ? ? <value>file:///data/hadoop/hdfs/nn</value>

? ? ? ? </property>

? ? ? ? <property>

? ? ? ? ? ? ? ? <name>dfs.datanode.data.dir</name>

? ? ? ? ? ? ? ? <value>file:///data/hadoop/hdfs/dn</value>

? ? ? ? </property>

? ? ? ?<property>

? ? ? ? ? ? ? ? <name>fs.checkpoint.dir</name>

? ? ? ? ? ? ? ? <value>file:///data/hadoop/hdfs/snn</value>

? ? ? ? </property>

? ? ? ? <property>

? ? ? ? ? ? ? ? <name>fs.checkpoint.edits.dir</name>

? ? ? ? ? ? ? ? <value>file:///data/hadoop/hdfs/snn</value>

? ? ? ? </property>

? ? ? ? <property>

? ? ? ? ? ? ? ? <name>dfs.permissions</name>

? ? ? ? ? ? ? ? <value>false</value>

? ? ? ? </property>

</configuration>

mapred-site.xml

mapred-site.xml文件用于配置集群的MapReduce framework,此處應該指定使用yarn,另外的可用值還有local和classic。mapred-site.xml默認不存在,但有模版文件mapred-site.xml.template,只需要將其復制為mapred-site.xml即可。

#su - hadoop

$cp -fr /usr/local/hadoop/etc/hadoop/mapred-site.xml.template /usr/local/hadoop/etc/hadoop/mapred-site.xml

$vim /usr/local/hadoop/etc/hadoop/mapred-site.xml

<configuration>

? ? ? ? <property>

? ? ? ? ? ? ? ? <name>mapreduce.framework.name</name>

? ? ? ? ? ? ? ? <value>yarn</value>

? ? ? ? </property>

</configuration>

yarn-site.xml

yarn-site.xml用于配置YARN進程及YARN的相關屬性,首先需要指定ResourceManager守護進程的主機和監聽的端口(這里ResourceManager準備安裝在NameNode節點);其次需要指定ResourceMnager使用的scheduler,以及NodeManager的輔助服務。一個簡要的配置示例如下所示:

$vim?/usr/local/hadoop/etc/hadoop/yarn-site.xml

<configuration>

????<property>

????????<name>yarn.resourcemanager.address</name>

????????<value>master:8032</value>

????</property>

????<property>

????????<name>yarn.resourcemanager.scheduler.address</name>

????????<value>master:8030</value>

????</property>

????<property>

????????<name>yarn.resourcemanager.resource-tracker.address</name>

????????<value>master:8031</value>

????</property>

????<property>

????????<name>yarn.resourcemanager.admin.address</name>

????????<value>master:8033</value>

????</property>

????<property>

????????<name>yarn.resourcemanager.webapp.address</name>

????????<value>master:8088</value>

????</property>

????<property><name>yarn.nodemanager.aux-services</name>

????????<value>mapreduce_shuffle</value>

????</property>

????<property>

????????<name>yarn.nodemanager.auxservices.mapreduce_shuffle.class</name>

????????<value>org.apache.hadoop.mapred.ShuffleHandler</value>

????</property>

????<property>

????????<name>yarn.resourcemanager.scheduler.class</name>

????????<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value>

????</property>

</configuration>

hadoop-env.sh和yarn-env.sh

Hadoop的各個守護進程依賴于JAVA_HOME環境變量,如果有類似于前面步驟中通過/etc/profile.d/java.sh全局配置定義的JAVA_HOME變量即可正常使用。不過,如果想為Hadoop定義依賴到特定JAVA環境,也可以編輯這兩個腳本文件,為其JAVA_HOME取消注釋并配置合適的值即可。此外,Hadoop大多數守護進程默認使用的堆大小為1GB,但現實應用中,可能需要對其各類進程的堆內存大小做出調整,這只需要編輯此兩者文件中相關環境變量值即可,例如HADOOP_HEAPSIZE、HADOOP_JOB_HISTORY_HEADPSIZE、JAVA_HEAP_SIZE和YARN_HEAP_SIZE等。

slaves文件

slaves文件存儲于了當前集群的所有slave節點的列表,默認值為localhost。這里我打算在三個節點都安裝DataNode,所以都添加進去即可。

#su - hadoop

$vim /usr/local/hadoop/etc/hadoop/slaves

hadoop-nn

hadoop-snn

hadoop-dn-01

到目前為止,第一個節點(Master)已經配置好了。在hadoop集群中,所有節點的配置都應該是一樣的,前面我們也為slaves節點創建了Hadoop用戶、數據目錄以及日志目錄等配置。

接下來就是把Master節點的配置文件都同步到所有Slaves即可。

#su - hadoop

$scp /usr/local/hadoop/etc/hadoop/* hadoop@hadoop-snn:/usr/local/hadoop/etc/hadoop/

$scp /usr/local/hadoop/etc/hadoop/* hadoop@hadoop-dn-01:/usr/local/hadoop/etc/hadoop/


五、格式化HDFS

在HDFS的NameNode啟動之前需要先初始化其用于存儲數據的目錄,如果hdfs-site.xml中dfs.namenode.name.dir屬性指定的目錄不存在,格式化命令會自動創建之;如果事先存在,請確保其權限設置正確,此時格式操作會清除其內部的所有數據并重新建立一個新的文件系統。需要以hdfs用戶的身份執行如下命令。

[hadoop@hadoop-nn ~]$hdfs namenode -format

其輸出會有大量的信息輸出,如果顯示出類似”INFO common.Storage: Storage directory /data/hadoop/hdfs/nn has been successfully formatted.“的結果表示格式化操作已經完成。


六、啟動Hadoop集群

啟動Hadood集群的方法有兩種:一是在各節點分別啟動需要啟動的服務,二是在NameNode節點啟動整個集群(推薦方法)。

1、分別啟動方式

Master節點需要啟動HDFS的NameNode、SecondaryNameNode、DataNode服務,以及YARN的ResourceManager服務。

[hadoop@hadoop-nn ~]$hadoop-daemon.sh start namenode

[hadoop@hadoop-nn ~]$hadoop-daemon.sh start secondarynamenode

[hadoop@hadoop-nn ~]$hadoop-daemon.sh start datanode

[hadoop@hadoop-nn ~]$yarn-daemon.sh start resourcemanager

各Slave節點需要啟動HDFS的DataNode服務,以及YARN的NodeManager服務。

[hadoop@hadoop-nn ~]$hadoop-daemon.sh start datanode

[hadoop@hadoop-nn ~]$yarn-daemon.sh start nodemanager

2、集群啟動方式

集群規模較大時,分別啟動各節點的各服務過于繁瑣和低效,為此,Hadoop專門提供了start-dfs.sh和stop-dfs.sh來啟動及停止整個hdfs集群,以及start-yarn.sh和stop-yarn.sh來啟動及停止整個yarn集群。

[hadoop@hadoop-nn ~]$start-dfs.sh

[hadoop@hadoop-nn ~]$start-yarn.sh

較早版本的Hadoop會提供start-all.sh和stop-all.sh腳本來統一控制hdfs和mapreduce,但Hadoop 2.0及之后的版本不建議再使用此種方式。

2.1、啟動HDFS集群

[hadoop@hadoop-nn ~]$start-dfs.sh

Starting namenodes on [master]

master: starting namenode, logging to /usr/local/hadoop/logs/hadoop-hadoop-namenode-hadoop-nn.out

hadoop-dn-01: starting datanode, logging to /usr/local/hadoop/logs/hadoop-hadoop-datanode-hadoop-dn-01.out

hadoop-nn: starting datanode, logging to /usr/local/hadoop/logs/hadoop-hadoop-datanode-hadoop-nn.out

hadoop-snn: starting datanode, logging to /usr/local/hadoop/logs/hadoop-hadoop-datanode-hadoop-snn.out

Starting secondary namenodes [0.0.0.0]

0.0.0.0: starting secondarynamenode, logging to /usr/local/hadoop/logs/hadoop-hadoop-secondarynamenode-hadoop-nn.out

HDFS集群啟動完成后,可在各節點以jps命令等驗證各進程是否正常運行,也可以通過Web UI來檢查集群的運行狀態。

查看NameNode節點啟動的進程:

hadoop-nn:

[hadoop@hadoop-nn ~]$ jps

14576 NameNode

14887 SecondaryNameNode

14714 DataNode

15018 Jps

[hadoop@hadoop-nn ~]$ netstat -anplt | grep java

(Not all processes could be identified, non-owned process info

will not be shown, you would have to be root to see it all.)

tcp????????0??????0 0.0.0.0:50090?????????? 0.0.0.0:*?????????????? LISTEN??????16468/java??????????

tcp????????0??????0 127.0.0.1:58545???????? 0.0.0.0:*?????????????? LISTEN??????16290/java??????????

tcp????????0??????0 10.10.0.186:8020????????0.0.0.0:*?????????????? LISTEN??????16146/java??????????

tcp????????0??????0 0.0.0.0:50070?????????? 0.0.0.0:*?????????????? LISTEN??????16146/java??????????

tcp????????0??????0 0.0.0.0:50010?????????? 0.0.0.0:*?????????????? LISTEN??????16290/java??????????

tcp????????0??????0 0.0.0.0:50075?????????? 0.0.0.0:*?????????????? LISTEN??????16290/java??????????

tcp????????0??????0 0.0.0.0:50020?????????? 0.0.0.0:*?????????????? LISTEN??????16290/java??????????

tcp????????0??????0 10.10.0.186:32565?????? 10.10.0.186:8020????????ESTABLISHED 16290/java??????????

tcp????????0??????0 10.10.0.186:8020????????10.10.0.186:32565?????? ESTABLISHED 16146/java??????????

tcp????????0??????0 10.10.0.186:8020????????10.10.0.188:11681?????? ESTABLISHED 16146/java??????????

tcp????????0??????0 10.10.0.186:8020????????10.10.0.187:57112?????? ESTABLISHED 16146/java??????????

查看DataNode節點啟動進程:

hadoop-snn:

[hadoop@hadoop-snn ~]$ jps

741 DataNode

862 Jps

[hadoop@hadoop-snn ~]$ netstat -anplt | grep java

(Not all processes could be identified, non-owned process info

will not be shown, you would have to be root to see it all.)

tcp????????0??????0 0.0.0.0:50010?????????? 0.0.0.0:*?????????????? LISTEN??????1042/java??????????

tcp????????0??????0 0.0.0.0:50075?????????? 0.0.0.0:*?????????????? LISTEN??????1042/java??????????

tcp????????0??????0 127.0.0.1:18975???????? 0.0.0.0:*?????????????? LISTEN??????1042/java??????????

tcp????????0??????0 0.0.0.0:50020?????????? 0.0.0.0:*?????????????? LISTEN??????1042/java??????????

tcp????????0??????0 10.10.0.187:57112?????? 10.10.0.186:8020????????ESTABLISHED 1042/java

hadoop-dn-01:

[hadoop@hadoop-dn-01 ~]$ jps

410 DataNode

539 Jps

通過JPS命令和開啟的端口基本可以看出,NameNode、SecondaryNameNode、DataNode進程各自開啟的對應端口。另外,可以看到DataNode都正常連接到了NameNode的8020端口。如果相關節點起不來,可能是權限不對,或者相關目錄沒有創建,具體可以看相關節點的日志:/usr/local/hadoop/logs/*.log。

通過NameNode節點的http://hadoop-nn:50070訪問Web UI界面:

可以看到3個DataNode節點都運行正常。

此時其實HDFS集群已經好了,就可以往里面存儲數據了,下面簡單使用HDFS命令演示一下:

在HDFS集群創建目錄:

[hadoop@hadoop-nn ~]$ hdfs dfs -mkdir /test ? ?

如果出現報錯:mkdir: Cannot create directory /test. Name node is in safe mode.

則需要執行命令:

[hadoop@hadoop-nn ~]$?hadoop dfsadmin -safemode leave

上傳文件到HDFS集群:

[hadoop@hadoop-nn ~]$ hdfs dfs -put /etc/fstab /test/fstab

[hadoop@hadoop-nn ~]$ hdfs dfs -put /etc/init.d/functions /test/functions

查看HDFS集群的文件:

[hadoop@hadoop-nn ~]$ hdfs dfs -ls /test/

Found 2 items

-rw-r--r--?? 2 hadoop supergroup????????524 2017-06-14 01:49 /test/fstab

-rw-r--r--?? 2 hadoop supergroup??????13948 2017-06-14 01:50 /test/functions

然后我們再看一下Hadoop Web UI界面:


可以看到Blocks字段,在所有節點共占用4個塊,HDFS默認未64M一個塊大小。由于我們上傳的文件太小,所以也沒有做切割,我們再啟動集群時設置的是2個副本,所以這里就相當于存儲了兩份。

HDFS集群管理命令

6.2、啟動YARN集群

[hadoop@hadoop-nn ~]$start-yarn.sh

starting yarn daemons

starting resourcemanager, logging to /usr/local/hadoop/logs/yarn-hadoop-resourcemanager-hadoop-nn.out

hadoop-nn: starting nodemanager, logging to /usr/local/hadoop/logs/yarn-hadoop-nodemanager-hadoop-nn.out

hadoop-dn-01: starting nodemanager, logging to /usr/local/hadoop/logs/yarn-hadoop-nodemanager-hadoop-dn-01.out

hadoop-snn: starting nodemanager, logging to /usr/local/hadoop/logs/yarn-hadoop-nodemanager-hadoop-snn.out

YARN集群啟動完成后,可在各節點以jps命令等驗證各進程是否正常運行。

hadoop-nn:

[hadoop@c0a80a5b logs]$jps

4120 DataNode

1898 NameNode

2474 SecondaryNameNode

2922 NodeManager

2701 ResourceManager

5646 Jps

hadoop-snn:

[hadoop@hadoop-snn ~]$ jps

10415 NodeManager

11251 Jps

9984 DataNode

hadoop-dn-01:

[hadoop@hadoop-dn-01 ~]$ jps

10626 NodeManager

10020 DataNode

11423 Jps

通過JPS命令和開啟的端口基本可以看出ResourceManager、NodeManager進程都各自啟動。另外,NodeManager會在對應的DataNode節點都啟動。

通過ResourceManager節點的http://hadoop-nn:8088訪問Web UI界面:

YARN集群管理命令

YARN命令有許多子命令,大體可分為用戶命令和管理命令兩類。直接運行yarn命令,可顯示其簡單使用語法及各子命令的簡單介紹:

這些命令中,jar、application、node、logs、classpath和version是常用的用戶命令,而resourcemanager、nodemanager、proxyserver、rmadmin和daemonlog是較為常用的管理類命令。


七、運行YARN應用程序

YARN應用程序(Application)可以是一個簡單的shell腳本、MapReduce作業或其它任意類型的作業。需要運行應用程序時,客戶端需要事先生成一個ApplicationMaster,而后客戶端把application context提交給ResourceManager,隨后RM向AM分配內存及運行應用程序的容器。大體來說,此過程分為六個階段。

1、Application初始化及提交;

2、分配內存并啟動AM;

3、AM注冊及資源分配;

4、啟動并監控容器;

5、Application進度報告;

6、Application運行完成;

下面我們來利用搭建好的Hadoop平臺處理一個任務,看一下這個流程是怎樣的。Hadoop安裝包默認提供了以下運行示例,如下操作:

[hadoop@c0a80a5b logs]$yarn jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.8.4.jar

An example program must be given as the first argument.

Valid program names are:

? aggregatewordcount: An Aggregate based map/reduce program that counts the words in the input files.

? aggregatewordhist: An Aggregate based map/reduce program that computes the histogram of the words in the input files.

? bbp: A map/reduce program that uses Bailey-Borwein-Plouffe to compute exact digits of Pi.

? dbcount: An example job that count the pageview counts from a database.

? distbbp: A map/reduce program that uses a BBP-type formula to compute exact bits of Pi.

? grep: A map/reduce program that counts the matches of a regex in the input.

? join: A job that effects a join over sorted, equally partitioned datasets

? multifilewc: A job that counts words from several files.

? pentomino: A map/reduce tile laying program to find solutions to pentomino problems.

? pi: A map/reduce program that estimates Pi using a quasi-Monte Carlo method.

? randomtextwriter: A map/reduce program that writes 10GB of random textual data per node.

? randomwriter: A map/reduce program that writes 10GB of random data per node.

? secondarysort: An example defining a secondary sort to the reduce.

? sort: A map/reduce program that sorts the data written by the random writer.

? sudoku: A sudoku solver.

? teragen: Generate data for the terasort

? terasort: Run the terasort

? teravalidate: Checking results of terasort

? wordcount: A map/reduce program that counts the words in the input files.

? wordmean: A map/reduce program that counts the average length of the words in the input files.

? wordmedian: A map/reduce program that counts the median length of the words in the input files.

? wordstandarddeviation: A map/reduce program that counts the standard deviation of the length of the words in the input files.

我們找一個比較好理解的wordcount進行測試,還記得我們剛開始提供一個funcations文件到了HDFS集群中,下面我們就把funcations這個文件進行單詞統計處理,示例如下:

[hadoop@c0a80a5b logs]$yarn jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.8.4.jar wordcount /test/fstab /test/functions /test/wc

18/04/26 20:11:52 INFO client.RMProxy: Connecting to ResourceManager at master/192.168.10.91:8032

18/04/26 20:11:53 INFO input.FileInputFormat: Total input files to process : 2

18/04/26 20:11:53 INFO mapreduce.JobSubmitter: number of splits:2

18/04/26 20:11:54 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1524741305301_0001

18/04/26 20:11:54 INFO impl.YarnClientImpl: Submitted application application_1524741305301_0001

18/04/26 20:11:54 INFO mapreduce.Job: The url to track the job: http://master:8088/proxy/application_1524741305301_0001/

18/04/26 20:11:54 INFO mapreduce.Job: Running job: job_1524741305301_0001

18/04/26 20:12:04 INFO mapreduce.Job: Job job_1524741305301_0001 running in uber mode : false

18/04/26 20:12:04 INFO mapreduce.Job:? map 0% reduce 0%

18/04/26 20:12:11 INFO mapreduce.Job:? map 50% reduce 0%

18/04/26 20:12:12 INFO mapreduce.Job:? map 100% reduce 0%

18/04/26 20:12:18 INFO mapreduce.Job:? map 100% reduce 100%

18/04/26 20:12:18 INFO mapreduce.Job: Job job_1524741305301_0001 completed successfully

18/04/26 20:12:18 INFO mapreduce.Job: Counters: 49

? ? ? ? File System Counters

? ? ? ? ? ? ? ? FILE: Number of bytes read=10779

? ? ? ? ? ? ? ? FILE: Number of bytes written=494063

? ? ? ? ? ? ? ? FILE: Number of read operations=0

? ? ? ? ? ? ? ? FILE: Number of large read operations=0

? ? ? ? ? ? ? ? FILE: Number of write operations=0

? ? ? ? ? ? ? ? HDFS: Number of bytes read=15880

? ? ? ? ? ? ? ? HDFS: Number of bytes written=8015

? ? ? ? ? ? ? ? HDFS: Number of read operations=9

? ? ? ? ? ? ? ? HDFS: Number of large read operations=0

? ? ? ? ? ? ? ? HDFS: Number of write operations=2

? ? ? ? Job Counters

? ? ? ? ? ? ? ? Launched map tasks=2

? ? ? ? ? ? ? ? Launched reduce tasks=1

? ? ? ? ? ? ? ? Data-local map tasks=2

? ? ? ? ? ? ? ? Total time spent by all maps in occupied slots (ms)=8926

? ? ? ? ? ? ? ? Total time spent by all reduces in occupied slots (ms)=5022

? ? ? ? ? ? ? ? Total time spent by all map tasks (ms)=8926

? ? ? ? ? ? ? ? Total time spent by all reduce tasks (ms)=5022

? ? ? ? ? ? ? ? Total vcore-milliseconds taken by all map tasks=8926

? ? ? ? ? ? ? ? Total vcore-milliseconds taken by all reduce tasks=5022

? ? ? ? ? ? ? ? Total megabyte-milliseconds taken by all map tasks=9140224

? ? ? ? ? ? ? ? Total megabyte-milliseconds taken by all reduce tasks=5142528

? ? ? ? Map-Reduce Framework

? ? ? ? ? ? ? ? Map input records=666

? ? ? ? ? ? ? ? Map output records=2210

? ? ? ? ? ? ? ? Map output bytes=22507

? ? ? ? ? ? ? ? Map output materialized bytes=10785

? ? ? ? ? ? ? ? Input split bytes=192

? ? ? ? ? ? ? ? Combine input records=2210

? ? ? ? ? ? ? ? Combine output records=692

? ? ? ? ? ? ? ? Reduce input groups=686

? ? ? ? ? ? ? ? Reduce shuffle bytes=10785

? ? ? ? ? ? ? ? Reduce input records=692

? ? ? ? ? ? ? ? Reduce output records=686

? ? ? ? ? ? ? ? Spilled Records=1384

? ? ? ? ? ? ? ? Shuffled Maps =2

? ? ? ? ? ? ? ? Failed Shuffles=0

? ? ? ? ? ? ? ? Merged Map outputs=2

? ? ? ? ? ? ? ? GC time elapsed (ms)=201

? ? ? ? ? ? ? ? CPU time spent (ms)=2080

? ? ? ? ? ? ? ? Physical memory (bytes) snapshot=711757824

? ? ? ? ? ? ? ? Virtual memory (bytes) snapshot=6615576576

? ? ? ? ? ? ? ? Total committed heap usage (bytes)=492306432

? ? ? ? Shuffle Errors

? ? ? ? ? ? ? ? BAD_ID=0

? ? ? ? ? ? ? ? CONNECTION=0

? ? ? ? ? ? ? ? IO_ERROR=0

? ? ? ? ? ? ? ? WRONG_LENGTH=0

? ? ? ? ? ? ? ? WRONG_MAP=0

? ? ? ? ? ? ? ? WRONG_REDUCE=0

? ? ? ? File Input Format Counters

? ? ? ? ? ? ? ? Bytes Read=15688

? ? ? ? File Output Format Counters

? ? ? ? ? ? ? ? Bytes Written=8015

我們把統計結果放到HDFS集群的/test/wc目錄下。另外,注意當輸出目錄存在時執行任務會報錯。

任務運行時,你可以去Hadoop管理平臺(8088端口)看一下會有如下類似的輸出信息,包括此次應用名稱,運行用戶、任務名稱、應用類型、執行時間、執行狀態、以及處理進度。

然后我們可以看一下/test/wc目錄下有什么:

[hadoop@c0a80a5b logs]$hdfs dfs -ls /test/wc

Found 2 items

-rw-r--r--? 2 hadoop supergroup? ? ? ? ? 0 2018-04-26 20:12 /test/wc/_SUCCESS

-rw-r--r--? 2 hadoop supergroup? ? ? 8015 2018-04-26 20:12 /test/wc/part-r-00000

看一下單詞統計結果:

八、開啟歷史服務

當運行過Yarn任務之后,在Web UI界面可以查看其狀態信息。但是當ResourceManager重啟之后,這些任務就不可見了。所以可以通過開啟Hadoop歷史服務來查看歷史任務信息。

Hadoop開啟歷史服務可以在web頁面上查看Yarn上執行job情況的詳細信息。可以通過歷史服務器查看已經運行完的Mapreduce作業記錄,比如用了多少個Map、用了多少個Reduce、作業提交時間、作業啟動時間、作業完成時間等信息。

[hadoop@c0a80a5b logs]$mr-jobhistory-daemon.sh start historyserver

starting historyserver, logging to /usr/local/hadoop/logs/mapred-hadoop-historyserver-c0a80a5b.nykjsrv.cn.out

[hadoop@c0a80a5b logs]$jps

9318 JobHistoryServer

4120 DataNode

1898 NameNode

2474 SecondaryNameNode

2922 NodeManager

2701 ResourceManager

9390 Jps

JobHistoryServer開啟后,可以通過Web頁面查看歷史服務器:

歷史服務器的Web端口默認是19888,可以查看Web界面。你可以多執行幾次Yarn任務,可以通過History點擊跳到歷史頁面,查看其任務詳情。

但是在上面所顯示的某一個Job任務頁面的最下面,Map和Reduce個數的鏈接上,點擊進入Map的詳細信息頁面,再查看某一個Map或者Reduce的詳細日志是看不到的,是因為沒有開啟日志聚集服務。


九、開啟日志聚集

MapReduce是在各個機器上運行的,在運行過程中產生的日志存在于各個機器上,為了能夠統一查看各個機器的運行日志,將日志集中存放在HDFS上,這個過程就是日志聚集。

配置日志聚集功能,Hadoop默認是不啟用日志聚集的,在yarn-site.xml文件里添加配置啟用日志聚集。

$vim?/usr/local/hadoop/etc/hadoop/yarn-site.xml

<property>

? ? ????<name>yarn.log-aggregation-enable</name>

? ? ????<value>true</value>

</property>

<property>

? ? ????<name>yarn.log-aggregation.retain-seconds</name>

? ? ? ? <value>106800</value>

</property>

yarn.log-aggregation-enable:是否啟用日志聚集功能。

yarn.log-aggregation.retain-seconds:設置日志保留時間,單位是秒。

將配置文件分發到其他節點:

[hadoop@hadoop-nn ~]$ su - hadoop

[hadoop@hadoop-nn ~]$ scp /usr/local/hadoop/etc/hadoop/* hadoop@hadoop-snn:/usr/local/hadoop/etc/hadoop/

[hadoop@hadoop-nn ~]$ scp /usr/local/hadoop/etc/hadoop/* hadoop@hadoop-dn-01:/usr/local/hadoop/etc/hadoop/

重啟Yarn進程:

[hadoop@hadoop-nn ~]$ stop-yarn.sh

[hadoop@hadoop-nn ~]$ start-yarn.sh

重啟HistoryServer進程:

[hadoop@hadoop-nn ~]$ mr-jobhistory-daemon.sh stop historyserver

[hadoop@hadoop-nn ~]$ mr-jobhistory-daemon.sh start historyserver

測試日志聚集,運行一個demo MapReduce,使之產生日志:

[hadoop@hadoop-nn ~]$ yarn jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.8.3.jar wordcount /test/fstab /test/wc1

運行Job后,就可以在歷史服務器Web頁面查看各個Map和Reduce的日志了。


十、內存調整

hadoop由512M調整為4096M

[hadoop@hadoop-nn ~]$/usr/local/hadoop/etc/hadoop/hadoop-env.sh

export HADOOP_PORTMAP_OPTS="-Xmx4096m $HADOOP_PORTMAP_OPTS"

export HADOOP_CLIENT_OPTS="-Xmx4096m $HADOOP_CLIENT_OPTS"


yarn由2048M調整為4096M

[hadoop@hadoop-nn ~]$/usr/local/hadoop/etc/hadoop/yarn-env.sh

JAVA_HEAP_MAX=-Xmx4096m


參考:http://www.ywnds.com/?p=10138

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,431評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,637評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,555評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,900評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,629評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,976評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,976評論 3 448
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,139評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,686評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,411評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,641評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,129評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,820評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,233評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,567評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,362評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,604評論 2 380

推薦閱讀更多精彩內容