赞
踩
hadoop节点规划
服务器集群规划,6台服务器:
一个主节点
两个从节点
三个工作节点
集群服务器用的都是centos7.9.2009的镜像
wget http://mirrors.aliyun.com/repo/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 clear all
- yum makecache
- yum update -y
安装sz rz工具,用于服务器和windows之间上传、下载文件
yum install -y lrzsz
安装完直接执行rz命令就能进行上传任务的工作
安装常用软件
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
Hadoop是用java写的,并且使用Hadoop作分布式计算的时候有的进程要启动到jvm中,需要jdk的支持,所以Hadoop集群中所有服务器都要安装jdk并进行相关配置
下载 jdk-8u144-linux-x64.rpm 到/public/software/java/
rpm -ivh /public/software/java/jdk-8u144-linux-x64.rpm
进入/etc/profile文件中
export JAVA_HOME=/usr/java/jdk1.8.0_144
export PATH=$JAVA_HOME/bin:$PATH
让配置文件生效并检查
source /etc/profile
echo $PATH
或者使用批量命令
- echo 'export JAVA_HOME=/usr/java/jdk1.8.0_144' >> /etc/profile
- echo 'export PATH=$JAVA_HOME/bin:$PATH' >> /etc/profile
# 六台服务器分别进入/etc/hostname文件中,分别修改主机名为nn1、nn2、nn3、s1、s2、s3
# 查看当前主机名
hostname
# 配置hosts文件,添加主机名和ip地址映射
vim /etc/hosts
# 修改完第一台机器的ip映射后,然后分发到各个不同的机器上 xxx代表目标服务器的主机名
scp /etc/hosts root@xxx:/etc/
hosts文件配置前
127.0.0.1 localhost
11.26.164.142 linux-81580
11.94.204.169 linux-27782
11.26.164.150 op-68863
11.26.164.148 linux-89059
11.26.164.183 linux-29220
11.94.204.182 linux-47527
11.94.204.168 linux-84035
hosts文件配置后
127.0.0.1 localhost
11.26.164.150 op-68863
11.94.204.168 nn1
11.26.164.142 nn2
11.26.164.183 nn3
11.26.164.148 s1
11.94.204.182 s2
11.94.204.169 s3
# 添加hadoop用户
useradd hadoop
# 检查hadoop用户是否被添加
id hadoop
# 设置hadoop用户的密码
echo "12345678"| passwd hadoop --stdin
或 passwd hadoop
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'
# 先备份一个
cp /etc/login.defs /etc/login.defs_back
# 把“SU_WHEEL_ONLY yes”字符串追加到/etc/login.defs文件底部
echo "SU_WHEEL_ONLY yes" >> /etc/login.defs
tail命令查看/etc/login.defs文件最后10行
tail /etc/login.defs
# 添加hadoop用户到wheel组
gpasswd -a hadoop wheel
# 查看wheel组是否有hadoop用户
cat /etc/group | grep wheel
# nn1生成公私钥
ssh-keygen
# 在nn1分别给其它服务器注册公钥
ssh-copy-id nn2
ssh-copy-id nn3
ssh-copy-id s1
ssh-copy-id s2
ssh-copy-id s3
此时nn1可以免密连接到其它服务器,但是其它服务器不能免密连接到nn1,包括其它服务器之间也不能免密连接
如果想要实现各个服务器之间都能免密连接,那么就要把nn1的私钥都给其它服务器copy一份,并且nn1自己还要再注册一份公钥
# nn1自己注册一份公钥
ssh-copy-id nn1
# nn1的私钥给其它服务器分别copy一份
scp ~/.ssh/id_rsa hadoop@nn2:/home/hadoop/.ssh/
scp ~/.ssh/id_rsa hadoop@nn3:/home/hadoop/.ssh/
scp ~/.ssh/id_rsa hadoop@s1:/home/hadoop/.ssh/
scp ~/.ssh/id_rsa hadoop@s2:/home/hadoop/.ssh/
scp ~/.ssh/id_rsa hadoop@s3:/home/hadoop/.ssh/
获取脚本位置并输出
#! /bin/bash
# 获取脚本当前位置
cd `dirname $0`
# 输出脚本位置
echo `pwd`
scp命令
scp 文件名 登陆用户名@目标机器ip或者主机名:目标目录
ssh命令
ssh 登陆用户名@目标ip或主机名
eval命令
可以把字符串的内容作为一个命令执行
name=hadoop
cmd="echo hi $name"
echo $cmd # echo hi hadoop
eval $cmd # hi hadoop
1)ips:用于存放要操作的主机列表,用回车或空格隔开
2)scp_all.sh:在hadoop用户下copy当前机器的文件到其它操作机(多机分发脚本)
3)ssh_all.sh:在hadoop用户下登陆其它操作机执行相应操作(多机操作脚本)
4)ssh_root.sh:与ssh_all.sh功能相同,不过该脚本是以root用户的身份执行相应操作(带root的多机操作脚本)
首先在/home/hadoop目录下创建一个bin目录,然后进入bin目录创建ips文件并添加如下内容
nn1
nn2
nn3
s1
s2
s3
在/home/hadoop/bin目录下创建ssh_all.sh文件
- #!/bin/bash
- # 进入当前脚本所在的目录
- cd "$(dirname "$0")"
- # 获取当前脚本所在的目录
- dir_path="$(pwd)"
- # 读取ips文件获得要批量操作的主机名
- ip_arr=($(cat "$dir_path/ips"))
- # 遍历数组依次操作每一台主机
- for ip in "${ip_arr[@]}"
- do
- # 拼接ssh命令
- cmd="ssh hadoop@$ip \"$@\""
- echo "$cmd"
- # 通过eval命令,执行拼接的ssh命令
- if ssh hadoop@$ip "$@"; then
- echo "OK"
- else
- echo "FAIL"
- fi
- done
在/home/hadoop/bin目录下创建scp_all.sh文件
- #!/bin/bash
- # 进入当前脚本所在的目录
- cd "$(dirname "$0")"
- # 获取当前脚本所在的目录
- dir_path="$(pwd)"
- # 读取ips文件获得要批量操作的主机名
- ip_arr=($(cat "$dir_path/ips"))
- # 源
- source=$1
- # 目标
- target=$2
- # 遍历数组依次操作每一台主机
- for ip in "${ip_arr[@]}"
- do
- # 拼接ssh命令
- cmd="scp -r ${source} hadoop@${ip}:${target}"
- echo "$cmd"
- # 通过eval命令,执行拼接的ssh命令
- if eval ${cmd} ; then
- echo "OK"
- else
- echo "FAIL"
- fi
- done
在/home/hadoop/bin目录下创建ssh_root.sh文件,批量执行ssh_all.sh脚本没有权限执行的命令
5.1 exe.sh
执行su命令,与ssh_root.sh配合使用
- # 切换到root用户执行cmd命令
- cmd=$*
- su - << EOF
- $cmd
- EOF
exe.sh脚本需要在每台服务器的/home/hadoop/bin目录下都copy一份
5.2 ssh_root.sh
- #!/bin/bash
- # 进入当前脚本所在的目录
- cd "$(dirname "$0")"
- # 获取当前脚本所在的目录
- dir_path="$(pwd)"
- # 读取ips文件获得要批量操作的主机名
- ip_arr=($(cat "$dir_path/ips"))
- # 遍历数组依次操作每一台主机
- for ip in "${ip_arr[@]}"
- do
- # 拼接ssh命令
- cmd="ssh hadoop@$ip ~/bin/exe.sh \"$@\""
- echo "$cmd"
- # 通过eval命令,执行拼接的ssh命令
- if ssh hadoop@$ip ~/bin/exe.sh "$@"; then
- echo "OK"
- else
- echo "FAIL"
- fi
- done
注意:在写sh脚本的时候,层级之间不能使用空格,必须要使用Tab键,不然报错!
zookeeper是用来管理hadoop集群的
提供了统一配置、统一命名、分布式锁的功能
nn1 nn2 nn3
一个leader,两个follower
cp ips ips_zookeeper
cp scp_all.sh scp_all_zookeeper.sh
cp ssh_all.sh ssh_all_zookeeper.sh
cp ssh_root.sh ssh_root_zookeeper.sh
然后修改ips_zookeeper删除s1 s2 s3
修改scp_all_zookeeper.sh、ssh_all_zookeeper.sh、ssh_root_zookeeper.sh中的ips改为ips_zookeeper
# 安装zookeeper安装包
/public/software/bigdata/zookeeper-3.4.8.tar.gz
# 在zookeeper集群所有机器上把zookeeper的tar包解压到/usr/local目录下
ssh_root_zookeeper.sh tar -zxf /public/software/bigdata/zookeeper-3.4.8.tar.gz -C /usr/local/
# 查看解压的zookeeper
ssh_all_zookeeper.sh ls /usr/local/|grep zookeeper
# 创建软连接
ssh_root_zookeeper.sh ln -s /usr/local/zookeeper-3.4.8/ /usr/local/zookeeper
# 在/usr/local/zookeeper/conf目录下copy zoo_sample.cfg并重命名为zoo.cfg
cp zoo_sample.cfg zoo.cfg
# 修改zoo.cfg
dataDir=/tmp/zookeeper 修改为 dataDir=/data/zookeeper
添加配置
server.1=nn1:2888:3888
server.2=nn2:2888:3888
server.3=nn3:2888:3888# 在/usr/local/zookeeper/bin目录下配置zkEnv.sh,添加一个配置
ZOO_LOG_DIR=/data/zookeeper
# 把配置好的zoo.cfg、zkEnv.sh分发给zookeeper集群的其它机器
scp_all_zookeeper.sh /usr/local/zookeeper/bin/zkEnv.sh /usr/local/zookeeper/bin/
scp_all_zookeeper.sh /usr/local/zookeeper/conf/zoo.cfg /usr/local/zookeeper/conf/
# 创建/data/zookeeper目录
ssh_root_zookeeper.sh mkdir /data/zookeeper
# 递归修改/data目录,方便后续操作
ssh_root_zookeeper.sh chown -R hadoop:hadoop /data/
# 在zookeeper集群的nn1、nn2、nn3机器上分别在/data/zookeeper目录下创建myid文件,然后分别添加1、2、3(添加的id要和zoo.cfg里面的server.*一致)
echo "1" > myid
echo "2" > myid
echo "3" > myid
# 切换到root用户修改环境变量
su -
vim /etc/profile 添加环境变量
export ZOOKEEPER_HOME=/usr/local/zookeeper
export PATH=$PATH:$ZOOKEEPER_HOME/bin# 切换回hadoop用户分发修改的配置文件
scp_all_zookeeper.sh /etc/profile /tmp
ssh_root_zookeeper.sh mv /tmp/profile /etc/
# 检查配置文件
ssh_root_zookeeper.sh cat /etc/profile| grep ZOO
# 让配置生效
ssh_root_zookeeper.sh source /etc/profile
如果批量执行没有用的话就每个机器单独执行source /etc/profile
# 启动zookeeper集群
ssh_all_zookeeper.sh /usr/local/zookeeper/bin/zkServer.sh start
# 查看jps进程看zookeeper是否启动
ssh_all_zookeeper.sh jps
# 查看zookeeper集群的各个节点状态
ssh_all_zookeeper.sh /usr/local/zookeeper/bin/zkServer.sh status
zookeeper服务命令
# 启动zk服务
ssh_all_zookeeper.sh /usr/local/zookeeper/bin/zkServer.sh start
# 查看每个机器zk运行状态
ssh_all_zookeeper.sh /usr/local/zookeeper/bin/zkServer.sh status
# 停止zk服务
ssh_all_zookeeper.sh /usr/local/zookeeper/bin/zkServer.sh stop
# 重启zk服务
ssh_all_zookeeper.sh /usr/local/zookeeper/bin/zkServer.sh restart
启动zookeeper客户端
zkCli.sh
由于zookeeper是集群,所以通过zkCli.sh无论连接哪个机器都可以,连接上后操作的都是整个zookeeper集群
持久节点:客户端断开后节点不会消失
create /demo1 ""
临时节点:客户端断开后节点会消失
create -e /demo1 ""
持久顺序节点:创建带有事务编号的节点,客户端断开后不会消失
create -s /demo1 ""
临时顺序节点:创建带有事务编号的节点,客户端断开后会消失
create -e -s /demo1 ""
每一个节点路径都是唯一的,所以基于这一特点,可以做集群统一命名服务
zookeeper的树状结构是维系在内存中的,即每一个节点的数据也会存储在内存中,这样做的目得是为了方便快速查找;同时zookeeper的树状结构也会以快照的形式维系在磁盘中,这样做的目得是保证数据安全,在磁盘的存储位置是由dataDir和dataLogDir属性决定的
create /video "" | 创建一个/video的持久节点,数据为空 |
get /video | 查看/video的节点信息 |
set /video "hello" | 修改节点数据为”hello“ |
create -e /demo1 "" | 创建一个临时节点/demo1 |
create -s /demo2 "" | 创建一个顺序节点/demo2 |
ls / | 查看根目录下的节点 |
rmr /test | 递归删除节点,即删除根目录下test节点及test下的子节点 |
ls /demo3 watch | 监听/demo3下子节点变化 |
get /demo4 watch | 监听/demo4数据变化 |
自己拥有的最大事务id--Zxid
自己的选举id--myid
先比较最大事务id,谁大谁赢
如果最大事务id一致,则比较myid,谁大谁赢
经过多轮比较之后,一个节点如果胜过了一半以上的节点,则这个节点就会成为leader ---过半选举
zookeeper通过原子广播流程保证了zookeeper集群数据的一致性
当zookeeper集群收到请求后会把请求交给leader处理,leader会把请求记录到本地的log文件中,如果记录成功,leader会把这个操作记录发送给每一个follower,放到每个follower的队列中,follower会把请求从队列中拿出,试图记录到follower的本地log中,如果成功就会给leader返回ok信号,失败就会返回no信号,如果leader收到一半以上的follower返回的是ok信号,就会认为这个操作可以执行,leader会通知所有的节点执行此操作,否则没有收到一半以上的ok信号,则认为此操作不可执行,leader就会通知所有的节点从log中删除刚才的记录
其实zookeeper集群对于请求的处理就是如果请求在follower中,则会把请求转发给leader处理,如果请求直接在leader,则leader直接处理,然后由leader转发请求发送给每个follower来执行,以此保证zookeeper集群的数据一致性
observer就是一个不参与投票也不参与选举的follower,只监听投票的结果,但是可以正常工作,所以observer可以提高选举的效率,并且observer的作用不仅限于leader的选举过程,在原子广播流程中observer也不参与,只负责最后执行命令来保证observer的数据与leader的数据一致
1.数据一致性:服务端启动后,客户端无论通过哪个节点连接zookeeper集群,展示出来的都是同一个视图,即查询的数据都是一样的
2.原子性:对于事务决议的更新,只能是成功或者失败两种可能,没有中间状态。要么集群所有机器都成功应用某一事务,要么都没有应用,一定不会出现集群中一部分机器应用了事务,另一部分机器没有应用的情况
3.可靠性
4.实时性
5.顺序性
6.过半性:过半选举、过半存活、过半操作
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。