通过伪分布式来回顾前面的知识,并通过演示来帮大家实验前面的知识点,然后初步带领大家了解hadoop配置文件,使我们对hadoop的认知不仅仅停留在理论基础上。
当然这篇文仅仅是初步实验,后面我们会采用5台设备搭建真正的Hadoop集群,同时博主正在做500台Hadoop集群的搭建工作,我们会拿出100台来为大家展示大规模CDH集群的搭建及维护细节
apache hadoop版本选择
http://hadoop.apache.org/releases.html
可以看出目前
25 January, 2016: Release 2.7.2 (stable) available
A point release for the 2.7 line.
Please see the Hadoop 2.7.2 Release Notes for the list of 155 bug fixes and patches since the previous release 2.7.1.
但是因为目前生产环境中大部分仍使用2.6版本,固我们本次课程演示Hadoop2.6的安装与维护
28 October, 2015: Release 2.6.2 available
Apache Hadoop 2.6.2 is a point release in the 2.6.x release line, and fixes a few critical issues in 2.6.1.
Please see the Hadoop 2.6.2 Release Notes for details.
所以我们使用hadoop 2.6.2
安装java
首先 java -version 检查本机有无java,如果有,检查是否为openjdk,如果是请卸载,安装oracle JDK
以下是安装过程
mkdir -p /app/zpy/java
tar zxvf jdk-8u51-linux-x64.tar.gz -C /app/zpy/java > /dev/null 2>&1
echo '# JAVA-8u51' >> /etc/profile
echo 'JAVA_HOME=/app/zpy/java/jdk1.8.0_51' >> /etc/profile
echo 'JAVA_BIN=/app/zpy/java/jdk1.8.0_51/bin' >> /etc/profile
echo 'PATH=$PATH:$JAVA_BIN' >> /etc/profile
echo 'CLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar' >> /etc/profile
echo 'export JAVA_HOME JAVA_BIN PATH CLASSPATH' >> /etc/profile
source /etc/profile
echo " please open other session to test java "
请使用 jdk 8 或以上版本
下载hadoop 源码包并解压:
cd /app/zpy
wget https://dist.apache.org/repos/dist/release/hadoop/common/hadoop-2.6.2/hadoop-2.6.2.tar.gz
tar zxvf hadoop-2.6.2.tar.gz
mv hadoop-2.6.2 hadoop
hadoop 目录说明
- bin:Hadoop最基本的管理脚本和使用脚本的目录,这些脚本是sbin目录下管理脚本的基础实现,用户可以直接使用这些脚本管理和使用Hadoop。
- etc:Hadoop配置文件所在的目录,包括core-site.xml、hdfs-site.xml、mapred-site.xml等从Hadoop1.0继承而来的配置文件和yarn-site.xml等Hadoop2.0新增的配置文件。
- include:对外提供的编程库头文件(具体动态库和静态库在lib目录中),这些头文件均是用C++定义的,通常用于C++程序访问HDFS或者编写MapReduce程序。
- lib:该目录包含了Hadoop对外提供的编程动态库和静态库,与include目录中的头文件结合使用。
- libexec:各个服务对用的shell配置文件所在的目录,可用于配置日志输出、启动参数(比如JVM参数)等基本信息。
- sbin:Hadoop管理脚本所在的目录,主要包含HDFS和YARN中各类服务的启动/关闭脚本。
- share:Hadoop各个模块编译后的jar包所在的目录。
配置环境变量
vim /etc/profile.d/hadoop.sh
添加
export HADOOP_PRIFIX=/app/zpy/hadoop
export PATH=$PATH:${HADOOP_PRIFIX}/bin:${HADOOP_PRIFIX}/sbin
export HADOOP_YARN_HOME=${HADOOP_PRIFIX}
export HADOOP_MAPPERD_HOME=${HADOOP_PRIFIX}
export HADOOP_COMMON_HOME=${HADOOP_PRIFIX}
export HADOOP_HDFS_HOME=${HADOOP_PRIFIX}
创建hadoop 目录,并创建hadoop的数据和日志目录
useradd hadoop
mkdir -pv /data/hadoop/hdfs/{nn,snn,dn} ##说明:nn:namenode dn:datanode snn:second namenode
mkdir -pv /data/hadoop/logs
修改属主,属组
chown -R hadoop:hadoop /data/hadoop/
chown -R hadoop:hadoop /app/zpy/hadoop
修改 core-site.xml
core-site.xml 文件包含了NAMEnode主机地址以及其监听的RPC端口信息,对于伪分布式模型的安装来说,其主机地址为localhost。
NameNode默认使用的RPC端口为8020.
RPC的解释:
RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不
需要了解底层网络技术的协议。
RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。
我们打开后发现配置文件如下:
<configuration>
</configuration>
↑其实这两行就是一个闭合标签,我们应该在这两个闭合标签内部增加一个或者多个属性(property)标签
如下所示
<configuration>
<property>
内容1。。。
</property>
<property>
内容2。。。
</property>
</configuration>
最终配置文件修改如下:
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:8020</value>
<final>true</final>
</property>
</configuration>
hdfs-site.xml文件配置案例
hdfs-site.xml主要用于配置HDFS的相关属性,例如数据块的副本数、NN和DN用于存储数据的目录等。
数据块的副本数对于伪分布式的HADOOP来说应该是1
NN和DN用于存储数据的目录为前面设置的路径
<configuration>
<property>
<name>dfs.replication</name>
<value>1</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>
</configuration>
注意: 如果需要其他用户对HDFS有写入的权限,还需要再hdfs-site.xml中添加一项属性定义
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
修改mapred-site.xml
mapred-site.xml文件用于配置集群的MapReduce framework ,此处应该指定使用yarn,另外可用的值还有
local和classic。
mapred-site.xml 默认是不存在的,但有模块文件mapred-site.xml.template ,只需要将其复制为mapred-site.xml即可
cp mapred-site.xml.template mapred-site.xml
修改配置文件:
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
配置yarn-site.xml
yarn-site.xml 用于配置YARN进程及YARN的相关属性,首先需要指定ResourceManager守护进程的主机及监听的端口,
对于伪分布式模型来讲,其主机为localhost,默认的端口为8032;
其次需要指定ResourceManager使用的scheduler(调度器),以及NodeManager的辅助服务
一个简要的配置实例如下所示:
<configuration>
<property>
<name>yarn.resourcemanager.address</name>
<value>localhost:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>localhost:8030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>localhost:8031</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>localhost:8033</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>localhost: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_HEAPSIZE,JAVA_HEAP_SIZE和YARN_HEAP_SIZE等
配置 slaves 文件
slaves文件存储了当前集群的所有slave节点的列表,对于伪分布式模型,其文件内容应该仅为localhost,这也是这个文件的默认内容
因此伪分布式模型中,此文件的内容保持一致即可
格式化HDFS
在HDFS的NN启动之前需要先初始化其用于存储数据的目录,如果hdfs-site.xml中的dfs.namenode.name.dir 属性指定的目录不存在,格式化命令会自动创建;
如果事先存在,请确保其权限设置正确,此时格式化操作会清除其内部所有数据并重新建立一个新的文件系统。
chown -R hadoop:hadoop /data/hadoop
chown -R hadoop:hadoop /app/zpy/hadoop
su hadoop
以hadoop用户执行:
hdfs namenode -format
看格式化是否成功,应该找到这样一句话
17/04/17 10:07:17 INFO common.Storage: Storage directory /data/hadoop/hdfs/nn has been successfully formatted.
检测data/hadoop/hdfs/nn/发现多了一个current
/data/hadoop/hdfs/nn/current
[hadoop@localhost current]$ ll
total 16
-rw-rw-r-- 1 hadoop hadoop 353 Apr 14 09:57 fsimage_0000000000000000000
-rw-rw-r-- 1 hadoop hadoop 62 Apr 14 09:57 fsimage_0000000000000000000.md5
-rw-rw-r-- 1 hadoop hadoop 2 Apr 14 09:57 seen_txid
-rw-rw-r-- 1 hadoop hadoop 202 Apr 14 09:57 VERSION
至此格式化成功
启动hadoop 说明(以下命令暂不执行)
hadoop2 的启动操作可通过其sbin路径下的专用脚本进行启动
例如:
hadoop-daemon.sh(start|stop)namenode --这是启动namenode的
hadoop-daemon.sh(start|stop)datanode --这是启动datanode的
hadoop-daemon.sh(start|stop)secondarynamenode --这是启动secondarynamenode的
yarn-daemon.sh(start|stop)resourcemanager
yarn-daemon.sh(start|stop)nodemanager
启动HDFS相关
HDFS有三个守护进程,namenode、datanode、和secondarynamenode.他们都可以通过hadoop-daemon.sh 脚本启动或者停止。
以hadoop用户执行相关的命令即可,如下所示:
[hadoop@localhost sbin]$ hadoop-daemon.sh start namenode
starting namenode, logging to /app/zpy/hadoop/logs/hadoop-hadoop-namenode-localhost.out
ok,那么namenode启动起来了,进入提示的日志文件目录发现其中两个文件
hadoop-hadoop-namenode-localhost.log
hadoop-hadoop-namenode-localhost.out
实际上日志文件是.log结尾的,而非提示的.out
jps命令检查是否启动成功:
[hadoop@localhost logs]$ jps
27449 Jps
27214 NameNode
jps -v 可以看详细的信息
启动secondarynamenode
hadoop-daemon.sh start secondarynamenode
starting secondarynamenode, logging to /app/zpy/hadoop/logs/hadoop-hadoop-secondarynamenode-localhost.out
启动datanode节点
ps:正常生产环境中,我们是不会把datanode与namenode放在一起的,因为这个实验是伪分布式集群
hadoop-daemon.sh start datanode
结果:starting datanode, logging to /app/zpy/hadoop/logs/hadoop-hadoop-datanode-localhost.out
用jps 检查所有启动结果
[hadoop@localhost logs]$ jps
39282 SecondaryNameNode
38979 NameNode
39531 Jps
39423 DataNode
现在我们HDFS启动完成,我们要看看HDFS的使用方式,详见
apache hadoop 伪分布式搭建-part2-HDFS简单命令
启动yarn
启动resourcemanager :
yarn-daemon.sh start resourcemanager
结果:starting resourcemanager, logging to /app/zpy/hadoop/logs/yarn-hadoop-resourcemanager-localhost.out
jps命令检查是否启动成功
启动nodemanager:
yarn-daemon.sh start nodemanager
使用jps命令查看
[hadoop@bogon root]$ jps
39282 SecondaryNameNode
3490 Jps
38979 NameNode
3275 NodeManager
2926 ResourceManager
39423 DataNode
WEBUI
HDFS和YARN ResourceManager 各自提供了一个web接口,通过这些接口可以检查HDFS集群以及YARN集群的相关状态信息。
他们的访问接口分别为如下所示,具体使用中,需要将Namenode和RresourceManagerHost分别修改其相应的主机地址
HDFS-NameNode WEBUI
访问方式:
http://10.0.140.81:50070
可以看出很多有用的信息
Configured Capacity: 279.72 GB
DFS Used: 44 KB
Non DFS Used: 17.88 GB
DFS Remaining: 261.84 GB
DFS Used%: 0%
DFS Remaining%: 93.61%
Live Nodes 1 (Decommissioned: 0)
Dead Nodes 0 (Decommissioned: 0)
Decommissioning Nodes 0
ResourceManager WEBUI
访问方式:
http://10.0.140.81:8088
注意: 在yarn-site.xml文件中yarn.resourcemanager.webapp.address属性的值如果定义为"localhost:8088",则其WEBUI 仅监听于127.0.0.1地址上的8088端口
也可以通过ss -tnl来看:50070是所有地址,8088是本地地址
ss -tnl
LISTEN 0 128 127.0.0.1:8020
LISTEN 0 128 *:50070
LISTEN 0 128 ::ffff:127.0.0.1:8088
所以我们修改配置文件yarn-site.xml
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>10.0.140.81:8088</value>
</property>
重启:
yarn-daemon.sh stop resourcemanager
yarn-daemon.sh start resourcemanager
向HADOOP 提交mapreduce 程序
ok,现在我们HDFS搭建完毕了,YARN也搭建完毕了,现在我们想在YARN上跑一个mapreduce程序。我又不会写map和reduce程序,怎么办?
hadoop为我们提供了测试包
hadoop-YARN 自带了很多样例程序,他们位于hadoop安装路径下的
share/hadoop/mapreduce/
目录里,其中hadoop-mapreduce-examples-2.6.2.jar 就可以作为mapreduce的程序测试!
执行测试
yarn jar hadoop-mapreduce-examples-2.6.2.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.
yarn jar hadoop-mapreduce-examples-2.6.2.jar wordcount
Usage: wordcount <in> [<in>...] <out>
备注:in 与 out 都是指HDFS文件,而非本地文件
ok,那我们再修改一下:
yarn jar hadoop-mapreduce-examples-2.6.2.jar wordcount /dailiang/fstab /test/wordcount
ps:/test/wordcount 必须是目录,会自动在该目录下创建一个文件,并将结果存在此文件
然后程序执行过程中,可以访问yarn的web界面,可以看到application程序正在运行:
查看结果
hdfs dfs -cat /test/wordcount/part-r-00000
我们发现每个词语的数量都被统计出来了
# 7
'/dev/disk' 1
/ 1
/boot 1
/etc/fstab 1
0 6
2017 1
21:19:01 1
5 1
Accessible 1
Created 1
Jul 1
See 1
UUID=1a1736eb-defa-49fc-9cfe-c5207f038338 1
UUID=7477064f-a3bd-4d8c-b6d3-0d9ee8c50297 1
UUID=9712c227-d80b-4c87-87b7-b6d674d8811b 1
ok。。这就是整个伪分布式集群的搭建过程