您的位置:首页 > 大数据 > Hadoop

Hadoop-HDFS学习理解到安装操作,以及HA高可用部署。

2019-01-24 15:47 435 查看

Hadoop HDFS

概念

分布式存储系统提供高可靠性、高扩展性和高吞吐量的数据存储服务
分为三个节点

  1. NameNode:主节点,接受客户端读写服务,保存metadate信息,元数据,存储到fsimage文件上,fsimage在Format HDFS时创建,edits对metadate的操作日志,block位置信息不会保存到fsimage上。
    总结NN俩大功能:1.获取客户端的读写服务 2.存放元数据,元数据包含:fsimage和edit文件。
  2. DataNode:从节点,存储数据,储存方式为数据块block,默认1个block为64MB,默认1个block都有三个副本,存储在不同的节点上,DataNode心跳机制,3S发送一次,NN如果10分钟没有没收到DataNode心跳,认为已经lost,并copy其上的block到其他DataNode。
  3. SecondaryNameNode:辅助NameNode完成工作的节点,完成fsimage的更新,帮助NameNode合并edits文件。合并时机可配置,到达一定大小合并,和到达一定时间合并。
  • 流程:SNN抽取NN的edits和拷贝fsimage文件,此时新生成edits文件记录新的操作日志,SNN根据抽取的edits更新fsimage文件,返回给NN节点替换原有的fsimage,之后为循环这个操作。
  • HDFS写流程:HDFS client 通过 Distributed FileSystem api 请求 NameNode,传递参数文件大小,文件名,上传者,NameNode返回配置的block大小和空闲的DataNode,因为心跳机制所以知道空闲的DataNode,然后通过HDFS 通过输出字节流 FSData OutputStream写入DataNode。备份机制和写流程没有关系,DataNode会自动备份。
  • HDFS读流程:HDFS client 通过 Distributed FileSystem api请求NameNode,返回文件位置信息,元数据,block在哪个DataNode上,然后客户端再通过FSData InputStream字节流按顺序去读block,NameNode会告诉你副本空闲的block。
  • HDFS权限:HDFS只做用户名认证,登陆用户是谁,就只能看到自己所操作的文件,root用户是一定可以读文件。

1. 安装Hadoop基础环境

  1. 去官网下载Hadoop,查看下载文件下stable2/ 的版本号,此目录下版本为当前最稳定版本。
    例:http://mirror.bit.edu.cn/apache/hadoop/common/ 下可以查看

  2. 克隆vm虚拟机,设置网络
    安装Hadoop准备四台虚拟机,使用克隆的方法,克隆完后重启网络service network restart如果失败,错误Device eth0 does not seem to be present。
    解决办法:打开/etc/udev/rules.d/70-persistent-net.rules

# vi /etc/udev/rules.d/70-persistent-net.rules
  1. 记录下eth1网卡的mac地址
  2. 接下来,打开/etc/sysconfig/network-scripts/ifcfg-eth0
# vi /etc/sysconfig/network-scripts/ifcfg-eth0
  1. 将 HWADDR=“00:0c:29:8f:89:97” 改成上面的mac地址 HWADDR=“00:0c:29:50:bd:17”,最后,重启网络
# service network restart 重启失败可以重启客户端尝试。

2. SSH免密登陆

  1. 查看ssh服务的状态:sudo service sshd status 查看是否安装ssh,并启动ssh。
  2. 输入ssh localhost 如果需要数据密码,则需要给本机做免密登陆。
    生成密钥:ssh-keygen -t dsa -P ‘’ -f ~/.ssh/id_dsa
    生成目录:cd ~/.ssh/ 其中id_dsa 私钥,id_dsa.pub公钥。
    ssh本机免密登陆:
    将公钥文件追加到本地文件:
cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys\
  1. 然后ssh localhost 显示登陆成功
  2. ssh其他客户端:
    先在所有客户端etc下hosts下配置其他主机名称对应ip,以便于通过电脑名称访问,例:
    192.168.229.129 xhy1
    192.168.229.130 xhy2
    192.168.229.131 xhy3
    192.168.229.132 xhy4
  3. 其他客户端生成密钥: 省略 将公钥文件追加到本地文件:省略
  4. 客户端1将公钥拷贝给客户端2:
    scp ./id_dsa.pub root@xhy2:/opt/
    客户端2将客户端1公钥追加至日志文件:
    cat /opt/id_dsa.pub >> ~/.ssh/authorized_keys 注:同理将所有服务端设置
  • ssh其他客户端原理:
    客户端1免密登陆客户端2,客户端1发送ip和公钥至客户端2,客户端2认证文件比对请求后返回登陆密码至客户端1,客户端1通过密码登陆客户端2,客户端2相应登陆,登陆成功。所以在客户端2中需要存在客户端1公钥。

3. Hadoop安装

  1. 安装包拷贝至namenode节点服务器,解压。
  2. 修改配置文件:
cd …/hadoop-2.6.5/etc/hadoop
配置hadoop-env.sh :修改jdk环境变量地址
vi hadoop-env.sh
将java变量地址改为本机安装目录 export JAVA_HOME=/usr/java/jdk1.7.0_79
  1. 配置core-site.xml :Hadoop中NN节点所在的主机和数据传输端口和临时文件保存路径。
vi core-site.xml
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
  1. 修改配置中localhost为NN节点主机名。例:xhy1
  2. 还需要加入配置,由于临时文件默认配置为tmp目录下,此目录下重启文件会清空,所以需要修改配置,可参考官方文档。
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/hadoop-2.6</value>
</property>
  1. 配置hdfs-site.xml,配置SecindaryNameNode节点,修改fisimage文件保存路径:
vi hdfs-site.xml
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>xhy2:50090</value>
</property>

<property>
<name>dfs.namenode.secondary.https-address</name>
<value>xhy2:50091</value>
</property>
  1. 配置slaves,配置DataNode的主机名:
vi slaves
xhy2
xhy3xhy4
  1. 配置masters,此文件没有需要创建,配置SecindaryNameNode主机名:
vi masters
xhy3
  1. 配置Hadoop环境变量:
vi ~/.bash_profile
export HADOOP_HOME=/home/hadoop-2.6.5
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
配置结束
  1. 将配置好的Hadoop拷贝到其他服务器:
    scp -r hadoop-2.6.5/ root@xhy2:/home/
    scp -r hadoop-2.6.5/ root@xhy3:/home/
    scp -r hadoop-2.6.5/ root@xhy4:/home/

  2. 将配置好的hosts文件拷贝到其他服务器:
    scp /etc/hosts root@xhy2:/etc/
    scp /etc/hosts root@xhy3:/etc/
    scp /etc/hosts root@xhy4:/etc/

  3. 将配置好的环境变量拷贝到其他服务器:
    scp ~/.bash_profile root@xhy2:/root/
    scp ~/.bash_p 20000 rofile root@xhy3:/root/
    scp ~/.bash_profile root@xhy4:/root/
    对所有Hadoop服务器执行加载环境变量配置:
    source ~/.bash_profile

  4. 启动Hadoop

  • 格式化HDFS文件:
hdfs namenode –format

