目录

安装调用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 
  
  <configuration>
      <property>
          <name>fs.defaultFS</name>
          <value>hdfs://localhost:9000</value>  #本机9000端口
      </property>
  </configuration>

vim hdfs-site.xml   
  <configuration>
      <property>
          <name>dfs.replication</name>
          <value>1</value> #用来控制副本数,当前就1个节点,所以是1
      </property>
  </configuration>

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.xml 
  <configuration>
      <property>
          <name>dfs.replication</name>
          <value>2</value> #用来控制副本数,现在有两个副本
      </property>
  </configuration>

 

vim core-site.xml 
  
  <configuration>
      <property>
          <name>fs.defaultFS</name>
          <value>hdfs://server1:9000</value>  #master指向server1
      </property>
  </configuration>
vim workers  #写如数据节点
  server2
  server3

 清除之前留下的文件

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.xml
  <configuration>
      <property>
          <name>mapreduce.framework.name</name>
          <value>yarn</value>
      </property>
      <property>
          <name>mapreduce.application.classpath</name>
          <value>$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/*:$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/lib/*</value>
      </property>
  </configuration>

vim yarn-site.xml 
  <configuration>
      <property>
          <name>yarn.nodemanager.aux-services</name>
          <value>mapreduce_shuffle</value>
      </property>
      <property>
          <name>yarn.nodemanager.env-whitelist</name>
                <value>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>
      </property>

  </configuration>

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:

停掉所有进程
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.xml
  <configuration>
      <property>
          <name>fs.defaultFS</name>
          <value>hdfs://masters</value>   #指定masters
      </property>

  <property>    #指定 zookeeper 集群主机地址
  <name>ha.zookeeper.quorum</name>
  <value>172.25.70.2:2181,172.25.70.3:2181,172.25.70.4:2181</value>
  </property>
  </configuration>

 

vim hdfs-site.xml
  <configuration>
      <property>
          <name>dfs.replication</name>
          <value>3</value>  #有三个节点
      </property>

  <property>  #指定 hdfs 的 nameservices 为 masters,和 core-site.xml 文件中的设置保持一致
  <name>dfs.nameservices</name>
  <value>masters</value>
  </property>

  <property>  #masters 下面有两个 namenode 节点,分别是 h1 和 h2 (名称可自定义)
  <name>dfs.ha.namenodes.masters</name>
  <value>h1,h2</value>
  </property>

  <property>   #指定 h1 节点的 rpc 通信地址
  <name>dfs.namenode.rpc-address.masters.h1</name>
  <value>172.25.70.1:9000</value>
  </property>

  <property>  #指定 h1 节点的 http 通信地址
  <name>dfs.namenode.http-address.masters.h1</name>
  <value>172.25.70.1:9870</value>
  </property>

  <property>   #指定 h2 节点的 rpc 通信地址
  <name>dfs.namenode.rpc-address.masters.h2</name>
  <value>172.25.70.5:9000</value>
  </property>

  <property>   #指定 h2 节点的 http 通信地址
  <name>dfs.namenode.http-address.masters.h2</name>
  <value>172.25.70.5:9870</value>
  </property>

  <property>   #指定 NameNode 元数据在 JournalNode 上的存放位置
  <name>dfs.namenode.shared.edits.dir</name>
  <value>qjournal://172.25.70.2:8485;172.25.70.3:8485;172.25.70.4:8485/masters</value>
  </property>

  <property>  #指定 JournalNode 在本地磁盘存放数据的位置
  <name>dfs.journalnode.edits.dir</name>
  <value>/tmp/journaldata</value>
  </property>

  <property>   #开启 NameNode 失败自动切换
  <name>dfs.ha.automatic-failover.enabled</name>
  <value>true</value>
  </property>

  <property>  #配置失败自动切换实现方式
  <name>dfs.client.failover.proxy.provider.masters</name>
  <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
  </property>

  <property>   #配置隔离机制方法,每个机制占用一行
  <name>dfs.ha.fencing.methods</name>
  <value>
  sshfence
  shell(/bin/true)
  </value>
  </property>

  <property>    #使用 sshfence 隔离机制时需要 ssh 免密码
  <name>dfs.ha.fencing.ssh.private-key-files</name>
  <value>/home/hadoop/.ssh/id_rsa</value>
  </property>

  <property>     #配置 sshfence 隔离机制超时时间
  <name>dfs.ha.fencing.ssh.connect-timeout</name>
  <value>30000</value>
  </property>

  </configuration>

 第一次启动 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
  <property>  #激活 RM 高可用
  <name>yarn.resourcemanager.ha.enabled</name>
  <value>true</value>
  </property>

  <property>   #指定 RM 的集群 id
  <name>yarn.resourcemanager.cluster-id</name>
  <value>RM_CLUSTER</value>
  </property>

  <property>   #定义 RM 的节点
  <name>yarn.resourcemanager.ha.rm-ids</name>
  <value>rm1,rm2</value>
  </property>

   <property>   #指定 RM1 的地址
  <name>yarn.resourcemanager.hostname.rm1</name>
  <value>172.25.70.1</value>
  </property>
 
  <property>   #指定 RM2 的地址
  <name>yarn.resourcemanager.hostname.rm2</name>
  <value>172.25.70.5</value>
  </property>

  <property>    #激活 RM 自动恢复
  <name>yarn.resourcemanager.recovery.enabled</name>
  <value>true</value>
  </property>
 
  <property>   #配置 RM 状态信息存储方式,有 MemStore 和 ZKStore
  <name>yarn.resourcemanager.store.class</name>
  <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
  </property>

  <property>     #配置为 zookeeper 存储时,指定 zookeeper 集群的地址
  <name>yarn.resourcemanager.zk-address</name>
  <value>172.25.70.2:2181,172.25.70.3:2181,172.25.70.4:2181</value>
  </property>

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:

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
  <property>    #指定 region server 的共享目录,用来持久化 HBase
  <name>hbase.rootdir</name>
  <value>hdfs://masters/hbase</value>
  </property>

  <property>   #启用 hbase 分布式模式
  <name>hbase.cluster.distributed</name>
  <value>true</value>
  </property>

  <property>   #Zookeeper 集群的地址列表
  <name>hbase.zookeeper.quorum</name>
  <value>172.25.70.2,172.25.70.3,172.25.70.4</value>
  </property>
  
  <property>  #指定 hbase 的 master
  <name>hbase.master</name>
  <value>h1</value>
  </property>

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' #刚才的数据还在

 

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