一、准备工作
申请开通hadoop3测试集群防火墙权限
规划:
主机 | IP | 系统 | 节点 |
JXQ-23-27-48.com.cn | 172.23.27.48 | CentOS release 6.4 | Namenode、zkfc、 JobHistoryServer |
JXQ-23-27-49.com.cn | 172.23.27.49 | CentOS release 6.4 | Namenode、zkfc
|
JXQ-23-27-50.com.cn | 172.23.27.50 | CentOS release 6.4 | Datanode、nodemanager、resourcemanager |
JXQ-23-27-51.com.cn | 172.23.27.51 | CentOS release 6.4 | Datanode、nodemanager、 |
JXQ-23-27-52.com.cn | 172.23.27.52 | CentOS release 6.4 | Datanode、nodemanager、 |
JXQ-23-27-53.com.cn | 172.23.27.53 | CentOS release 6.4 | Datanode、nodemanager、 |
JXQ-23-27-54.com.cn | 172.23.27.54 | CentOS release 6.4 | Datanode、nodemanager、 |
JXQ-23-27-55.com.cn | 172.23.27.55 | CentOS release 6.4 | Zookeeper,journalnode |
JXQ-23-27-56.com.cn | 172.23.27.56 | CentOS release 6.4 | Zookeeper,journalnode |
JXQ-23-27-57.com.cn | 172.23.27.57 | CentOS release 6.4 | Zookeeper,journalnode |
1.1 配置yum源
mv /etc/yum.repos.d/cobbler-config.repo /etc/yum.repos.d/cobbler-config.repo.bak
vim /etc/yum.repos.d/cloudera.repo
[Base]
name=Base
baseurl=http://172.23.64.71/centos6.4-x86_64
enabled=1
gpgcheck=0
[updates]
name=updates
baseurl=http://172.23.64.71/repos/6.4-updates
gpgcheck=0
enabled=1
[cdh]
name=cdh
baseurl=http://172.23.64.71/repos/cdh/4
enabled=1
gpgcheck=0
[ext]
name=ext
baseurl=http://172.23.64.71/repos/cloudera-gplextras4
enabled=1
gpgcheck=0
[epel]
name=epel
baseurl=http://172.23.64.71/repos/epel
enabled=1
gpgcheck=0
[gfs]
name=gfs
baseurl=http://172.23.64.71/repos/gfs
enabled=1
gpgcheck=0
yum clean all
1.2 配置/etc/hosts
127.0.0.1 localhost localhost.localdomain
172.23.27.48 JXQ-23-27-48.com.cn
172.23.27.49 JXQ-23-27-49.com.cn
172.23.27.50 JXQ-23-27-50.com.cn
172.23.27.51 JXQ-23-27-51.com.cn
172.23.27.52 JXQ-23-27-52.com.cn
172.23.27.53 JXQ-23-27-53.com.cn
172.23.27.54 JXQ-23-27-54.com.cn
172.23.27.55 JXQ-23-27-55.com.cn
172.23.27.56 JXQ-23-27-56.com.cn
172.23.27.57 JXQ-23-27-57.com.cn
1.3 确定关闭iptables,selinux,配置ntp,系统优化,ulimit,取消sudotty
echo '* soft nofile 65536' >>/etc/security/limits.conf
echo '* hard nofile 65536' >>/etc/security/limits.conf
echo '* soft nproc 131072' >>/etc/security/limits.conf
echo '* hard nproc 131072' >>/etc/security/limits.conf
echo '* soft nofile 65536' >>/etc/security/limits.d/90-nproc.conf
echo '* hard nofile 65536' >>/etc/security/limits.d/90-nproc.conf
echo '* soft nproc 131072' >>/etc/security/limits.d/90-nproc.conf
echo '* hard nproc 131072' >>/etc/security/limits.d/90-nproc.conf
1.4 配置无密登录
cd ~/.ssh
ssh-keygen -t rsa (四个回车)
ssh-copy-id '-p 51899 pe@172.23.27.49'
ssh-copy-id '-p 51899 pe@172.23.27.50'
ssh-copy-id '-p 51899 pe@172.23.27.51'
1.5 关闭防火墙
#查看防火墙状态
service iptables status
#关闭防火墙
service iptables stop
#查看防火墙开机启动状态
chkconfig iptables --list
#关闭防火墙开机启动
chkconfig iptables off
1.6 jdk安装
rpm -ivh http://172.23.64.71/repos/jdk-7u51-linux-x64.rpm
alternatives --install /usr/bin/java java /usr/java/default/bin/java 3
alternatives --config java
alternatives --install /usr/bin/java java /usr/java/latest/bin/java 1600
alternatives --auto java
alternatives --install /usr/bin/jps jps /usr/java/latest/bin/jps 1
二、开始安装Zookeeper与journalnode
Zookeeper 至少需要3个节点,并且节点数要求是基数,这里在55,56,57
在每个节点上安装zookeeper
$ yum install zookeeper* -y
设置 zookeeper 配置/etc/zookeeper/conf/zoo.cfg
maxClientCnxns=50
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/var/lib/zookeeper
clientPort=2181
server.1= JXQ-23-27-55.com.cn:2888:3888
server.2= JXQ-23-27-56.com.cn:2888:3888
server.3= JXQ-23-27-57.com.cn:2888:3888
同步配置文件
将配置文件同步到其他节点:
$ scp -r /etc/zookeeper/conf root@56服务器:/etc/zookeeper/
$ scp -r /etc/zookeeper/conf root@57服务器:/etc/zookeeper/
初始化并启动服务
在每个节点上初始化并启动 zookeeper,注意 n 的值需要和 zoo.cfg 中的编号一致。
在 55 节点运行
$ service zookeeper-server init --myid=1
$ service zookeeper-server start
在 56 节点运行
$ service zookeeper-server init --myid=2
$ service zookeeper-server start
在 57 节点运行
$ service zookeeper-server init --myid=3
$ service zookeeper-server start
安装journalnode实现元数据的同步
yum -y installhadoop-hdfs-journalnode hadoop-lzo-cdh4
servicehadoop-hdfs-journalnode start
三、开始安装
主namenode:(172.23.27.48)
yum -y install hadoop-hdfs-namenode hadoop-hdfs-zkfc hadoop-lzo-cdh4
hadoop-mapreduce-historyserver
辅namenode:(172.23.27.49)
yum-y install hadoop-hdfs-namenode hadoop-hdfs-zkfc hadoop-lzo-cdh4
主 resourcemanager:(172.23.27.50)
yum -y install hadoop-yarn-resourcemanager
datanode、nodemanager安装:(50,51,52,53,54)
yum -y install hadoop-yarn-nodemanager hadoop-hdfs-datanode
hadoop-mapreduce hadoop-lzo-cdh4
四、配置文件
我在48上修改配置文件,然后统一拷贝同步
[root@JXQ-23-27-48 conf]# cat allowed_hosts
JXQ-23-27-50.com.cn
JXQ-23-27-51.com.cn
JXQ-23-27-52.com.cn
JXQ-23-27-53.com.cn
JXQ-23-27-54.com.cn
[root@JXQ-23-27-48 conf]# cat exclude_datanode_hosts
空....
设置hadoop-env.sh
[root@JXQ-23-27-48 conf]# cat hadoop-env.sh
设置core-site.xml
[root@JXQ-23-27-48 conf]# cat core-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- 指定hdfs的nameservice为wangyin-m6 -->
<!-- 接收Client连接的RPC端口,用于获取文件系统metadata信息 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://m6-hadoop3</value>
</property>
<!-- 指定hadoop临时目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/tmp/hadoop-${user.name}-${hue.suffix}</value>
</property>
<!-- 指定zookeeper地址 (IP最好改为域名)-->
<property>
<name>ha.zookeeper.quorum</name>
<value>JXQ-23-27-55.com.cn:2181,JXQ-23-27-56.com.cn:2181,JXQ-23-27-57.com.cn:2181</value>
</property>
<!-- 压缩算法-->
<property>
<name>io.compression.codecs</name>
<value>org.apache.hadoop.io.compress.DefaultCodec,org.apache.hadoop.io.compress.GzipCodec,org.apache.hadoop.io.compress.BZip2Codec,com.hadoop.compression.lzo.LzoCodec,com.hadoop.compression.lzo.LzopCodec,org.apache.hadoop.io.compress.SnappyCodec</value>
</property>
<property>
<name>io.compression.codec.lzo.class</name>
<value>com.hadoop.compression.lzo.LzoCodec</value>
</property>
<!-- 文件废弃标识设定,0为禁止此功能;
该参数值为时间间隔,单位为分钟,默认为0,表示回收站功能关闭。该值表示回收站中文件保存多长时间,
如果服务端配置了该参数,则忽略客户端的配置;如果服务端关闭了该参数,则检查客户端是否有配置该参数;
-->
<property>
<name>fs.trash.interval</name>
<value>10080</value>
<description>
10080mins=7day.
Number of minutes between trash checkpoints. If zero, the trash feature is disabled
<!-- 垃圾检查点之间的数分钟。如果为零,垃圾特性是禁用的-->
</description>
</property>
<!-- 该参数值为时间间隔,单位为分钟,默认为0。该值表示检查回收站时间间隔,该值要小于fs.trash.interval,
该值在服务端配置。如果该值设置为0,则使用 fs.trash.interval 的值-->
<property>
<name>fs.trash.checkpoint.interval</name>
<value>10080</value>
</property>
<!-- 流文件的缓冲区为128K;
缓冲区大小:io.file.buffer.size默认是4KB,作为hadoop缓冲区,用于hadoop读hdfs的文件和写hdfs的文件,
还有map的输出都用到了这个缓冲区容量,对于现在的硬件很保守,可以设置为128k(131072),甚至是1M(太大了map和reduce任务可能会内存溢出)
-->
<property>
<name>io.file.buffer.size</name>
<value>131072</value>
</property>
<!-- 排序内存使用限制;
以MB为单位,默认100M,这个值比较小;map节点没运行完时,内存的数据过多,要将内存中的内容写入磁盘盘,
这个设置就是设置内存缓冲的大小,在suffle之前;这个选项定义了map输出结果在内存里占用buffer的大小,当buffer达到某个阈值(后面那条配置),会启动一个后台线程来对buffer的内容进行排序,然后写入本地磁盘(一个spill文件),根据map输出数据量的大小,可以适当的调整buffer的大小,注意是适当的调整,并不是越大越好-->
<property>
<name>io.sort.mb</name>
<value>512</value>
</property>
<!-- reduce阶段用户合并map输出的内存限制-->
<property>
<name>fs.inmemory.size.mb</name>
<value>300</value>
</property>
<!-- 将webinterface.Private.actions设置为true,意味着允许任何人访问HDFS Web界面来删除文件。
dfs.web.ugi属性决定以哪个用户身份运行HDFS Web UI,从而控制可以查看或删除哪些文件-->
<property>
<name>webinterface.private.actions</name>
<value>true</value>
</property>
<!-- hadoop.security.authorization=true则开启ServiceLevel Authorization,若为false则不经过任何验证,
所有用户拥有全部权限。(修改此配置需要重启hadoop)
hadoop访问控制分为两级,其中ServiceLevel Authorization为系统级,用于控制是否可以访问指定的服务,
例如用户/组是否可以向集群提交Job,它是最基础的访问控制,优先于文件权限和mapred队列权限验证。
详细信息参见(hadoop简单权限管理.docx)
-->
<property>
<name>hadoop.security.authorization</name>
<value>true</value>
</property>
<!-- 配置用户权限-->
<property>
<name>security.client.protocol.acl</name>
<value>root,hdfs,hadoop,yarn</value>
</property>
<property>
<name>security.client.datanode.protocol.acl</name>
<value>root,hdfs,hadoop,yarn</value>
</property>
<property>
<name>security.datanode.protocol.acl</name>
<value>root,hdfs,hadoop,yarn</value>
</property>
<property>
<name>security.inter.datanode.protocol.acl</name>
<value>root,hdfs,hadoop,yarn</value>
</property>
<property>
<name>security.namenode.protocol.acl</name>
<value>root,hdfs,hadoop,yarn</value>
</property>
<property>
<name>security.inter.tracker.protocol.acl</name>
<value>root,hdfs,hadoop,yarn</value>
</property>
<property>
<name>security.job.submission.protocol.acl</name>
<value>root,hdfs,hadoop,yarn</value>
</property>
<property>
<name>security.task.umbilical.protocol.acl</name>
<value>root,hdfs,hadoop,yarn</value>
</property>
<property>
<name>security.refresh.policy.protocol.acl</name>
<value>root,hdfs,hadoop,yarn</value>
</property>
<!-- 配置代理用户hue-->
<property>
<name>hadoop.proxyuser.hue.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.hue.groups</name>
<value>*</value>
</property>
<!-- 配置代理用户httpfs-->
<property>
<name>hadoop.proxyuser.httpfs.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.httpfs.groups</name>
<value>*</value>
</property>
<!-- 配置代理用户hive-->
<property>
<name>hadoop.proxyuser.hive.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.hive.groups</name>
<value>*</value>
</property>
<!-- 配置代理用户hdfs-->
<property>
<name>hadoop.proxyuser.hdfs.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.hdfs.groups</name>
<value>*</value>
</property>
<!-- 在网页界面访问数据使用的用户名。默认值是一个不真实存在的用户,此用户权限很小,不能访问不同用户的数据。
这保证了数据安全。也可以设置为hdfs和hadoop等具有较高权限的用户,但会导致能够登陆网页界面的人能看到其它用户数据。
实际设置请综合考虑。如无特殊需求。使用默认值就好-->
<property>
<name>hadoop.http.staticuser.user</name>
<value>mapred</value>
</property>
<!-- 机架感知-->
<!-- 配合ScriptBasedMapping使用。脚本文件。此脚本文件,输入是ip地址,输出是机架路径。 -->
<property>
<name>net.topology.script.file.name</name>
<value>/etc/hadoop/conf/topo.sh</value>
</property>
</configuration>
设置hdfs-site.xml
[root@JXQ-23-27-48 conf]# cat hdfs-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!--指定hdfs的nameservice为wangyin-m6,需要和core-site.xml中的保持一致 -->
<property>
<name>dfs.nameservices</name>
<value>m6-hadoop3</value>
</property>
<!-- wangyin-m6下面有两个NameNode,分别是nn1,nn2 -->
<property>
<name>dfs.ha.namenodes.m6-hadoop3</name>
<value>nn1,nn2</value>
</property>
<!-- nn1的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.m6-hadoop3.nn1</name>
<value>JXQ-23-27-48.com.cn:8020</value>
</property>
<!-- nn2的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.m6-hadoop3.nn2</name>
<value>JXQ-23-27-49.com.cn:8020</value>
</property>
<!-- nn1的http通信地址 -->
<property>
<name>dfs.namenode.http-address.m6-hadoop3.nn1</name>
<value>JXQ-23-27-48.com.cn:50070</value>
</property>
<!-- nn2的http通信地址 -->
<property>
<name>dfs.namenode.http-address.m6-hadoop3.nn2</name>
<value>JXQ-23-27-49.com.cn:50070</value>
</property>
<!-- 指定NameNode的元数据在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://JXQ-23-27-55.com.cn:8485;JXQ-23-27-56.com.cn:8485;JXQ-23-27-57.com.cn:8485/m6-hadoop3</value>
</property>
<!-- 配置失败自动切换实现方式 -->
<property>
<name>dfs.client.failover.proxy.provider.m6-hadoop3</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 配置隔离机制方法,多个机制用换行分割,即每个机制暂用一行-->
<property>
<name>dfs.ha.fencing.methods</name>
<value>shell(/home/hadoop/fencingscript.sh)</value>
</property>
<!-- 开启NameNode失败自动切换 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 指定JournalNode在本地磁盘存放数据的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/export/hdfs/journalnode</value>
</property>
<!-- 名字节点的冗余备份;
这个参数用于确定将HDFS文件系统的元信息保存在什么目录下。
如果这个参数设置为多个目录,那么这些目录下都保存着元信息的多个备份
-->
<property>
<name>dfs.name.dir</name>
<value>/export/hdfs/namenode</value>
</property>
<!-- 数据节点的block块本地存放目录
这个参数用于确定将HDFS文件系统的数据保存在什么目录下。
我们可以将这个参数设置为多个分区上目录,即可将HDFS建立在不同分区上。
-->
<property>
<name>dfs.data.dir</name>
<value>/export/hdfs/1/datanode;/export/hdfs/2/datanode</value>
</property>
<!-- hadoop hdfs的用户权限检查-->
<property>
<name>dfs.permissions.enabled</name>
<value>true</value>
</property>
<!-- 缺省的块复制数量-->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!-- 允许接入为DataNode的机器列表,如果不配置或所指定的列表文件为空则默认允许所有主机成为DataNode-->
<property>
<name>dfs.hosts</name>
<value>/etc/hadoop/conf/allowed_hosts</value>
<!-- all datanode node -->
</property>
<!-- 拒绝接入为DataNode的机器列表,如果一台机器同时出现在两个列表中,则拒绝。
它们的本质作用是拒绝某些节点上的datanode进程连接,而不是调度这些节点上datanode进程的允许和关闭。-->
<property>
<name>dfs.hosts.exclude</name>
<value>/etc/hadoop/conf/exclude_datanode_hosts</value>
</property>
<!-- 相当于linux下的打开文件最大数量,文档中无此参数,当出现DataXceiver报错的时候,需要调大。默认2048-->
<property>
<name>dfs.datanode.max.xcievers</name>
<!--suggest <value>2048</value> -->
<value>65535</value>
</property>
<!-- 两次连续的检查点之间的最大的时间间隔,缺省值是1小时
可参考(hadoop1.x和2.X的HDFS fsimage和edits文件运行机制对比.docx)
-->
<property>
<name>dfs.namenode.checkpoint.period</name>
<value>600</value>
</property>
<!--
如果其它所有的映像文件和edits都丢失了,可以将最后的检查点导入到NameNode,为此,需要以下步骤:
创建一个空目录,在dfs.namenode.name.dir项中配置为该目录;
设置dfs.namenode.checkpoint.dir为检查点目录;
采用-importCheckpoint选项来启动NameNode
NameNode将从dfs.namenode.checkpoint.dir设置的目录中上载检查点,并将其保存在dfs.namenode.name.dir指定的目录中。
如果dfs.namenode.name.dir中存在一个合法的映像文件,NameNode就会启动失败,NameNode要验证dfs.namenode.checkpoint.dir中的映像文件是否合法,
但在任何情况下,都不会修改该文件。
-->
<property>
<name>dfs.namenode.checkpoint.dir</name>
<value>/export/hdfs/checkpoint</value>
</property>
<!-- 与下面的“写”操作类似-->
<property>
<name>dfs.namenode.avoid.read.stale.datanode</name>
<value>true</value>
</property>
<!-- 表明是否要避免写为“过时”的心跳消息尚未收到的NameNode超过指定的时间间隔数据节点。写操作将避免使用陈旧的数据节点,除非多数据节点的配置比例-->
<property>
<name>dfs.namenode.avoid.write.stale.datanode</name>
<value>true</value>
</property>
<!-- 默认时间间隔一个datanode标记为“down机”,即。 ,如果 namenode没有接到一个datanode心跳超过这个时间间隔,datanode将标记为“过期”。
过期的间隔不能太小 (默认值是3倍 心跳间隔)-->
<property>
<name>dfs.namenode.stale.datanode.interval</name>
<value>30000</value>
</property>
<!-- impala -->
<!-- 开启客户端就近读取,还会检查dfs.block.local-path-access.user配置的用户权限-->
<property>
<name>dfs.client.read.shortcircuit</name>
<value>true</value>
</property>
<!-- Unix域套接字路径,可通过dfs.domain.socket.path设置。该路径必须安全地阻止无优先级进程进行中间人攻击(MITM攻击,man-in-the-middle attack)。
每个套接字路径必须是root拥有或者DN用户拥有,不能使用人人都可以写或者用户组可写方式的路径-->
<property>
<name>dfs.domain.socket.path</name>
<value>/var/run/hadoop-hdfs/dn._PORT</value>
</property>
<property>
<name>dfs.client.file-block-storage-locations.timeout</name>
<value>3000</value>
</property>
<!--
该项配置的用户名进行shortcircuit读取时如果没有权限会将本地的datanode作为deadnode处理,然后数据通过远程读取
-->
<property>
<name>dfs.block.local-path-access.user</name>
<value>impala</value>
</property>
<!-- datanode所使用的本地文件夹的路径权限,默认755-->
<property>
<name>dfs.datanode.data.dir.perm</name>
<value>750</value>
</property>
<!-- 通过知道每个block所在磁盘,可以在调度cpu资源时让不同的cpu读不同的磁盘,避免查询内和查询间的IO竞争-->
<property>
<name>dfs.datanode.hdfs-blocks-metadata.enabled</name>
<value>true</value>
</property>
<!-- 该属性指定hdfs的超级用户,默认为hdfs,你可以修改为hadoop-->
<property>
<name>dfs.permissions.superusergroup</name>
<value>hadoop</value>
</property>
<!-- datanode 控制端口,默认50010-->
<property>
<name>dfs.datanode.address</name>
<value>0.0.0.0:50010</value>
</property>
<!-- datanode的HTTP服务器和端口,默认50075-->
<property>
<name>dfs.datanode.http.address</name>
<value>0.0.0.0:50075</value>
</property>
<!-- datanode的RPC服务器地址和端口,默认50020-->
<property>
<name>dfs.datanode.ipc.address</name>
<value>0.0.0.0:50020</value>
</property>
<!-- 使用webhdfs的LISTSTATUS、LISTFILESTATUS等需要列出文件、文件夹状态的命令,因为这些信息都是由namenode来保存的
详细参见(hadoop webHDFS设置和使用说明.docx)-->
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
</configuration>
设置mapred-site.xml
[root@JXQ-23-27-48conf]# cat mapred-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- 指定mr框架为yarn方式 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!-- MR的中介数据文件存放目录-->
<property>
<name>mapred.local.dir</name>
<value>/export/hdfs/1/mapred,/export/hdfs/2/mapred</value>
</property>
<!--临时目录,如果不配置会报hdfs://test1/user/$username/grep-temp-1369767580 目录找不到 -->
<property>
<name>mapred.temp.dir</name>
<value>${hadoop.tmp.dir}/mapred/temp</value>
</property>
<!-- MapReduce作业产生的正在运行的日志存放位置-->
<property>
<name>mapreduce.jobhistory.intermediate-done-dir</name>
<value>/user/history/intermediate</value>
</property>
<!-- MapReduce JobHistory Server地址,默认端口10020-->
<property>
<name>mapreduce.jobhistory.address</name>
<value>JXQ-23-27-48.com.cn:10020</value>
</property>
<!-- MapReduce JobHistory Server Web UI地址,默认端口19888-->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>JXQ-23-27-48.com.cn:19888</value>
</property>
<!--在什么目录下存放已经运行完的Hadoop作业记录-->
<property>
<name>mapreduce.jobhistory.done-dir</name>
<value>/user/history/done</value>
</property>
<!-- client将application定义以及需要的jar包文件等上传到hdfs的指定目录-->
<property>
<name>yarn.app.mapreduce.am.staging-dir</name>
<value>/user</value>
</property>
</configuration>
设置yarn-site.xml
[root@JXQ-23-27-48 conf]# cat yarn-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- 指定resourcemanager-->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>JXQ-23-27-50.com.cn</value>
</property>
<!-- (配置yarn.nodemanager.aux-services 一定要小心,hadoop2.2.0对应的value值已经从mapreduce.shuffle改为了mapreduce_shuffle);
在CDH4中该值设为 mapreduce.shuffle,在CDH5中该值设为 mapreduce_shuffle;
-->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce.shuffle</value>
</property>
<!-- 为了能够运行MapReduce程序,需要让各个NodeManager在启动时加载shuffle server,shuffle server实际上是Jetty/Netty Server,
Reduce Task通过该server从各个NodeManager上远程拷贝Map Task产生的中间结果。上面增加的两个配置均用于指定shuffle serve。
如果YARN集群有多个节点,你还要配置yarn.resourcemanager.address等参数
详细参见(hadoop YARN安装部署初探.docx)
-->
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 中间结果存放位置,类似于1.0中的mapred.local.dir。注意,这个参数通常会配置多个目录,已分摊磁盘IO负载。-->
<property>
<description>List of directories to store localized files in.</description>
<name>yarn.nodemanager.local-dirs</name>
<value>/var/lib/hadoop-yarn/cache/${user.name}/nm-local-dir</value>
</property>
<!-- 日志存放地址(可配置多个目录)。-->
<property>
<description>Where to store container logs.</description>
<name>yarn.nodemanager.log-dirs</name>
<value>/var/log/hadoop-yarn/containers</value>
</property>
<!-- 当应用程序运行结束后,日志被转移到的HDFS目录(启用日志聚集功能时有效)。
默认值:/tmp/logs
-->
<property>
<description>Where to aggregate logs to.</description>
<name>yarn.nodemanager.remote-app-log-dir</name>
<value>/var/log/hadoop-yarn/apps</value>
</property>
<property>
<description>Classpath for typical applications.</description>
<name>yarn.application.classpath</name>
<value>
$HADOOP_CONF_DIR,
$HADOOP_COMMON_HOME/*,$HADOOP_COMMON_HOME/lib/*,
$HADOOP_HDFS_HOME/*,$HADOOP_HDFS_HOME/lib/*,
$HADOOP_MAPRED_HOME/*,$HADOOP_MAPRED_HOME/lib/*,
$YARN_HOME/*,$YARN_HOME/lib/*
</value>
</property>
<!-- 表示该节点上YARN可使用的物理内存总量,默认是8192(MB),注意,如果你的节点内存资源不够8GB,
则需要调减小这个值,而YARN不会智能的探测节点的物理内存总量。-->
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>102400</value>
</property>
<!-- 单个任务可申请的最少物理内存量,默认是1024(MB),如果一个任务申请的物理内存量少于该值,则该对应的值改为这个数。-->
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>2048</value>
</property>
<!-- 单个任务可申请的最多物理内存量,默认是8192(MB)。
默认情况下,YARN采用了线程监控的方法判断任务是否超量使用内存,一旦发现超量,则直接将其杀死。
由于Cgroups对内存的控制缺乏灵活性(即任务任何时刻不能超过内存上限,如果超过,则直接将其杀死或者报OOM),
而Java进程在创建瞬间内存将翻倍,之后骤降到正常值,这种情况下,采用线程监控的方式更加灵活(当发现进程树内存瞬间翻倍超过设定值时,
可认为是正常现象,不会将任务杀死),因此YARN未提供Cgroups内存隔离机制。-->
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>8192</value>
</property>
<!-- 新框架中 NodeManager 与 RM 通信的接口地址-->
<property>
<name>yarn.resourcemanager.address</name>
<value>JXQ-23-27-50.com.cn:8032</value>
</property>
<!-- 新框架中 NodeManger 需要知道 RM 主机的 scheduler 调度服务接口地址-->
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>JXQ-23-27-50.com.cn:8030</value>
</property>
<!-- 新框架中 NodeManager 需要向 RM 报告任务运行状态供 Resouce 跟踪,因此 NodeManager 节点主机需要知道 RM 主机的 tracker 接口地址-->
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>JXQ-23-27-50.com.cn:8031</value>
</property>
<!-- ResourceManager 对管理员暴露的访问地址。管理员通过该地址向RM发送管理命令等。默认8033-->
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>JXQ-23-27-50.com.cn:8033</value>
</property>
<!-- 新框架中 各个 task 的资源调度及运行状况通过通过该 web 界面访问-->
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>JXQ-23-27-50.com.cn:8088</value>
</property>
<!-- yarn的web服务器地址-->
<property>
<name>yarn.web-proxy.address</name>
<value>JXQ-23-27-50.com.cn:54315</value>
</property>
</configuration>
[root@JXQ-23-27-48 conf]# cat topo.data
172.23.27.50 /rack001
172.23.27.51 /rack001
172.23.27.52 /rack002
172.23.27.53 /rack002
172.23.27.54 /rack002
[root@JXQ-23-27-48 conf]# cat topo.sh
#!/bin/sh
HADOOP_CONF=/etc/hadoop/conf
echo `date` input: $@ >> /tmp/topology.log
while [ $# -gt 0 ] ; do
nodeArg=$1
exec< ${HADOOP_CONF}/topo.data
result=""
while read line ; do
ar=( $line )
if [ "${ar[0]}" = "$nodeArg" ] ; then
result="${ar[1]}"
fi
done
shift
if [ -z "$result" ] ; then
echo -n "/default/rack"
else
echo -n "$result"
fi
done
五、同步文件(所有机器)
5.1.配置环境变量 /etc/profile
export JAVA_HOME=/usr/java/jdk1.7.0_51
export HADOOP_HOME=/usr/lib/hadoop
export HADOOP_HDFS_HOME=/usr/lib/hadoop-hdfs
export HADOOP_MAPRED_HOME=/usr/lib/hadoop-mapreduce
export HADOOP_YARN_HOME=/usr/lib/hadoop-yarn
export HADOOP_COMMON_HOME=${HADOOP_HOME}
export HADOOP_LIBEXEC_DIR=${HADOOP_HOME}/libexec
export HADOOP_CONF_DIR=${HADOOP_HOME}/etc/hadoop
export HDFS_CONF_DIR=${HADOOP_HOME}/etc/hadoop
export YARN_CONF_DIR=${HADOOP_HOME}/etc/hadoop
export PATH=$PATH:$JAVA_HOME/bin:$SCALA_HOME/bin
export CLASSPATH=$JAVA_HOME/lib:$CLASSPATH:/usr/lib/hadoop-hdfs/lib:/usr/lib/hadoop/lib:/usr/lib/hadoop-mapreduce/lib:/usr/lib/hadoop-yarn/lib
5.2.拷贝conf文件夹
scp -P 51899 -r /etc/hadoop/conf pe@172.23.27.49:/tmp
scp -P 51899 -r /etc/hadoop/conf pe@172.23.27.50:/tmp
...
scp -P 51899 -r /etc/hadoop/conf pe@172.23.27.56:/tmp
scp -P 51899 -r /etc/hadoop/conf pe@172.23.27.57:/tmp
因为环境权限原先,测试环境服务器间的root用户不能直接拷贝东西,
所以切换pe,先把数据拷贝到根目录tmp目录,然后再mv到/etc/hadoop/conf; 端口22被封闭,开放了51899
5.3.拷贝profile环境变量
scp -P 51899 /etc/profile pe@172.23.27.57:/tmp
scp -P 51899 /etc/profile pe@172.23.27.56:/tmp
...
scp -P 51899 /etc/profile pe@172.23.27.50:/tmp
scp -P 51899 /etc/profile pe@172.23.27.49:/tmp
六、启动集群
启动主namenode:(48)
[root@JXQ-23-27-48 conf]# su - hdfs
-bash-4.1$ hadoop namenode -format
-bash-4.1$ exit
[root@JXQ-23-27-48 conf]# service hadoop-hdfs-namenode start
启动辅 namenode:(49)
注:初次启动时需要,以后通过Journalnode自动同步
[root@JXQ-23-27-49~]# sudo -u hdfs hadoop namenode -bootstrapStandby
[root@JXQ-23-27-49~]# service hadoop-hdfs-namenode start
[root@JXQ-23-27-48conf]# jps
20232NameNode
24067Jps
[root@JXQ-23-27-49~]# jps
19993NameNode
23701Jps
格式化zk
[root@JXQ-23-27-48 conf]# su -hdfs
-bash-4.1$ hdfs zkfc -formatZK
在任意一个NameNode上下面命令,其会创建一个znode用于自动故障转移。
2个namenode都启动zkfc:
servicehadoop-hdfs-zkfc start 或者/etc/init.d/hadoop-hdfs-zkfc start
查看zk:
[root@JXQ-23-27-55~]# /usr/lib/zookeeper/bin/zkCli.sh
[zk:localhost:2181(CONNECTED) 5] ls /
[hadoop-ha,zookeeper]
[zk:localhost:2181(CONNECTED) 4] ls /hadoop-ha/m6-hadoop3
[ActiveBreadCrumb,ActiveStandbyElectorLock]
查看namenode状态:
[root@JXQ-23-27-48tmp]# sudo -u hdfs hdfs haadmin -getServiceState nn2
[root@JXQ-23-27-48tmp]# sudo -u hdfs hdfs haadmin -getServiceState nn1
手动切换命令:(把nn1变成standby,nn2变成actiove)
[root@JXQ-23-27-48tmp]# sudo -u hdfs hdfs haadmin -failover nn1 nn2
Failover to NameNode at JXQ-23-27-49.com.cn/172.23.27.49:8020successful
[root@JXQ-23-27-48tmp]# sudo -u hdfs hdfs haadmin -getServiceState nn1
standby
启动datanode:(50,51,52,53,54)
[root@JXQ-23-27-50~]# service hadoop-hdfs-datanode start
[root@JXQ-23-27-51~]# service hadoop-hdfs-datanode start
[root@JXQ-23-27-52~]# service hadoop-hdfs-datanode start
[root@JXQ-23-27-53~]# service hadoop-hdfs-datanode start
[root@JXQ-23-27-54~]# service hadoop-hdfs-datanode start
查看集群状态:
[root@JXQ-23-27-48 tmp]# su - hdfs
-bash-4.1$ hdfs dfsadmin -report
Configured Capacity: 603709177856 (562.25 GB)
Present Capacity: 572255666176 (532.95 GB)
DFS Remaining: 572255567872 (532.95 GB)
DFS Used: 98304 (96 KB)
DFS Used%: 0.00%
Under replicated blocks: 0
Blocks with corrupt replicas: 0
Missing blocks: 0
-------------------------------------------------
Datanodes available: 4 (5 total, 1 dead)
Live datanodes:
Name: 172.23.27.50:50010 (JXQ-23-27-50.com.cn)
Hostname: JXQ-23-27-50.com.cn
Rack: /rack001
Decommission Status : Normal
Configured Capacity: 150927294464 (140.56 GB)
DFS Used: 24576 (24 KB)
Non DFS Used: 7863377920 (7.32 GB)
DFS Remaining: 143063891968 (133.24 GB)
DFS Used%: 0.00%
DFS Remaining%: 94.79%
Last contact: Tue Feb 03 14:53:39 CST 2015
Name: 172.23.27.52:50010 (JXQ-23-27-52.com.cn)
Hostname: JXQ-23-27-52.com.cn
Rack: /rack002
Decommission Status : Normal
Configured Capacity: 150927294464 (140.56 GB)
DFS Used: 24576 (24 KB)
Non DFS Used: 7863377920 (7.32 GB)
DFS Remaining: 143063891968 (133.24 GB)
DFS Used%: 0.00%
DFS Remaining%: 94.79%
Last contact: Tue Feb 03 14:53:37 CST 2015
Name: 172.23.27.53:50010 (JXQ-23-27-53.com.cn)
Hostname: JXQ-23-27-53.com.cn
Rack: /rack002
Decommission Status : Normal
Configured Capacity: 150927294464 (140.56 GB)
DFS Used: 24576 (24 KB)
Non DFS Used: 7863377920 (7.32 GB)
DFS Remaining: 143063891968 (133.24 GB)
DFS Used%: 0.00%
DFS Remaining%: 94.79%
Last contact: Tue Feb 03 14:53:37 CST 2015
Name: 172.23.27.51:50010 (JXQ-23-27-51.com.cn)
Hostname: JXQ-23-27-51.com.cn
Rack: /rack001
Decommission Status : Normal
Configured Capacity: 150927294464 (140.56 GB)
DFS Used: 24576 (24 KB)
Non DFS Used: 7863377920 (7.32 GB)
DFS Remaining: 143063891968 (133.24 GB)
DFS Used%: 0.00%
DFS Remaining%: 94.79%
Last contact: Tue Feb 03 14:53:38 CST 2015
Dead datanodes:
Name: 172.23.27.54:50010 (JXQ-23-27-54.com.cn)
Hostname: JXQ-23-27-54.com.cn
Decommission Status : Normal
Configured Capacity: 0 (0 B)
DFS Used: 0 (0 B)
Non DFS Used: 0 (0 B)
DFS Remaining: 0 (0 B)
DFS Used%: 100.00%
DFS Remaining%: 0.00%
Last contact: Thu Jan 01 08:00:00 CST 1970
启动yarn(resourcemanager、nodemanager):(50,51,52,53,54)
[root@JXQ-23-27-50 ~]# servicehadoop-yarn-resourcemanager start
[root@JXQ-23-27-50 ~]# servicehadoop-yarn-nodemanager start
[root@JXQ-23-27-51 ~]# servicehadoop-yarn-nodemanager start
[root@JXQ-23-27-52 ~]# servicehadoop-yarn-nodemanager start
[root@JXQ-23-27-53 ~]# servicehadoop-yarn-nodemanager start
[root@JXQ-23-27-54 ~]# servicehadoop-yarn-nodemanager start
七、测试集群
创建普通用户:chensy
[root@JXQ-23-27-50 tmp]#useradd chensy
[root@JXQ-23-27-50tmp]# su - chensy
在hdfs给创建相关目录:
[root@JXQ-23-27-48 conf]# su- hdfs
-bash-4.1$ hadoop fs -ls /
Found 1 items
drwxr-xr-x - yarn hadoop 0 2015-02-03 14:58 /var
-bash-4.1$ hadoop fs -mkdir/user
-bash-4.1$ hadoop fs -ls /
Found 2 items
drwxr-xr-x - hdfs hadoop 0 2015-02-03 15:33 /user
drwxr-xr-x - yarn hadoop 0 2015-02-03 14:58 /var
-bash-4.1$ hadoop fs -mkdir/user/chensy
-bash-4.1$ hadoop fs -ls/user
Found 1 items
drwxr-xr-x - hdfs hadoop 0 2015-02-03 15:33 /user/chensy
-bash-4.1$hadoop fs -chown chensy:chensy /user/chensy
-bash-4.1$ hadoop fs -chmod 700 /user/chensy
创建input目录
[chensy@JXQ-23-27-50~]$ hadoop fs -mkdir input
[chensy@JXQ-23-27-50~]$ hadoop fs -put /etc/hadoop/conf/*.xml input
执行mapreduce:
[chensy@JXQ-23-27-50 ~]$
hadoopjar /usr/lib/hadoop-mapreduce/hadoop-mapreduce-examples.jar grep input output'dfs[a-z.]+'
故障(临时输入目录未产生,根本原因是job的中间结构目录没有创建)
ERROR security.UserGroupInformation:PriviledgedActionException as:chensy (auth:SIMPLE) cause:org.apache.hadoop.mapreduce.lib.input.InvalidInputException:Input path does not exist: hdfs://m6-hadoop3/user/chensy/grep-temp-1886952718
解决办法(将chensy加入hadoop组或者修改history目录权限)
[root@JXQ-23-27-48 conf]# su - hdfs
-bash-4.1$ hadoop fs -ls /
Found 2 items
drwxr-xr-x - hdfs hadoop 02015-02-03 15:33 /user
drwxr-xr-x - yarn hadoop 02015-02-03 14:58 /var
-bash-4.1$ hadoop fs -ls /user
Found 1 items
drwx------ - chensy chensy 02015-02-03 15:48 /user/chensy
-bash-4.1$ hadoop fs -mkdir /user/history
-bash-4.1$ hadoop fs -mkdir/user/history/intermediate
-bash-4.1$ hadoop fs -mkdir/user/history/done
-bash-4.1$ hadoop fs -chmod 775 /user/history
-bash-4.1$ hadoop fs -ls /user/history
Found 2 items
drwxr-xr-x - hdfs hadoop 02015-02-03 15:53 /user/history/done
drwxr-xr-x - hdfs hadoop 02015-02-03 15:53 /user/history/intermediate
-bash-4.1$ hadoop fs -chownmapred:hadoop /user/history/
-bash-4.1$ hadoop fs -chownmapred:hadoop /user/history/intermediate
-bash-4.1$ hadoop fs -chownmapred:hadoop /user/history/done
-bash-4.1$ hadoop fs -chmod 777 /user/history
-bash-4.1$ hadoop fs -ls /user/history
Found 2 items
drwxrwxrwx - mapred hadoop 02015-02-03 15:53 /user/history/done
drwxrwxrwx - mapred hadoop 02015-02-03 16:28 /user/history/intermediate
更改输出目录output123后再次执行mr:
[chensy@JXQ-23-27-50 ~]$
hadoopjar /usr/lib/hadoop-mapreduce/hadoop-mapreduce-examples.jar grep input output123'dfs[a-z.]+'
OK,完工!