4. HDFS故障解决

  • 内存受限问题
    由于HDFS文件存放在内存中,会导致内存受限问题。
    解决办法HDFS HA:通过主备NameNode解决。
  1. NameNode HA
    俩个NameNode只允许有一个NameNode是活动的,活动的是Active,静止的是Standby。主要功能Standby接管Active。
    NameNode HA官网分为俩种:NameNode HA With QJM(通过JournalNode来共享edits文件)、NameNode HA With NFS(通过NFS远程共享目录)。
    接管原理:NN接管主要是fsimage、edit文件,fsimage文件是在NN格式化时候产生,具有独立的标记,所以保证Standby和Active的fsimage相同需要格式化一台NN,将产生的fsimage拷贝给另一台NN,在运行中DN所有信息汇报给多个fsimage。Edit是在客户端上传下载文件时候产生,当一台NN挂掉时候,另一台NN无法读取Edit文件,所以需要将edit文件放在内部集群中,是存在多副本的,内部集群JournalNode,(另一种方式:edit文件存放在共享文件,Linux共享文件为nfs网络文件)。在HA中主备(Active、Standby)NN元数据文件一致,初始化时候fsimage一致,运行时fsimage文件会隔一段时间同步更新,DN会向俩个NN汇报元数据,edit文件存在共享,所以NN元数据一致,可以实现瞬间接管。

  2. FalloverController
    FalloverController与NN是一一对应的,当NN状态为Active时候,对应的 FalloverController也为Active的。

5. HA实现过程

Zookeeper集群安装

  1. 解压tar -zxvf zookeeper-3.4.6.tar.gz,解压后移动到home下
  2. 修改zookeeper配置文件,再目录下的conf下新建vi zoo.cfg配置文件,配置文件在zookeeper官网下的Runing Replicated Zookeeper,配置如下:
tickTime=2000
dataDir=/opt/zookeeper
clientPort=2181
initLimit=5
syncLimit=2
server.1=xhy1:2888:3888
server.2=xhy2:2888:3888
server.3=xhy3:2888:3888
  1. 创建mkdir dataDir目录,mkdir /opt/zookeeper,在需要配置的三台集群创建,分别在每台集群服务器中在/opt/zookeeper/下编辑myid,内容为1、2、3。
  2. 拷贝zookeeper到其他俩台服务器scp -r zookeeper-3.4.6/ root@xhy2:/home/、scp -r zookeeper-3.4.6/ root@xhy3:/home/
  3. 配置环境变量方便启动vi ~/.bash_profile
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:/home/zookeeper-3.4.6/bin
拷贝bash_profile文件到其他服务器
  1. 三台服务器加载配置文件:source ~/.bash_profile
  2. 启动三台zookeeper,zkServer.sh start
  3. 查看三台服务器启动日志tail -100 /home/zookeeper-3.4.6/conf/zookeeper.out
  4. 查看zookeeper自带内存数据库输入zkCli.sh 可进入
  5. JPS看进程QuorumPeerMain,保持zookeeper运行。

非HA Hadoop升级HA Hadoop集群

  1. 删除所有服务器SecindaryNameNode主机配置:
rm -rf /home/hadoop-2.6.5/etc/hadoop/masters
  1. 删除所有服务器Hadoop数据文件:
rm -rf /opt/hadoop-2.6
配置hdfs-site.xml:
vi hadoop-2.6.5/etc/hadoop/hdfs-site.xml
删除之前单节点所有配置
  1. 配置nameservices ID
<property>
<name>dfs.nameservices</name>
<value>xhy</value>
</property>
  1. 配置俩个NameNodes ID
<property>
<name>dfs.ha.namenodes.xhy</name>
<value>nn1,nn2</value>
</property>
  1. 配置俩个NameNode ID的RPC地址进行监听
<property>
<name>dfs.namenode.rpc-address.xhy.nn1</name>
<value>xhy1:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.xhy.nn2</name>
<value>xhy4:8020</value>
</property>
  1. 配置俩个NameNode ID的HTTP服务进行监听
<property>
<name>dfs.namenode.http-address.xhy.nn1</name>
<value>xhy1:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.xhy.nn2</name>
<value>xhy4:50070</value>
</property>
  1. 配置共享edits文件的url,Journal ID
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://xhy2:8485;xhy3:8485;xhy4:8485/xhy</value>
</property>
  1. 配置客户端联系Active NameNode的
<property>
<name>dfs.client.failover.proxy.provider.xhy</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
  1. 配置故障时状态切换
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_dsa</value>
</property>
  1. 配置journal node的edits存储路径
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/journalnode</value>
</property>
  1. 配置启用自动切换
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
配置core-site.xml文件
  1. 修改原有配置
