目录
安装调用hadoop单机模式
搭建伪分布式
创建完全式分布系统,把namenode和datanode分开
部署zk集群
NameNode高可用
模拟故障切换
NM高可用
故障切换:
故障模拟:
hbase分布式部署
故障切换:
官方:hadoop.apache.org
实验环境:
5台实验环境干净的虚拟机
eg:cd /var/lib/libvirt/images ls rm -rf test1 #删掉之前实验用的虚拟机【一定要是虚拟机关闭的情况下】 qemu-img create -f qcow2 -b test.qcow2 test1 #创建虚拟机,修改ip和主机名 virsh start test1真机中:
scp jdk-8u181-linux-x64.tar.gz server1: scp hadoop-3.2.1.tar.gz server1:
安装调用hadoop单机模式
server1:
把本次实验需要的两个包传给hadoop用户的根目录
两个包要是root用户的花hadoop用户没有执行和写的权限
解决办法1:
在超级用户中给hadoop执行和写的权限
#没有权限是不能解压和写文件的
useradd hadoop chown hadoop.hadoop hadoop-3.2.1.tar.gz chown hadoop.hadoop jdk-8u181-linux-x64.tar.gz chmod 755 hadoop-3.2.1.tar.gz chmod 755 jdk-8u181-linux-x64.tar.gz ll 把给好权限的包给hadoop用户 mv jdk-8u181-linux-x64.tar.gz /home/hadoop/ mv hadoop-3.2.1.tar.gz /home/hadoop
su - hadoop tar zxf jdk-8u181-linux-x64.tar.gz tar zxf hadoop-3.2.1.tar.gz ll ln -s jdk1.8.0_181/ java #做软连接方便之后更新操作 ln -s hadoop-3.2.1 hadoop ll cd hadoop/etc/hadoop/ vim hadoop-env.sh #修改环境变量文件 54 export JAVA_HOME=/home/hadoop/java 58 export HADOOP_HOME=/home/hadoop/hadoop
cd .. cd .. bin/hadoop #调命令的路径,可以运行就没有问题,二进制程序就安装好了 mkdir input pwd ls cp etc/hadoop/*.xml input #所有的配置文件拷贝到刚才新建的input目录里 bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.1.jar #调用jar包 bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.1.jar grep input output 'dfs[a-z.]+' #过滤input里的文件,关键字是以dfs开头的,输出到output里, cd output/ #输出目录是不存在的,在输出的时候会自动创建 ls cat *
搭建伪分布式
cd ..
cd etc/hadoop/
vim core-site.xml
fs.defaultFS
hdfs://localhost:9000 #本机9000端口
vim hdfs-site.xmldfs.replication 1 #用来控制副本数,当前就1个节点,所以是1
ssh-keygen # 创建免密文件【分布式的方式需要所有节点都免密】 cd .ssh/ ls cp id_rsa.pub authorized_keys #给公钥改名 chmod 600 authorized_keys ll ssh localhost #检验已经免密 logout **在完全分布式的情况下是通过免密的形式来启动远端的进程
cd pwd cd hadoop bin/hdfs namenode -format #调用这个命令 namenode -format是用来做格式化的 ls /tmp/ #默认master命令存到/tmp/里 ls sbin/start-dfs.sh #调用脚本启动hadoop Starting namenodes on [localhost] #hdfs的名称节点 Starting datanodes #hdfs的数据节点 Starting secondary namenodes [server1] server1: Warning: Permanently added 'server1,172.25.70.1' (ECDSA) to the list of known hosts.
ls cd cd java/ ls cd bin/ ls pwd cd vim .bash_profile 10行:PATH=$PATH:$HOME/.local/bin:$HOME/bin:/home/hadoop/java/bin source .bash_profile #刷新 cd jps #jps指令专门用来查看java命令【可以看到启动了三个进程】 ps ax
网页中: 172.25.70.1:9870--overview--live nodes--可以看到有一个server1节点
utilities---可以浏览文件系统和日志
给文件系统加东西:
cd hadoop bin/hdfs dfs -mkdir /user bin/hdfs dfs -mkdir /user/hadoop id bin/hdfs dfs -ls 查询与当前用户匹配的/user/hadoop目录 bin/hdfs dfs -put input #上传input 默认上传/user/hadoop bin/hdfs dfs -ls ls rm -rf output/ #删除刚才运行命令输出的目录 ls bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.1.jar wordcount input output #wordcount是统计单词数【统计input目录里输出到output目录】 ls #运行完在当前目录没有output
在网页中:刷新可以看到
bin/hdfs dfs -cat output/* #查看分布式文件系统的数据 bin/hdfs dfs -get output #从分布式把文件系统下载到本地【在运行时确保分布式文件系统没有同名目录,因为创建会自动新建,要是有会报错】 ls cd output/ ls cat * cd .. ls rm -rf output/ #删除本地的output分布式文件系统依然存在 ls
创建完全式分布系统,把namenode和datanode分开
server2、3: 【要求创建用户的id和时间都与server1同步。全平台一致】
useradd hadoop id hadoop
server1:
sbin/stop-dfs.sh #停掉伪分布式 logout #退出hadoop 要求所有节点配置相同 yum install -y nfs-utils #要求server1、2、3都装 vim /etc/exports /home/hadoop *(rw,anonuid=1000,anongid=1000) #hadoop的id是1000 systemctl start nfs showmount -e
server2、3中:
showmount -e 172.25.70.1 mount 172.25.70.1:/home/hadoop/ /home/hadoop/ #把172.25.70.1:/home/hadoop/挂接到本机的/home/hadoop/ df #查看挂接是否成功 su - hadoop ls #可以看到数据同步
server1:
su - hadoop ssh server1 logout ssh server2 logout ssh server3 logout *访问都是免密的 ls cd hadoop/etc/hadoop/ vim hdfs-site.xmldfs.replication 2 #用来控制副本数,现在有两个副本
vim core-site.xmlvim workers #写如数据节点 server2 server3 fs.defaultFS hdfs://server1:9000 #master指向server1
清除之前留下的文件
rm -rf /tmp/hadoop* ls ls /tmp/ cd /tmp/ ls rm -rf * ls cd pwd ls cd hadoop ls jps ps ax #所有的进程都被停掉了 bin/hdfs namenode -format #格式化 sbin/start-dfs.sh #server1启动namenode【目前是完全分布式】 jps #master上有SecondaryNameNode和NameNode
server2、3
su - hadoop ls jps #worker上只有datanode
网页:刷新后可以看到有两个活动的
server1:
bin/hdfs dfs -mkdir /user bin/hdfs dfs -mkdir /user/hadoop ls bin/hdfs dfs -put input #上传 bin/hdfs dfs -ls #可以看到已经上传成功 bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.1.jar wordcount input output
网页上输出目录也没有问题
热添加扩容节点:
在启动一个新的虚拟机4
server4:
useradd hadoop yum install -y nfs-utils mount 172.25.70.1:/home/hadoop/ /home/hadoop/ #同步数据目录 df su - hadoop ls cd hadoop cd etc/hadoop/ vim workers 添加:server4 ls cd .. cd .. bin/hdfs --daemon start datanode #启动注意路径 jps
网页:可以看到当前有三个节点
server1:
cd hadoop/etc/hadoop/ vim mapred-site.xmlmapreduce.framework.name yarn mapreduce.application.classpath $HADOOP_MAPRED_HOME/share/hadoop/mapreduce/*:$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/lib/*
vim yarn-site.xmlyarn.nodemanager.aux-services mapreduce_shuffle yarn.nodemanager.env-whitelist JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_HOME,PATH,LANG,TZ,HADOOP_MAPRED_HOME value>
vim hadoop-env.sh 59 export HADOOP_MAPRED_HOME=/home/hadoop/hadoop cd cd hadoop ssh server4 sbin/start-yarn.sh jps #多了一个RM
server2
jps #多了NM【并行计算框架】
网页上:172.25.70.1:8088
部署zk集群
需要一个zookeeper包:
scp /home/westos/zookeeper-3.4.9.tar.gz hadoop@172.25.70.1:
需要一个zookeeper包:
scp /home/westos/zookeeper-3.4.9.tar.gz hadoop@172.25.70.1:
停掉所有进程
server1:
sbin/stop-yarn.sh sbin/stop-dfs.sh jsp
在server2、3、4中检查是否停掉
jsp ps ax
server1、2、3、4:
rm -rf /tmp/* #删掉/tmp/目录里的东西,因为tmp保存了之前的数据
server1:
cd ls tar zxf zookeeper-3.4.9.tar.gz cd zookeeper-3.4.9/
servre2:
cd cd zookeeper-3.4.9/ ls cd conf/ ls cp zoo_sample.cfg zoo.cfg vim zoo.cfg #最后添加: server.1=172.25.70.2:2888:3888 server.2=172.25.70.3:2888:3888 server.3=172.25.70.4:2888:3888 #server后跟的是标识号id 2888:是网络通讯端口 3888:是选举端口
server2:
mkdir /tmp/zookeeper/ cd /tmp/zookeeper/ ls echo 1 > myid cat myid
server3:
mkdir /tmp/zookeeper/ cd /tmp/zookeeper/ ls echo 2 > myid cat myid
server4:
mkdir /tmp/zookeeper/ cd /tmp/zookeeper/ ls echo 3 > myid cat myid
server2、3、4:
cd cd zookeeper-3.4.9/ ls bin/zkServer.sh start bin/zkServer.sh status #server3是leader。server2、4是follower
NameNode高可用
在开一台虚拟机(server5)。最好给2g内存,作为高可用的备用master
server5:
useradd hadoop yum install -y nfs-utils mount 172.25.70.1:/home/hadoop/ /home/hadoop/ df su - hadoop ls
server1:
cd hadoop/etc/hadoop/ vim core-site.xmlfs.defaultFS hdfs://masters #指定masters#指定 zookeeper 集群主机地址 ha.zookeeper.quorum 172.25.70.2:2181,172.25.70.3:2181,172.25.70.4:2181
vim hdfs-site.xmldfs.replication 3 #有三个节点#指定 hdfs 的 nameservices 为 masters,和 core-site.xml 文件中的设置保持一致 dfs.nameservices masters #masters 下面有两个 namenode 节点,分别是 h1 和 h2 (名称可自定义) dfs.ha.namenodes.masters h1,h2 #指定 h1 节点的 rpc 通信地址 dfs.namenode.rpc-address.masters.h1 172.25.70.1:9000 #指定 h1 节点的 http 通信地址 dfs.namenode.http-address.masters.h1 172.25.70.1:9870 #指定 h2 节点的 rpc 通信地址 dfs.namenode.rpc-address.masters.h2 172.25.70.5:9000 #指定 h2 节点的 http 通信地址 dfs.namenode.http-address.masters.h2 172.25.70.5:9870 #指定 NameNode 元数据在 JournalNode 上的存放位置 dfs.namenode.shared.edits.dir qjournal://172.25.70.2:8485;172.25.70.3:8485;172.25.70.4:8485/masters #指定 JournalNode 在本地磁盘存放数据的位置 dfs.journalnode.edits.dir /tmp/journaldata #开启 NameNode 失败自动切换 dfs.ha.automatic-failover.enabled true #配置失败自动切换实现方式 dfs.client.failover.proxy.provider.masters org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider #配置隔离机制方法,每个机制占用一行 dfs.ha.fencing.methods sshfence shell(/bin/true) #使用 sshfence 隔离机制时需要 ssh 免密码 dfs.ha.fencing.ssh.private-key-files /home/hadoop/.ssh/id_rsa #配置 sshfence 隔离机制超时时间 dfs.ha.fencing.ssh.connect-timeout 30000
第一次启动 hdfs 必须先启动 journalnode。在三个 DN 上依次启动 journalnode
server2、3、4:
bin/hdfs --daemon start journalnode jps #日志节点起来
server1
cd ../.. ls bin/hdfs namenode -format #格式化HDFS集群 scp -r /tmp/hadoop-hadoop 172.25.70.5:/tmp bin/hdfs zkfc -formatZK #格式化 zookeeper ls sbin/start-dfs.sh #启动 hdfs 集群 jps
查看各个节点的状态(server2、3、4、5)
网页:172.25.70.1:9870
server4:
bin/hdfs dfs -mkdir /user bin/hdfs dfs -mkdir /user/hadoop bin/hdfs dfs -put input #上传
server3:
cd cd zookeeper-3.4.9/ ls bin/zkCli.sh #调用命令行,看谁是master --ls / --get /hadoop-ha/masters --get /hadoop-ha/masters/ActiveBreadCrumb 可以看到1是master
网页上:172.25.70.1:9870 #1是active
172.25.70.5:9870 #5是standby
模拟故障切换
server1:
jps kill 19730 #杀掉master的进程 jps
server3:
--get /hadoop-ha/masters/ActiveBreadCrumb 可以看到5是master
网页上:172.25.70.5:9870 #5是active
server1:
bin/hdfs --daemon start namenode #启动hdfs
网页上:172.25.70.1:9870 #1是standby
NM高可用
cd hadoop/etc/hadoop/
vim yarn-site.xml
#激活 RM 高可用
yarn.resourcemanager.ha.enabled
true
#指定 RM 的集群 id
yarn.resourcemanager.cluster-id
RM_CLUSTER
#定义 RM 的节点
yarn.resourcemanager.ha.rm-ids
rm1,rm2
#指定 RM1 的地址
yarn.resourcemanager.hostname.rm1
172.25.70.1
#指定 RM2 的地址
yarn.resourcemanager.hostname.rm2
172.25.70.5
#激活 RM 自动恢复
yarn.resourcemanager.recovery.enabled
true
#配置 RM 状态信息存储方式,有 MemStore 和 ZKStore
yarn.resourcemanager.store.class
org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore
#配置为 zookeeper 存储时,指定 zookeeper 集群的地址
yarn.resourcemanager.zk-address
172.25.70.2:2181,172.25.70.3:2181,172.25.70.4:2181
sbin/start-yarn.sh #启动 yarn 服务 jps #server1、5启动的服务是RM。2、3、4启动的是NM
故障切换:
server3:
--get /yarn-leader-election/RM_CLUSTER/ActiveBreadCrumb ##查看当前的active【RM1】
网页:http://172.25.70.1:8088/ 可以看到1是master的状态
172.25.70.5:8088 可以看到5是standby的状态
故障模拟:
server1:
jps kill 22527
server3:
--get /yarn-leader-election/RM_CLUSTER/ActiveBreadCrumb ##查看当前的active【RM2】
server1:
hbase分布式部署
真机中:scp hbase-1.2.4-bin.tar.gz hadoop@172.25.70.1:
真机中:scp hbase-1.2.4-bin.tar.gz hadoop@172.25.70.1:
server1:
cd ls tar zxf hbase-1.2.4-bin.tar.gz cd hbase-1.2.4/ cd conf/ vim hbase-env.sh #定义环境变量 27 export JAVA_HOME=/home/hadoop/java 28 export HADOOP_HOME=/home/hadoop/hadoop 128 export Hbase_MANAGES_ZK=false
vim hbase-site.xml#指定 region server 的共享目录,用来持久化 Hbase hbase.rootdir hdfs://masters/hbase #启用 hbase 分布式模式 hbase.cluster.distributed true #Zookeeper 集群的地址列表 hbase.zookeeper.quorum 172.25.70.2,172.25.70.3,172.25.70.4 #指定 hbase 的 master hbase.master h1
vim regionservers server2 server3 server4
启动 hbase主节点运行:
bin/start-hbase.sh jps
server2:
jps
备节点运行:
server5:
cd cd hbase-1.2.4/ bin/hbase-daemon.sh start master jps
server3:
--get /hbase/master #server1
网页:172.25.70.1:16010 #主server是1
测试:
server1:
bin/hbase shell #打开一个shell中端 --create 'test', 'cf' #创建 --list 'test' --put 'test', 'row1', 'cf:a', 'value1' --put 'test', 'row2', 'cf:b', 'value2' --put 'test', 'row3', 'cf:c', 'value3' --scan 'test'
网页:http://172.25.70.5:9870/ #上边有数据
故障切换:
server1:
jps kill 23569 #杀掉master进程
网页:http://172.25.70.5:16010/ #5是master。backup master没有了
server1:
bin/hbase-daemon.sh start master #启动
网页:刷新:172.25.70.5:16010 backup master是1
server1:
bin/hbase shell --scan 'test' #刚才的数据还在



