一、系統參數配置優化
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