<property>
<name>fs.defaultFS</name>
<value>hdfs://xhy</value>
</property>
  1. 配置zookeeper集群主机
<property>
<name>ha.zookeeper.quorum</name>
<value>xhy1:2181,xhy2:2181,xhy3:2181</value>
</property>
  1. 将所有修改好的配置发送给其他服务器,发送为hadoop下所有的配置
    scp ./* root@xhy2:/home/hadoop-2.6.5/etc/hadoop/
    scp ./* root@xhy3:/home/hadoop-2.6.5/etc/hadoop/
    scp ./* root@xhy4:/home/hadoop-2.6.5/etc/hadoop/

  2. 启动配置的所有journalnode的服务器

hadoop-daemon.sh start journalnode

检查log:

tail -200 /home/hadoop-2.6.5/logs/hadoop-root-journalnode-xhy2.log
  1. 格式化一台NameNode节点
    Xhy4: hdfs namenode -format
  2. 拷贝data文件到另一台集群NameNode节点
    Xhy4: scp -r hadoop-2.6/ root@xhy1:/opt/
  3. 在一台NameNode初始化HA state in Zookeeper
    hdfs zkfc -formatZK
  4. 启动HDFS集群
    start-dfs.sh
    如果遇到datanode启动报错,可单独启动报错节点:hadoop-daemon.sh start datanode
  5. 启动完成后检查可视化管理界面
    http://192.168.229.129:50070 可以看到是Active
    http://192.168.229.132:50070 可以看到是Standby
  6. 测试集群挂掉一台自动切换
  7. 查询hadoop进程jps
    kill -9 杀掉NameNode 进程
    http://192.168.229.129:50070 杀掉进程无法访问
    http://192.168.229.132:50070 可以看到是Standby
    结论:切换失败

报错看zkfc.log 需要xhy4免密登陆xhy1

修改操作:

  1. 停止所有集群 xhy1:stop-dfs.sh
  2. xhy4将公钥给xhy1,scp id_dsa.pub root@xhy1:/opt/
  3. xhy1追加到认证文件:cat /opt/id_dsa.pub >> ~/.ssh/authorized_keys
  4. 重启所有集群xhy1:start-dfs.sh

测试kill掉一台namenode成功自动接管

6. HA常用命令

启动zookeeper:zkServer.sh start
启动JournalNode:hadoop-daemon.sh start journalnode
启动nameNode: hadoop-daemon.sh start namenode
启动dataNode: hadoop-daemon.sh start datanode
格式化namenode:hdfs namenode -format
元数据备份:hdfs namenode -bootstrapStandby注意:有三步骤 使用需要按照步骤
Namenode初始化zkfc:hdfs zkfc -formatZK
停止上面节点:stop-dfs.sh
全面启动:start-dfs.sh
手动管理:hdfs haadmin,如果没有zookeeper服务帮忙切换,可手动切换active,standby

7. HDFS Federation

http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/Federation.html

  • 原理:三个相互无关联的NameNode,Namenodes是独立的,不需要相互协调,Datanode用作所有Namenode的块的公共存储。每个Datanode都注册集群中的所有Namenode。Datanodes定期发送心跳和阻止报告。它们还处理来自Namenodes的命令。
  • 优点:
    命名空间可伸缩性 - 联合添加命名空间水平扩展。通过允许将更多Namenode添加到群集,使用大量小文件的大型部署或部署可从命名空间扩展中受益。
    性能 : 文件系统吞吐量不受单个Namenode的限制。向集群添加更多Namenode可扩展文件系统读/写吞吐量。
    隔离 : 单个Namenode在多用户环境中不提供隔离。例如,实验应用程序可能会使Namenode过载并减慢生产关键应用程序的速度。通过使用多个Namenode,可以将不同类别的应用程序和用户隔离到不同的名称空间。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