1 更换阿里云yum源
wget http://mirrors.aliyun.com/repo/Centos-7.repo -O ./Centos-7.repo
cp Centos-7.repo /etc/yum.repos.d/
cd /etc/yum.repos.d/
mv CentOS-Base.repo CentOS-Base.repo.bak
mv Centos-7.repo CentOS-Base.repo
yum clean all
yum makecache
yum update -y
2 安装常用软件
yum install -y openssh-server vim gcc gcc-c++ glibc-headers bzip2-devel lzo-devel curl wget openssh-clients zlib-devel autoconf automake cmake libtool openssl-devel fuse-devel snappy-devel telnet unzip zip net-tools.x86_64 firewalld systemd ntp unrar bzip2
#安装rz sz用于上传下载文件
yum install -y lrzsz
3 安装jdk
下载jdk wget jdk下载地址
#安装jdk
rpm -ivh jdk-8u144-linux-x64.rpm
#配置环境变量
echo 'export JAVA_HOME=/usr/java/jdk1.8.0_144' >> /etc/profile
echo 'export PATH=$JAVA_HOME/bin:$PATH' >> /etc/profile
source /etc/profile
4 修改主机名hostname及hosts本地域名解析
vim /etc/hostname
#将六台机器分别修改为nn1,nn2,nn3,s1,s2,s3
vim /etc/hosts
#根据各台机器的的ip设置
#将配置拷贝到其余几台机器
scp /etc/hosts root@nn2:/etc
scp /etc/hosts root@nn3:/etc
scp /etc/hosts root@s1:/etc
scp /etc/hosts root@s2:/etc
scp /etc/hosts root@s3:/etc
5 创建hadoop用户,并且实现root的免密切换
#批量执行以下脚本
#添加用户
useradd hadoop
#修改密码
echo '新密码'|passwd hadoop --stdin
#禁止非wheel组的用户调用su切换用户,而wheel组的用户可以免密切换到root
sed -i 's/#auth\t\trequired\tpam_wheel.so/auth\t\trequired\tpam_wheel.so/g' '/etc/pam.d/su'
sed -i 's/#auth\t\tsufficient\tpam_wheel.so/auth\t\tsufficient\tpam_wheel.so/g' '/etc/pam.d/su'
#只有wheel组的用户可以su到root
cp /etc/login.defs /etc/login.defs.bak
echo "SU_WHEEL_ONLY yes" >> /etc/login.defs
#将hadoop用户加入到wheel组
gpasswd -a hadoop wheel
#查看配置结果
cat /etc/group|grep wheel
#将用户切换到hadoop
su - hadoop
6 配置hadoop用户的跨服务器免密登录
#在nn1节点上执行以下脚本
#生成公私钥
ssh-keygen
#三次回车,完成创建
#注册公钥到所有机器(包括自己)
ssh-copy-id 目标地址
#选择yes并敲入目标地址的hadoop用户密码,完成公钥注册
#将私钥拷贝到其他机器
scp /home/hadoop/.ssh/id_rsa hadoop@nn2:/home/hadoop/.ssh/
scp /home/hadoop/.ssh/id_rsa hadoop@nn3:/home/hadoop/.ssh/
scp /home/hadoop/.ssh/id_rsa hadoop@s1:/home/hadoop/.ssh/
scp /home/hadoop/.ssh/id_rsa hadoop@s2:/home/hadoop/.ssh/
scp /home/hadoop/.ssh/id_rsa hadoop@s3:/home/hadoop/.ssh/
#麒麟系统默认使用ed25519算法生成密钥,为了与其他操作系统兼容,生成密钥时需要指定算法
ssh-keygen -t ed25519
#如果没有ssh-copy-id命令,可以使用如下cat等命令代替
cat ~/.ssh/id_*.pub | ssh -p 2200 hadoop@ip 'cat >> ~/.ssh/authorized_keys'
#将私钥拷贝到其他机器
scp -P 2200 ~/.ssh/id_ed25519 hadoop@nn2:~/.ssh/
scp -P 2200 ~/.ssh/id_ed25519 hadoop@nn3:~/.ssh/
scp -P 2200 ~/.ssh/id_ed25519 hadoop@s1:~/.ssh/
scp -P 2200 ~/.ssh/id_ed25519 hadoop@s2:~/.ssh/
scp -P 2200 ~/.ssh/id_ed25519 hadoop@s3:~/.ssh/
7 创建批量操作脚本
#在nn1上执行以下的脚本
#创建bin目录存放所有脚本
cd ~
mkdir bin
cd bin
#创建ips文件,存放所有服务器的地址
touch ips
echo "nn1" > ./ips
echo "nn2" >> ./ips
echo "nn3" >> ./ips
echo "s1" >> ./ips
echo "s2" >> ./ips
echo "s3" >> ./ips
7.1循环执行脚本loop.sh
#! /bin/bash
#进入脚本所在目录
cd `dirname $0`
#获取当前目录
dir_path=`pwd`
#echo dir_path
#读取ips文件到数组
ip_arr=(`cat $dir_path/ips`)
#遍历数组中的主机名
for ip in ${ip_arr[*]}
do
_cmd="$*"
echo $_cmd
#通过eval执行传入的命令
if eval ${_cmd}; then
echo "$ip : ok"
else
echo "$ip : fail"
fi
done
7.2 远程执行脚本 ssh_all.sh
#! /bin/bash
#必须传入相应的命令
if [ -z "$*" ]; then
echo "必须传入需要执行的脚本"
exit 1
fi
#进入脚本所在目录
cd `dirname $0`
_cmd="ssh hadoop@\${ip} \"$*\" "
loop.sh $_cmd
7.3 远程拷贝文件scp_all.sh
#! /bin/bash
#必须传入相应的命令
if [ -z "$1" ] || [ -z "$2" ]; then
echo "必须传入源和目标"
exit 1
fi
#进入脚本所在目录
cd `dirname $0`
#源
_source=$1
#目标
_target=$2
#获取当前目录
_cmd="scp -r ${_source} hadoop@\${ip}:${_target}"
loop.sh $_cmd
7.4 切换到root用户远程执行命令脚本 ssh_root.sh
首先在每个服务器hadoop的家目录下创建exe.sh脚本,用于代理切换到root下执行命令
#! /bin/bash
#切换到root用户执行cmd命令
cmd=$*
su - <<EOF
$cmd
EOF
#对所有的脚本添加运行权限
chmod +x *.sh
#将其拷贝到每台机器的家目录
scp_all.sh ~/bin/exe.sh ~
编写ssh_root.sh,将命令传递到远端,通过exe.sh代理,以root用户执行相应脚本
#! /bin/bash
#必须传入相应的命令
if [ -z "$*" ]; then
echo "必须传入需要执行的脚本"
exit 1
fi
#进入脚本所在目录
cd `dirname $0`
_cmd="ssh hadoop@\${ip} ~/exe.sh \"$*\" "
loop.sh $_cmd
#添加运行权限
chmod +x ssh_root.sh
7.5 拷贝上述所有脚本,生成只针对nn1,nn2,nn3三台服务器的版本,用于安装zookeeper
touch ips_zoo
echo "nn1" > ./ips_zoo
echo "nn2" >> ./ips_zoo
echo "nn3" >> ./ips_zoo
cp loop.sh loop_zoo.sh
sed -i 's/ips/ips_zoo/g' 'loop_zoo.sh'
cp ssh_all.sh ssh_all_zoo.sh
cp scp_all.sh scp_all_zoo.sh
cp ssh_root.sh ssh_root_zoo.sh
sed -i 's/loop.sh/loop_zoo.sh/g' 'ssh_all_zoo.sh'
sed -i 's/loop.sh/loop_zoo.sh/g' 'scp_all_zoo.sh'
sed -i 's/loop.sh/loop_zoo.sh/g' 'ssh_root_zoo.sh'
8 安装zookeeper
8.1 下载安装包并解压
#下载zookeeper安装包
#/public/software/bigdata/zookeeper-3.4.8.tar.gz
#解压缩
ssh_root_zoo.sh tar -zxf /public/software/bigdata/zookeeper-3.4.8.tar.gz -C /usr/local/
ssh_root_zoo.sh tar -zxf /u01/software/zookeeper-3.4.8.tar.gz -C /usr/local/
#修改zookeeper目录所属用户和组为hadoop,创建软链接
ssh_root_zoo.sh chown -R hadoop:hadoop /usr/local/zookeeper-3.4.8
ssh_root_zoo.sh ln -s /usr/local/zookeeper-3.4.8/ /usr/local/zookeeper
8.2 修改配置文件zoo.cfg
#在nn1节点执行以下脚本
#拷贝zoo_sample.cfg为zoo.cfg
cp /usr/local/zookeeper/conf/zoo_sample.cfg /usr/local/zookeeper/conf/zoo.cfg
#创建/data/zookeeper目录,并将/data目录的owner修改为hadoop
ssh_root_zoo.sh mkdir /data/zookeeper
ssh_root_zoo.sh chown -R hadoop:hadoop /data
#修改数据目录为/data/zookeeper/
sed -i 's/dataDir=\/tmp\/zookeeper/dataDir=\/data\/zookeeper/g' '/usr/local/zookeeper/conf/zoo.cfg'
#在zoo.cfg中添加服务节点配置。其中1,2,3代表节点编号,2888为节点间的通信端口,3888为节点间的选举端口
echo 'server.1=nn1:2888:3888' >> /usr/local/zookeeper/conf/zoo.cfg
echo 'server.2=nn2:2888:3888' >> /usr/local/zookeeper/conf/zoo.cfg
echo 'server.3=nn3:2888:3888' >> /usr/local/zookeeper/conf/zoo.cfg
#将配置文件拷贝到其他服务器
scp_all_zoo.sh /usr/local/zookeeper/conf/zoo.cfg /usr/local/zookeeper/conf/
8.3 设置各节点的myid
#在nn1,nn2,nn3节点分别设置myid,分别设置为1,2,3,与zoo.cfg中server.后面的编号对应
echo "1" >/data/zookeeper/myid #nn1执行
echo "2" >/data/zookeeper/myid #nn2执行
echo "3" >/data/zookeeper/myid #nn3执行
8.4 修改日志文件的输出目录
#修改/usr/local/zookeeper/bin/zkEnv.sh,将日志的输出路径定位到/data/zookeeper/目录
vim /usr/local/zookeeper/bin/zkEnv.sh
#将以下的配置放到靠前的位置
ZOO_LOG_DIR=/data/zookeeper
#将配置拷贝到其他节点
scp_all_zoo.sh /usr/local/zookeeper/bin/zkEnv.sh /usr/local/zookeeper/bin/
8.5 修改环境变量
#修改环境变量,添加ZOOKEEPER_HOME并修改PATH
#切换到root
su -
echo 'export ZOOKEEPER_HOME=/usr/local/zookeeper' >> /etc/profile
echo 'export PATH=$ZOOKEEPER_HOME/bin:$PATH' >> /etc/profile
#退回hadoop
exit
#将profile文件上传到其他服务器
scp_all_zoo.sh /etc/profile /tmp/
ssh_root_zoo.sh mv /tmp/profile /etc/
#分别执行source /etc/profile或者重新登录,使profile生效
source /etc/profile
#第二种方法,将环境变量配置到用户文件
#.bash_profile在登录shell时加载
#.bashrc在生成会话时生效,包括登录shell和远程登录脚本。.bash_profile脚本中会主动调用.bashrc
su - hadoop
echo 'export JAVA_HOME=/usr/java/jdk1.8.0_144' >> ~/.bashrc
echo 'export PATH=$JAVA_HOME/bin:$PATH' >> ~/.bashrc
echo 'export ZOOKEEPER_HOME=/usr/local/zookeeper' >> ~/.bashrc
echo 'export PATH=$ZOOKEEPER_HOME/bin:$PATH' >> ~/.bashrc
scp_all_zoo.sh ~/.bashrc ~
source ~/.bash_profile
后续所有的.sh文件,都在最前面加上 source ~/.bash_profile
8.6 启动服务
ssh_all_zoo.sh /usr/local/zookeeper/bin/zkServer.sh start
#查看运行情况
ssh_all_zoo.sh jps
ssh_all_zoo.sh /usr/local/zookeeper/bin/zkServer.sh status
9 安装hdfs
9.1 解压安装包
#解压缩
ssh_root.sh tar -zxf /public/software/bigdata/hadoop-3.1.4.tar.gz -C /usr/local/
#ssh_root.sh tar -zxf /u01/software/hadoop-3.1.4.tar.gz -C /usr/local/
#修改文件的owner
ssh_root.sh chown -R hadoop:hadoop /usr/local/hadoop-3.1.4/
#建立软链接
ssh_root.sh ln -s /usr/local/hadoop-3.1.4/ /usr/local/hadoop
9.2 修改环境变量
#切换到root用户
su -
#第一种方法 修改/etc/profile
echo 'export HADOOP_HOME=/usr/local/hadoop' >> /etc/profile
echo 'export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH' >> /etc/profile
source /etc/profile
#将配置文件分发到所有服务器
scp_all.sh /etc/profile /tmp
ssh_root.sh mv /tmp/profile /etc/#所有服务器批量执行source,或者重新登录,使环境变量生效
source /etc/profile
#第二种方法,将环境变量添加到~/.bashrc
echo 'export HADOOP_HOME=/usr/local/hadoop' >> ~/.bashrc
echo 'export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH' >> ~/.bashrc
source ~/.bashrc
#将配置文件分发到所有服务器
scp_all.sh ~/.bashrc ~
9.3 配置namenode
9.3.1 修改core-site.xml
cd /usr/local/hadoop/etc/hadoop/
vim core-site.xml
增加如下配置
<!--基础配置start-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://ns1</value>
<description>默认文件服务的协议和NS逻辑名称,和hdfs-site.xml里对应此配置。替代了1.0里的fs.default.name</description>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/data/hadoop/tmp</value>
<description>数据存储目录</description>
</property>
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>hadoop</value>
<description>配置hadoop超级用户的代理用户所属组</description>
</property>
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>localhost</value>
<description>配置hadoop的超级用户允许访问的主机节点</description>
</property>
<!--基础配置end-->
9.3.2 修改hdfs-site.xml
cd/usr/local/hadoop/etc/hadoop/
vim hdfs-site.xml
增加如下配置
<!--namenode基础配置start-->
<property>
<name>dfs.namenode.name.dir</name>
<value>/data/hadoop/namenode</value>
<description>namenode本地文件存放地址</description>
</property>
<property>
<name>dfs.nameservices</name>
<value>ns1</value>
<description>提供服务的NS逻辑名称,与core-site.xml里的对应</description>
</property>
<property>
<name>dfs.ha.namenodes.ns1</name>
<value>nn1,nn2,nn3</value>
<description>列出该逻辑名称下的NameNode对应的服务器地址列表</description>
</property>
<property>
<name>dfs.namenode.rpc-address.ns1.nn1</name>
<value>nn1:9000</value>
<description>指定NameNode的RPC通信地址</description>
</property>
<property>
<name>dfs.namenode.http-address.ns1.nn1</name>
<value>nn1:50070</value>
<description>指定NameNode的Web Server地址</description>
</property>
<property>
<name>dfs.namenode.rpc-address.ns1.nn2</name>
<value>nn2:9000</value>
<description>指定NameNode的RPC通信地址</description>
</property>
<property>
<name>dfs.namenode.http-address.ns1.nn2</name>
<value>nn2:50070</value>
<description>指定NameNode的Web Server地址</description>
</property>
<property>
<name>dfs.namenode.rpc-address.ns1.nn3</name>
<value>nn3:9000</value>
<description>指定NameNode的RPC通信地址</description>
</property>
<property>
<name>dfs.namenode.http-address.ns1.nn3</name>
<value>nn3:50070</value>
<description>指定NameNode的Web Server地址</description>
</property>
<property>
<name>dfs.namenode.handler.count</name>
<value>77</value>
<description>namenode的工作线程数</description>
</property>
<!--namenode基础配置end-->
9.3.3 修改hadoop-env.sh
#添加重新加载环境变量
sed -i '46a\source /etc/profile' /usr/local/hadoop/etc/hadoop/hadoop-env.sh
#设置内存参数
sed -i 's/# export HADOOP_HEAPSIZE_MAX=/export HADOOP_HEAPSIZE_MAX=512/g' '/usr/local/hadoop/etc/hadoop/hadoop-env.sh'
9.3.4 分发配置好的文件到其他机器
scp_all.sh /usr/local/hadoop/etc/hadoop/core-site.xml /usr/local/hadoop/etc/hadoop/
scp_all.sh /usr/local/hadoop/etc/hadoop/hdfs-site.xml /usr/local/hadoop/etc/hadoop/
scp_all.sh /usr/local/hadoop/etc/hadoop/hadoop-env.sh /usr/local/hadoop/etc/hadoop/
9.3.5 修改/data目录的所有者为hadoop
ssh_root.sh chown -R hadoop:hadoop /data/hadoop
9.4 安装元数据同步组件journalnode
9.4.1 修改配置文件
cd/usr/local/hadoop/etc/hadoop/
vim hdfs-site.xml
#修改hdfs.xml,添加以下内容
增加如下配置
<!--journalnode配置start-->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://nn1:8485;nn2:8485;nn3:8485/ns1</value>
<description>指定用于HA存放edits的共享存储,通常是namenode的所在机器 </description>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/data/hadoop/journaldata/</value>
<description>journaldata服务存放文件的地址</description>
</property>
<property>
<name>ipc.client.connect.max.retries</name>
<value>10</value>
<description>namenode和journalnode的链接重试次数10次</description>
</property>
<property>
<name>ipc.client.connect.retry.interval</name>
<value>10000</value>
<description>重试的间隔时间10s</description>
</property>
<!--journalnode配置end-->
将其拷贝到其他节点
scp_all.sh /usr/local/hadoop/etc/hadoop/hdfs-site.xml /usr/local/hadoop/etc/hadoop/
9.4.2 启动journalnode
#ssh_all_zoo.sh hadoop-daemon.sh start journalnode
ssh_all_zoo.sh hdfs --daemon start journalnode
9.5 启动zkfc实现namenode的active选举
9.5.1 配置zkfc
修改core-site.xml,添加如下内容,配置zookeerper信息
<!--zookeeper配置start-->
<property>
<name>ha.zookeeper.quorum</name>
<value>nn1:2181,nn2:2181,nn3:2181</value>
<description>HA使用的zookeeper地址</description>
</property>
<!--zookeeper配置end-->
hdfs-site.xml增加如下配置
<!--zkfc配置start-->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
<description>指定HA做隔离的方法,缺省是ssh,可设为shell,稍后详述</description>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/hadoop/.ssh/id_rsa</value>
<description>杀死命令脚本的免密配置秘钥</description>
</property>
<property>
<name>dfs.client.failover.proxy.provider.ns1</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<property>
<name>dfs.client.failover.proxy.provider.auto-ha</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!--zkfc配置end-->
重新分发两个配置文件
scp_all.sh /usr/local/hadoop/etc/hadoop/core-site.xml /usr/local/hadoop/etc/hadoop/
scp_all.sh /usr/local/hadoop/etc/hadoop/hdfs-site.xml /usr/local/hadoop/etc/hadoop/
9.5.2 启动zkfc
#格式化zookeeper
hdfs zkfc -formatZK
#分别在nn1,nn2,nn3机器启动zkfc
#hadoop-daemon.sh start zkfc
hdfs --daemon start zkfc
9.6 格式化并启动namenode
9.6.1 操作主节点
#在nn1执行
#格式化namenode
hdfs namenode -format
#启动hdfs
#hadoop-daemon.sh start namenode
hdfs --daemon start namenode
#验证结果
jps
#通过管理页面验证
curl http://nn1:50070
9.6.2 操作其他节点
#启动其他两个节点
#格式化从节点
hdfs namenode -bootstrapStandby
#启动hdfs
#hadoop-daemon.sh start namenode
hdfs --daemon start namenode
#通过管理页面验证
curl http://nn2:50070
curl http://nn2:53070
查看namenode的主从状态
#手动切换nn1的节点是主节点
#hdfs haadmin -transitionToActive nn1
#查看节点状态
hdfs haadmin -getServiceState nn1
hdfs haadmin -getServiceState nn2
hdfs haadmin -getServiceState nn3
9.7 配置并启动datanode
9.7.1 修改hdfs-site.xml
添加如下配置
<!--datanode基础配置start-->
<property>
<name>dfs.datanode.data.dir</name>
<value>/data/hadoop/datanode</value>
<description>datanode本地文件存放地址</description>
</property>
<property>
<name>dfs.replication</name>
<value>3</value>
<description>文件复本数</description>
</property>
<property>
<name>dfs.namenode.datanode.registration.ip-hostname-check</name>
<value>false</value>
</property>
<property>
<name>dfs.client.use.datanode.hostname</name>
<value>true</value>
</property>
<property>
<name>dfs.datanode.use.datanode.hostname</name>
<value>true</value>
</property>
<!--datanode基础配置end-->
9.7.2 修改workers文件,配置datanode节点列表
echo "s1" > '/usr/local/hadoop/etc/hadoop/workers'
echo "s2" >> '/usr/local/hadoop/etc/hadoop/workers'
echo "s3" >> '/usr/local/hadoop/etc/hadoop/workers'
9.7.3 拷贝配置文件到其他服务器
scp_all.sh /usr/local/hadoop/etc/hadoop/hdfs-site.xml /usr/local/hadoop/etc/hadoop
scp_all.sh /usr/local/hadoop/etc/hadoop/workers /usr/local/hadoop/etc/hadoop
9.8 其他高级配置
9.8.1 core-site.xml
#开启本地库对压缩的支持
<property>
<name>io.native.lib.available</name>
<value>true</value>
<description>开启本地库支持</description>
</property>
#支持的压缩格式
<property>
<name>io.compression.codecs</name>
<value>
org.apache.hadoop.io.compress.GzipCodec,//最快,常用
org.apache.hadoop.io.compress.DefaultCodec,
org.apache.hadoop.io.compress.BZip2Codec,//压缩率最高
org.apache.hadoop.io.compress.SnappyCodec//折中,常用
</value>
<description>相应编码的操作类</description>
</property>
#SequenceFiles在读写中可以使用的缓存大小
<property>
<name>io.file.buffer.size</name>
<value>131072</value>
<description>SequenceFiles在读写中可以使用的缓存大小</description>
</property>
# 设置mr输入到hdfs中的数据的压缩是按照块压缩
<property>
<name>mapreduce.output.fileoutputformat.compress.type</name>
<value>BLOCK</value>
</property>
# 存入到hdfs中的文件是按照块为一个整体进行压缩
<property>
<name>io.seqfile.compressioin.type</name>
<value>BLOCK</value>
</property>
# 客户端连接超时时间
<property>
<name>ipc.client.connection.maxidletime</name>
<value>60000</value>
</property>
9.8.2 hdfs-site.xml
# hdfs开启支持文件追加操作
#关闭文件系统权限
#开启垃圾箱,删除的文件不会消失会移除到垃圾箱中
<property>
<name>dfs.support.append</name>
<value>true</value>
<description>是否支持追加</description>
</property>
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
<description>是否开启目录权限</description>
</property>
<property>
<name>fs.trash.interval</name>
<value>2880</value>
<description>回收周期</description>
</property>
# datanode在读写本地文件的时候设置最大机器文件打开数
<property>
<name>dfs.datanode.max.transfer.threads</name>
<value>8192</value>
<description>相当于linux下的打开文件最大数量,文档中无此参数,当出现DataXceiver报错的时候,需要调大。默认256</description>
</property>
# 在hdfs多个节点中数据均衡的时候能够用到的最大系统带宽,防止占用太多带宽
<property>
<name>dfs.datanode.balance.bandwidthPerSec</name>
<value>104857600</value>
</property>
# 设置每个机器的磁盘要预留两个G的数据,不能全部都给hdfs使用
# 设置存储的datanode机器的选择策略,优先以机器剩余磁盘存储两个G以上
<property>
<name>dfs.datanode.du.reserved</name>
<value>2147483648</value>
<description>每个存储卷保留用作其他用途的磁盘大小</description>
</property>
<property>
<name>dfs.datanode.fsdataset.volume.choosing.policy</name>
<value>org.apache.hadoop.hdfs.server.datanode.fsdataset.AvailableSpaceVolumeChoosingPolicy</value>
<description>存储卷选择策略</description>
</property>
<property>
<name>dfs.datanode.available-space-volume-choosing-policy.balanced-space-threshold</name>
<value>2147483648</value>
<description>允许的卷剩余空间差值,2G</description>
</property>
# 设置客户端读取数据
# 如果读取数据的客户端和datanode在同一个机器上那么可以直接从本地读取数据,不需要走远程IO
<property>
<name>dfs.client.read.shortcircuit</name>
<value>true</value>
</property>
<property>
<name>dfs.domain.socket.path</name>
<value>/data/dn_socket_PORT</value>
</property>
9.8.3 配置ssh端口
echo 'export HADOOP_SSH_OPTS="-p 2200"' >> /usr/local/hadoop/etc/hadoop/hadoop-env.sh
scp_all.sh /usr/local/hadoop/etc/hadoop/hadoop-env.sh /usr/local/hadoop/etc/hadoop
9.9 总结
配置完成后,可以通过以下两个命令进行集群的启停
#停用集群
stop-dfs.sh
#启用集群
start-dfs.sh
创建操作机
#创建hadoop用户
useradd hadoop
echo '12345678'| passwd hadoop --stdin
#修改环境变量
echo 'export JAVA_HOME=/usr/local/jdk1.8.0_144' /etc/profile
echo 'export HADOOP_HOME=/usr/local/hadoop' /etc/profile
echo 'export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$JAVA_HOME/bin:$PATH' /etc/profile
#解压安装hadoop
tar -xzf /public/software/bigdata/hadoop-3.1.4.tar.gz -C /usr/local
#修改hadoop安装目录的用户为hadoop
chown -R hadoop:hadoop /usr/local/hadoop-3.1.4/
#创建软链接
rm -rf /usr/local/hadoop
ln -s /usr/local/hadoop-3.1.4 /usr/local/hadoop
#切换用户
su - hadoop
#修改.bash_profile
echo 'export JAVA_HOME=/usr/local/jdk1.8.0_144' >> ~/.bash_profile
echo 'export HADOOP_HOME=/usr/local/hadoop' >> ~/.bash_profile
echo 'export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$JAVA_HOME/bin:$PATH' >> ~/.bash_profile
source ~/.bash_profile
#从nn1拷贝hadoop配置文件
rm -rf /usr/local/hadoop/etc/hadoop/*
scp root@nn1:/usr/local/hadoop/etc/hadoop/* /usr/local/hadoop/etc/hadoop/
10. 安装YARN
10.1 配置并启动ResourceManager
10.1.1 修改配置文件yarn-env.sh
#在nn1执行以下脚本
echo 'source /etc/profile' >> /usr/local/hadoop/etc/hadoop/yarn-env.sh
echo 'export JAVA=$JAVA_HOME/bin/java' >> /usr/local/hadoop/etc/hadoop/yarn-env.sh
echo 'export JAVA_HEAP_MAX=-Xmx256m' >> /usr/local/hadoop/etc/hadoop/yarn-env.sh
echo 'export YARN_HEAPSIZE=256' >> /usr/local/hadoop/etc/hadoop/yarn-env.sh
echo 'export YARN_RESOUECEMANAGER_HEAPSIZE=256' >> /usr/local/hadoop/etc/hadoop/yarn-env.sh
#将配置文件拷贝到其他节点
scp_all.sh /usr/local/hadoop/etc/hadoop/yarn-env.sh //usr/local/hadoop/etc/hadoop/
10.1.2 修改配置文件yarn-site.xml
修改/usr/local/hadoop/etc/hadoop/yarn-site.xml
添加如下配置
<!-- RM1 configs start -->
<property>
<name>yarn.resourcemanager.address.rm1</name>
<value>nn1:8032</value>
<description>ResourceManager 对客户端暴露的地址。客户端通过该地址向RM提交应用程序,杀死应用程序等</description>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>nn1</value>
<description>ResourceManager主机名</description>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address.rm1</name>
<value>nn1:8030</value>
<description>ResourceManager对ApplicationMaster暴露的访问地址。ApplicationMaster通过该地址向RM申请、释放资源等</description>
</property>
<property>
<name>yarn.resourcemanager.webapp.https.address.rm1</name>
<value>nn1:8089</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm1</name>
<value>nn1:8088</value>
<description>ResourceManager对外web ui地址。用户可通过该地址在浏览器中查看集群各类信息。</description>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address.rm1</name>
<value>nn1:8031</value>
<description>ResourceManager对NodeManager暴露的地址。NodeManager通过该地址向RM汇报心跳,领取任务等。</description>
</property>
<property>
<name>yarn.resourcemanager.admin.address.rm1</name>
<value>nn1:8033</value>
<description>ResourceManager 对管理员暴露的访问地址。管理员通过该地址向RM发送管理命令等</description>
</property>
<!-- RM1 configs end -->
<!-- RM2 configs start -->
<property>
<name>yarn.resourcemanager.address.rm2</name>
<value>nn2:8032</value>
<description>ResourceManager 对客户端暴露的地址。客户端通过该地址向RM提交应用程序,杀死应用程序等</description>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>nn2</value>
<description>ResourceManager主机名</description>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address.rm2</name>
<value>nn2:8030</value>
<description>ResourceManager对ApplicationMaster暴露的访问地址。ApplicationMaster通过该地址向RM申请、释放资源等。</description>
</property>
<property>
<name>yarn.resourcemanager.webapp.https.address.rm2</name>
<value>nn2:8089</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm2</name>
<value>nn2:8088</value>
<description>ResourceManager对外web ui地址。用户可通过该地址在浏览器中查看集群各类信息。</description>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address.rm2</name>
<value>nn2:8031</value>
<description>ResourceManager 对NodeManager暴露的地址。NodeManager通过该地址向RM汇报心跳,领取任务等。</description>
</property>
<property>
<name>yarn.resourcemanager.admin.address.rm2</name>
<value>nn2:8033</value>
<description>ResourceManager 对管理员暴露的访问地址。管理员通过该地址向RM发送管理命令等</description>
</property>
<!-- RM2 configs end -->
<!-- RM3 configs start -->
<property>
<name>yarn.resourcemanager.address.rm3</name>
<value>nn3:8032</value>
<description>ResourceManager 对客户端暴露的地址。客户端通过该地址向RM提交应用程序,杀死应用程序等</description>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm3</name>
<value>nn3</value>
<description>ResourceManager主机名</description>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address.rm3</name>
<value>nn3:8030</value>
<description>ResourceManager对ApplicationMaster暴露的访问地址。ApplicationMaster通过该地址向RM申请、释放资源等。</description>
</property>
<property>
<name>yarn.resourcemanager.webapp.https.address.rm3</name>
<value>nn3:8089</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm3</name>
<value>nn3:8088</value>
<description>ResourceManager对外web ui地址。用户可通过该地址在浏览器中查看集群各类信息。</description>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address.rm3</name>
<value>nn3:8031</value>
<description>ResourceManager 对NodeManager暴露的地址.。NodeManager通过该地址向RM汇报心跳,领取任务等。</description>
</property>
<property>
<name>yarn.resourcemanager.admin.address.rm3</name>
<value>nn3:8033</value>
<description>ResourceManager 对管理员暴露的访问地址。管理员通过该地址向RM发送管理命令等</description>
</property>
<!-- RM3 configs end -->
10.1.3 配置ResourceManager的高可用HA
修改/usr/local/hadoop/etc/hadoop/yarn-site.xml
添加如下配置
<!-- yarn ha start -->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
<description>是否开启yarn ha</description>
</property>
<property>
<name>yarn.resourcemanager.ha.automatic-failover.embedded</name>
<value>true</value>
<description>ha状态切换为自动切换</description>
</property>
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2,rm3</value>
<description>RMs的逻辑id列表</description>
</property>
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>nn1:2181,nn2:2181,nn3:2181</value>
<description>ha状态的存储地址</description>
</property>
<!-- yarn ha end -->
<!-- 元数据存储共享 -->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>pseudo-yarn-rm-cluster</value>
<description>集群的Id</description>
</property>
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
<description>默认值为false,也就是说resourcemanager挂了相应的正在运行的任务在rm恢复后不能重新启动</description>
</property>
<property>
<name>yarn.resourcemanager.store.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
<description>配置RM状态信息存储方式3有两种,一种是FileSystemRMStateStore,另一种是MemoryRMStateStore,还有一种目前较为主流的是zkstore</description>
</property>
<property>
<name>yarn.resourcemanager.zk.state-store.address</name>
<value>nn1:2181,nn2:2181,nn3:2181</value>
<description>当使用ZK存储时,指定在ZK上的存储地址。</description>
</property>
<!-- 元数据存储共享 -->
#将配置文件分发到其他机器
scp_all.sh /usr/local/hadoop/etc/hadoop/yarn-site.xml /usr/local/hadoop/etc/hadoop/
10.1.4 启动ResourceManager
ssh_all_zoo.sh /usr/local/hadoop/sbin/yarn-daemon.sh start resourcemanager
#或者通过以下脚本启动
#ssh_all_zoo.sh /usr/local/hadoop/bin/yarn --daemon start resourcemanager
#关闭服务的命令
#ssh_all_zoo.sh /usr/local/hadoop/sbin/yarn-daemon.sh stop resourcemanager
通过nn1:8088,nn2:8088,nn3:8088查看各节点的运行状态和主从关系
10.2 配置并启动NodeManager
10.2.1 修改配置文件 yarn-site.xml
<!-- nodeManager基础配置 -->
<property>
<name>yarn.nodemanager.local-dirs</name>
<value>/data/hadoop/yarn/local</value>
<description>中间结果存放位置,存放执行Container所需的数据如可执行程序或jar包,配置文件等和运行过程中产生的临时数据</description>
</property>
<property>
<name>yarn.nodemanager.log-dirs</name>
<value>/data/hadoop/yarn/logs</value>
<description>Container运行日志存放地址(可配置多个目录)</description>
</property>
<property>
<name>yarn.nodemanager.address</name>
<value>0.0.0.0:9103</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
<description>NodeManager上运行的附属服务。需配置成mapreduce_shuffle,才可运行MapReduce程序</description>
</property>
<property>
<name>yarn.nodemanager.webapp.address</name>
<value>0.0.0.0:8042</value>
</property>
<property>
<name>yarn.nodemanager.localizer.address</name>
<value>0.0.0.0:8040</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<property>
<name>mapreduce.shuffle.port</name>
<value>23080</value>
</property>
<!-- nodeManager基础配置 -->
#将配置文件分发到其他机器
scp_all.sh /usr/local/hadoop/etc/hadoop/yarn-site.xml /usr/local/hadoop/etc/hadoop/
10.2.2 规划NodeManager的资源
资源规划:
nodemanager最多在s1申请内存 1.5,nodemanager最多在nn2申请内存 1.5G,nodemanager最多在nn3申请内存 1.5G 共计4.5G
nodemanager最多在s1申请cpu 1核,nodemanager最多在nn2申请cpu 1核,nodemanager最多在nn1申请cpu 1核 共计3核,但是一个cpu是可以同时运行多个任务的,所以在hadoop中可以将一个物理cpu和分成多个虚拟cpu,暂定为pcore:vcore=1:3 即一个物理cpu核=3个虚拟cpu核 共计9个vcore
实际在公司需要留一部分资源给系统和其他组件,不会全部都占:
假设一台服务器,内存128G,16个pcore,需要安装DataNode和NodeManager,
具体如何设置参数?
1)装完CentOS,消耗内存1G;
2)系统预留20%,防止全部使用导致系统夯住或者OOM机制事件,
或者给未来部署其他组件预留空间。此时余下128*80%=102G
3)DataNode设定2G,NodeManager设定4G,则剩余102-2-4=96G;
继续修改yarn-site.xml
<!-- nodeMananger资源限定 start -->
<property>
<name>yarn.scheduler.minimum-allocation-vcores</name>
<value>1</value>
<description>单个任务可申请的最小虚拟CPU个数</description>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-vcores</name>
<value>3</value>
<description>单个任务可申请的最大虚拟CPU个数,此参数对应yarn.nodemanager.resource.cpu-vcores,建议最大为一个物理CPU的数量</description>
</property>
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>1536</value>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>1024</value>
<description>单个任务可申请的最多物理内存量</description>
</property>
<property>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>3</value>
<description>该节点上YARN可使用的虚拟CPU个数,一个物理CPU对应3个虚拟CPU</description>
</property>
<!-- 关闭内存检测 -->
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
<description>虚拟内存检测,默认是True</description>
</property>
<property>
<name>yarn.nodemanager.pmem-check-enabled</name>
<value>false</value>
<description>物理内存检测,默认是True</description>
</property>
<property>
<name>yarn.application.classpath</name>
<value>
$HADOOP_CONF_DIR,
$HADOOP_COMMON_HOME/share/hadoop/common/*,
$HADOOP_COMMON_HOME/share/hadoop/common/lib/*,
$HADOOP_COMMON_HOME/share/hadoop/hdfs/*,
$HADOOP_COMMON_HOME/share/hadoop/hdfs/lib/*,
$HADOOP_COMMON_HOME/share/hadoop/mapreduce/*,
$HADOOP_COMMON_HOME/share/hadoop/mapreduce/lib/*,
$HADOOP_COMMON_HOME/share/hadoop/yarn/*,
$HADOOP_COMMON_HOME/share/hadoop/yarn/lib/*
</value>
</property>
<!-- nodeMananger资源限定 end-->
10.2.2 启动NodeManager
#将所有机器切换到hadoop用户
su - hadoop
#分别在在s1,s2,s3节点上启动NodeMangerer
#yarn-daemon.sh start nodemanager
#采用新的命令,在任一节点上执行以下脚本,启动所有nodemanager节点
#注意:nodemanager默认会和datanode启动到一台节点,也就是workers文件中配置的服务器
yarn --workers --daemon start nodemanager
10.3 统一脚本操作yarn的启停
#启动yarn
start-yarn.sh
#关闭yarn
stop-yarn.sh
#其他脚本
#整体操作dfs集群的脚本
start-dfs.sh
stop-dfs.sh
#整体操作hadoop集群的脚本,包括dfs和yarn
start-all.sh
stop-all.sh
11.运行mapreduce样例
11.1 修改配置文件mapred-site.xml
修改/usr/local/hadoop/etc/hadoop/mapred-site.xml
添加如下配置
<!--运行模式 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
<description>运行模式</description>
</property>
<!--运行模式 -->
<!--资源限定 -->
<property>
<name>yarn.app.mapreduce.am.resource.mb</name>
<value>1024</value>
<description>MR ApplicationMaster yarn申请的内存量</description>
</property>
<property>
<name>yarn.app.mapreduce.am.command-opts</name>
<value>-Xmx768m</value>
<description>jvm使用内存</description>
</property>
<property>
<name>mapreduce.map.memory.mb</name>
<value>1024</value>
<description>每个Map Task yarn申请内存</description>
</property>
<property>
<name>mapreduce.reduce.memory.mb</name>
<value>1024</value>
<description>每个Reduce Task yarn申请内存</description>
</property>
<property>
<name>yarn.app.mapreduce.am.resource.cpu-vcores</name>
<value>1</value>
<description>MR ApplicationMaster占用的虚拟CPU个数,此参数对应yarn.nodemanager.resource.cpu-vcores,建议最大为一个物理CPU的数量</description>
</property>
<property>
<name>mapreduce.reduce.java.opts</name>
<value>-Xmx768m</value>
<description>reduce jvm实际内存</description>
</property>
<property>
<name>mapreduce.map.java.opts</name>
<value>-Xmx768m</value>
<description>map jvm实际内存</description>
</property>
<property>
<name>mapreduce.map.cpu.vcores</name>
<value>1</value>
<description>每个map Task需要的虚拟cpu数</description>
</property>
<property>
<name>mapreduce.reduce.cpu.vcores</name>
<value>1</value>
<description>每个Reduce Task需要的虚拟cpu数</description>
</property>
<property>
<name>mapreduce.application.classpath</name>
<value>/usr/local/hadoop/etc/hadoop,/usr/local/hadoop/share/hadoop/common/*,/usr/local/hadoop/share/hadoop/common/lib/*,/usr/local/hadoop/share/hadoop/hdfs/*,/usr/local/hadoop/share/hadoop/hdfs/lib/*,/usr/local/hadoop/share/hadoop/mapreduce/*,/usr/local/hadoop/share/hadoop/mapreduce/lib/*,/usr/local/hadoop/share/hadoop/yarn/*,/usr/local/hadoop/share/hadoop/yarn/lib/*,/usr/local/hadoop/lib/*,/usr/local/hbase/lib/*</value>
<description>运行mr程序所使用的虚拟机运行时的classpath</description>
</property>
<!--资源限定 -->
#将配置分发到其他节点
scp_all.sh /usr/local/hadoop/etc/hadoop/mapred-site.xml /usr/local/hadoop/etc/hadoop/
11.2 运行测试样例
#准备测试数据
echo "hello world" >> words.txt
echo "hello hdfs" >> words.txt
echo "hello hadoop" >> words.txt
echo "hello mapreduce" >> words.txt
echo "hdfs spark" >> words.txt
echo "hello hdfs" >> words.txt
echo "hello hadoop" >> words.txt
#上传文件到hdfs中
hadoop fs -mkdir /word
hadoop fs -put words.txt /word
#查看文件
hadoop fs -ls /
运行一个mapreduce任务
hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.4.jar wordcount /word/words.txt /wcresult
查看执行结果
hadoop fs -ls /wcresult
hadoop fs -cat /wcresult/part-r-00000
11.3 不同类型的调度器配置
11.3.1 FIFO
很少使用
11.3.2 容器调度器
配置capacity-scheduler.xml
<!--配置root队列下两个子队列 hainiu占比80 default占比20-->
<configuration>
<property>
<name>yarn.scheduler.capacity.root.queues</name>
<value>hainiu,default</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.hainiu.capacity</name>
<value>80</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.default.capacity</name>
<value>20</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.hainiu.maximum-capacity</name>
<value>100</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.default.maximum-capacity</name>
<value>100</value>
</property>
</configuration>
配置队列中任务优先级
修改yarn-site.xml 开启优先级
<property>
<name>yarn.cluster.max-application-priority</name>
<value>5</value>
</property>
分发配置并重启
scp_all.sh /usr/local/hadoop/etc/hadoop/capacity-scheduler.xml /usr/local/hadoop/etc/hadoop/
scp_all.sh /usr/local/hadoop/etc/hadoop/yarn-site.xml /usr/local/hadoop/etc/hadoop/
#重启yarn
stop-yarn.sh
start-yarn.sh
提交任务,测试
# -Dmapreduce.job.queuename=default 指定执行队列
# -Dmapreduce.job.priority 制定优先级,数越大优先级越高,不能大于 yarn.cluster.max-application-priority
hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.4.jar wordcount -Dmapreduce.job.queuename=default /word/words.txt /wcresult1
hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.4.jar pi -Dmapreduce.job.queuename=hainiu -Dmapreduce.job.priority=5 5 2000000
11.3.3 公平调度器
公平调度器是由facebook发明的,原理和容量调度器差不多,但是单个队列中的任务是可以并行执行的
所以公司中使用公平调度器的方式最多
yarn-site.xml中增加如下配置
<!-- 屏蔽掉容器调度器的相关配置
<property>
<name>yarn.cluster.max-application-priority</name>
<value>5</value>
</property>
-->
<!-- 添加如下配置-->
<!-- scheduler begin -->
<property>
<name>yarn.resourcemanager.scheduler.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value>
<description>调度器实现类</description>
</property>
<property>
<name>yarn.scheduler.fair.allocation.file</name>
<value>fair-scheduler.xml</value>
<description>自定义XML配置文件所在位置,该文件主要用于描述各个队列的属性,比如资源量、权重等</description>
</property>
<property>
<name>yarn.scheduler.fair.preemption</name>
<value>true</value>
<description>是否支持抢占</description>
</property>
<property>
<name>yarn.scheduler.fair.sizebasedweight</name>
<value>false</value>
<description>在一个队列内部分配资源时,默认情况下,采用公平轮询的方法将资源分配各各个应用程序,而该参数则提供了外一种资源分配方式:按照应用程序资源需求数目分配资源,即需求资源数量越多,分配的资源越多。默认情况下,该参数值为false</description>
</property>
<property>
<name>yarn.scheduler.increment-allocation-mb</name>
<value>256</value>
<description>内存规整化单位,默认是1024,这意味着,如果一个Container请求资源是700mB,则将被调度器规整化为 (700mB / 256mb) * 256mb=768mb</description>
</property>
<property>
<name>yarn.scheduler.assignmultiple</name>
<value>true</value>
<description>是否启动批量分配功能。当一个节点出现大量资源时,可以一次分配完成,也可以多次分配完成。默认情况下,参数值为false</description>
</property>
<property>
<name>yarn.scheduler.fair.max.assign</name>
<value>10</value>
<description>如果开启批量分配功能,可指定一次分配的container数目。默认情况下,该参数值为-1,表示不限制</description>
</property>
<property>
<name>yarn.scheduler.fair.allow-undeclared-pools</name>
<value>false</value>
<description>如果提交的队列名不存在,Scheduler会自动创建一个该队列,默认开启</description>
</property>
<!-- scheduler end -->
增加fair-scheduler.xml,内容如下
<?xml version="1.0"?>
<allocations>
<queue name="hainiu">
<minResources>512 mb,1 vcores</minResources>
<maxResources>6140 mb,3 vcores</maxResources>
<maxRunningApps>50</maxRunningApps>
<weight>2.0</weight>
<schedulingPolicy>fair</schedulingPolicy>
<!--可向队列中提交应用程序的用户或用户组列表,默认情况下为“*”,表示任何用户均可以向该队列提交应用程序。-->
<aclSubmitApps>hainiu</aclSubmitApps>
<!--一个队列的管理员可管理该队列中的资源和应用程序,比如可杀死任意应用程序-->
<aclAdministerApps>hainiu</aclAdministerApps>
</queue>
<queue name="default">
<weight>1.0</weight>
<aclSubmitApps>*</aclSubmitApps>
<aclAdministerApps>*</aclAdministerApps>
</queue>
<!-- user节点只有一个子节点 -->
<user name="root">
<aclSubmitApps>*</aclSubmitApps>
<aclAdministerApps>*</aclAdministerApps>
<maxRunningApps>10</maxRunningApps>
</user>
<!-- 用户的maxRunningJobs属性的默认值 -->
<userMaxAppsDefault>50</userMaxAppsDefault>
<!-- 队列的schedulingMode属性的默认值 默认是fair-->
<defaultQueueSchedulingPolicy>fair</defaultQueueSchedulingPolicy>
<!-- 如果一个队列在该段时间内使用的资源量低于fair共享资源量,则开始抢占其他队列的资源。-->
<fairSharePreemptionTimeout>60</fairSharePreemptionTimeout>
<!-- 如果一个队列在该段时间内使用的资源量低于最小共享资源量,则开始抢占其他队列的资源。 -->
<defaultMinSharePreemptionTimeout>60</defaultMinSharePreemptionTimeout>
<queuePlacementPolicy>
<rule name="specified" create="false" />
<rule name="user" create="false" />
<rule name="reject" />
</queuePlacementPolicy>
</allocations>
分发配置并重启yarn
#关闭yarn
stop-yarn.sh
#分发文件
scp_all.sh /usr/local/hadoop/etc/hadoop/fair-scheduler.xml /usr/local/hadoop/etc/hadoop/
scp_all.sh /usr/local/hadoop/etc/hadoop/yarn-site.xml /usr/local/hadoop/etc/hadoop/
#重启yarn
start-yarn.sh
11.3.3 其他配置
配置任务资源提交hdfs的路径
<!--在yarn-site.xml中配置,执行的任务文件应该上传到/user的用户目录下 -->
<property>
<name>yarn.app.mapreduce.am.staging-dir</name>
<value>/user</value>
</property>
<property>
<name>yarn.app.mapreduce.am.scheduler.connection.wait.interval-ms</name>
<value>5000</value>
</property>
11.4 yarn开启历史服务器
在mapred-site.xml中配置如下信息
<!--yarn开启历史服务器start-->
<property>
<name>mapreduce.jobhistory.address</name>
<value>nn1:10020</value>
<description>MapReduce JobHistory Server地址</description>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>nn1:19888</value>
<description>MapReduce JobHistory Server Web UI地址</description>
</property>
<property>
<name>mapreduce.jobhistory.intermediate-done-dir</name>
<value>/data/hadoop/mapred/tmp</value>
<description>MapReduce作业产生的日志存放位置</description>
</property>
<property>
<name>mapreduce.jobhistory.done-dir</name>
<value>/data/hadoop/mapred/done</value>
<description>MR JobHistory Server管理的日志的存放位置</description>
</property>
<property>
<name>mapreduce.job.userlog.retain.hours</name>
<value>48</value>
</property>
<!--yarn开启历史服务器end-->
#分发配置文件到所有机器中
scp_all.sh /usr/local/hadoop/etc/hadoop/mapred-site.xml /usr/local/hadoop/etc/hadoop/
#重启yarn
stop-yarn.sh
start-yarn.sh
#启动历史服务器
mapred --daemon start historyserver
11.5 开启日志聚合功能
想要查看每个任务的运行日志,需要开启日志聚合功能
yarn-site.xml中配置如下参数进行日志聚合
<!--yarn开启日志聚合start-->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
<description>是否启用日志聚集功能</description>
</property>
<property>
<name>yarn.nodemanager.remote-app-log-dir</name>
<value>/tmp/app-logs</value>
<description>当应用程序运行结束后,日志被转移到的HDFS目录(启用日志聚集功能时有效)</description>
</property>
<!--目录相关 end -->
<!-- 其它 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>1209600</value>
<description>nodemanager上所有Container的运行日志在HDFS中的保存时间,保留半个月</description>
</property>
<!--yarn开启日志聚合end-->
#分发配置文件到所有机器中
scp_all.sh /usr/local/hadoop/etc/hadoop/yarn-site.xml /usr/local/hadoop/etc/hadoop/
#重启yarn
stop-yarn.sh
start-yarn.sh
#重启historyserver
mapred --daemon stop historyserver
mapred --daemon start historyserver
12. yarn常用命令
#集群列表查看
yarn node -list -all
#队列情况
yarn queue -status <queue>
#列出所有Application
yarn application -list
#参数过滤 -appStates [ALL、NEW、NEW_SAVING、SUBMITTED、ACCEPTED、RUNNING、FINISHED、FAILED、KILLED]
#杀死进程
yarn application -kill
#查看日志
yarn logs -applicationId
#查看container列表
yarn container -list <Applicationname AttemptId>
13.项目开发
项目打包
在项目的pon.xml中增加打包插件配置
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptors>
<descriptor>src/main/resources/assembly.xml</descriptor>
</descriptors>
<archive>
<manifest>
<mainClass>${mainClass}</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.12</version>
<configuration>
<skip>true</skip>
<forkMode>once</forkMode>
<excludes>
<exclude>**/**</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
在/src/main/resources目录中创建assembly.xml文件,内容如下
<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
<!-- TODO: a jarjar format would be better -->
<!-- 添加到生成文件名称的后缀符 -->
<id>hainiu</id>
<!-- 打包类型 -->
<formats>
<format>jar</format>
</formats>
<!-- 指定是否包含打包层目录 -->
<includeBaseDirectory>false</includeBaseDirectory>
<!-- 指定要包含的文件集 -->
<fileSets>
<fileSet>
<!-- 指定目录 -->
<directory>${project.build.directory}/classes</directory>
<!-- 指定文件集合的输出目录,该目录是相对于根目录 -->
<outputDirectory>/</outputDirectory>
<!-- 排除文件 -->
<excludes>
<exclude>*.xml</exclude>
<exclude>*.properties</exclude>
</excludes>
</fileSet>
</fileSets>
<!-- 用来定制工程依赖 jar 包的打包方式 -->
<dependencySets>
<dependencySet>
<!-- 指定包依赖目录,该目录是相对于根目录 -->
<outputDirectory>/</outputDirectory>
<!-- 当前项目构件是否包含在这个依赖集合里 -->
<useProjectArtifact>false</useProjectArtifact>
<!-- 是否将第三方jar包解压到该依赖中 false 直接引入jar包 true解压引入 -->
<unpack>true</unpack>
<!-- 将scope为runtime的依赖包打包到lib目录下。 -->
<scope>runtime</scope>
</dependencySet>
</dependencySets>
</assembly>