Hadoop-HDFS学习理解到安装操作,以及HA高可用部署。
Hadoop HDFS
概念
分布式存储系统提供高可靠性、高扩展性和高吞吐量的数据存储服务
分为三个节点
- NameNode:主节点,接受客户端读写服务,保存metadate信息,元数据,存储到fsimage文件上,fsimage在Format HDFS时创建,edits对metadate的操作日志,block位置信息不会保存到fsimage上。
总结NN俩大功能:1.获取客户端的读写服务 2.存放元数据,元数据包含:fsimage和edit文件。 - DataNode:从节点,存储数据,储存方式为数据块block,默认1个block为64MB,默认1个block都有三个副本,存储在不同的节点上,DataNode心跳机制,3S发送一次,NN如果10分钟没有没收到DataNode心跳,认为已经lost,并copy其上的block到其他DataNode。
- 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基础环境
-
去官网下载Hadoop,查看下载文件下stable2/ 的版本号,此目录下版本为当前最稳定版本。
例:http://mirror.bit.edu.cn/apache/hadoop/common/ 下可以查看 -
克隆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
- 记录下eth1网卡的mac地址
- 接下来,打开/etc/sysconfig/network-scripts/ifcfg-eth0
# vi /etc/sysconfig/network-scripts/ifcfg-eth0
- 将 HWADDR=“00:0c:29:8f:89:97” 改成上面的mac地址 HWADDR=“00:0c:29:50:bd:17”,最后,重启网络
# service network restart 重启失败可以重启客户端尝试。
2. SSH免密登陆
- 查看ssh服务的状态:sudo service sshd status 查看是否安装ssh,并启动ssh。
- 输入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\
- 然后ssh localhost 显示登陆成功
- ssh其他客户端:
先在所有客户端etc下hosts下配置其他主机名称对应ip,以便于通过电脑名称访问,例:
192.168.229.129 xhy1
192.168.229.130 xhy2
192.168.229.131 xhy3
192.168.229.132 xhy4 - 其他客户端生成密钥: 省略 将公钥文件追加到本地文件:省略
- 客户端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安装
- 安装包拷贝至namenode节点服务器,解压。
- 修改配置文件:
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
- 配置core-site.xml :Hadoop中NN节点所在的主机和数据传输端口和临时文件保存路径。
vi core-site.xml
<property> <name>fs.defaultFS</name> <value>hdfs://localhost:9000</value> </property>
- 修改配置中localhost为NN节点主机名。例:xhy1
- 还需要加入配置,由于临时文件默认配置为tmp目录下,此目录下重启文件会清空,所以需要修改配置,可参考官方文档。
<property> <name>hadoop.tmp.dir</name> <value>/opt/hadoop-2.6</value> </property>
- 配置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>
- 配置slaves,配置DataNode的主机名:
vi slaves
xhy2 xhy3xhy4
- 配置masters,此文件没有需要创建,配置SecindaryNameNode主机名:
vi masters
xhy3
- 配置Hadoop环境变量:
vi ~/.bash_profile export HADOOP_HOME=/home/hadoop-2.6.5 export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
配置结束
-
将配置好的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/ -
将配置好的hosts文件拷贝到其他服务器:
scp /etc/hosts root@xhy2:/etc/
scp /etc/hosts root@xhy3:/etc/
scp /etc/hosts root@xhy4:/etc/ -
将配置好的环境变量拷贝到其他服务器:
scp ~/.bash_profile root@xhy2:/root/
scp ~/.bash_p 20000 rofile root@xhy3:/root/
scp ~/.bash_profile root@xhy4:/root/
对所有Hadoop服务器执行加载环境变量配置:
source ~/.bash_profile -
启动Hadoop
- 格式化HDFS文件:
hdfs namenode –format
- 格式化后会创建opt/hadoop-2.6文件,在opt/hadoop-2.6/dfs/current/下会看到fsimage文件
- 启动:start-dfs.sh
- 浏览器访问:http://192.168.229.129:50070/ 即可看到namenode节点http监控页面。
- 浏览器访问:http://192.168.229.130:50090/ 即可看到snd节点http监控。
4. HDFS故障解决
- 内存受限问题
由于HDFS文件存放在内存中,会导致内存受限问题。
解决办法HDFS HA:通过主备NameNode解决。
-
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元数据一致,可以实现瞬间接管。
-
FalloverController
FalloverController与NN是一一对应的,当NN状态为Active时候,对应的 FalloverController也为Active的。
5. HA实现过程
Zookeeper集群安装
- 解压tar -zxvf zookeeper-3.4.6.tar.gz,解压后移动到home下
- 修改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
- 创建mkdir dataDir目录,mkdir /opt/zookeeper,在需要配置的三台集群创建,分别在每台集群服务器中在/opt/zookeeper/下编辑myid,内容为1、2、3。
- 拷贝zookeeper到其他俩台服务器scp -r zookeeper-3.4.6/ root@xhy2:/home/、scp -r zookeeper-3.4.6/ root@xhy3:/home/
- 配置环境变量方便启动vi ~/.bash_profile
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:/home/zookeeper-3.4.6/bin
拷贝bash_profile文件到其他服务器
- 三台服务器加载配置文件:source ~/.bash_profile
- 启动三台zookeeper,zkServer.sh start
- 查看三台服务器启动日志tail -100 /home/zookeeper-3.4.6/conf/zookeeper.out
- 查看zookeeper自带内存数据库输入zkCli.sh 可进入
- JPS看进程QuorumPeerMain,保持zookeeper运行。
非HA Hadoop升级HA Hadoop集群
- 删除所有服务器SecindaryNameNode主机配置:
rm -rf /home/hadoop-2.6.5/etc/hadoop/masters
- 删除所有服务器Hadoop数据文件:
rm -rf /opt/hadoop-2.6
配置hdfs-site.xml:
vi hadoop-2.6.5/etc/hadoop/hdfs-site.xml
删除之前单节点所有配置
- 配置nameservices ID
<property> <name>dfs.nameservices</name> <value>xhy</value> </property>
- 配置俩个NameNodes ID
<property> <name>dfs.ha.namenodes.xhy</name> <value>nn1,nn2</value> </property>
- 配置俩个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>
- 配置俩个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>
- 配置共享edits文件的url,Journal ID
<property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://xhy2:8485;xhy3:8485;xhy4:8485/xhy</value> </property>
- 配置客户端联系Active NameNode的
<property> <name>dfs.client.failover.proxy.provider.xhy</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property>
- 配置故障时状态切换
<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>
- 配置journal node的edits存储路径
<property> <name>dfs.journalnode.edits.dir</name> <value>/opt/journalnode</value> </property>
- 配置启用自动切换
<property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property>
配置core-site.xml文件
- 修改原有配置
<property> <name>fs.defaultFS</name> <value>hdfs://xhy</value> </property>
- 配置zookeeper集群主机
<property> <name>ha.zookeeper.quorum</name> <value>xhy1:2181,xhy2:2181,xhy3:2181</value> </property>
-
将所有修改好的配置发送给其他服务器,发送为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/ -
启动配置的所有journalnode的服务器
hadoop-daemon.sh start journalnode
检查log:
tail -200 /home/hadoop-2.6.5/logs/hadoop-root-journalnode-xhy2.log
- 格式化一台NameNode节点
Xhy4: hdfs namenode -format - 拷贝data文件到另一台集群NameNode节点
Xhy4: scp -r hadoop-2.6/ root@xhy1:/opt/ - 在一台NameNode初始化HA state in Zookeeper
hdfs zkfc -formatZK - 启动HDFS集群
start-dfs.sh
如果遇到datanode启动报错,可单独启动报错节点:hadoop-daemon.sh start datanode - 启动完成后检查可视化管理界面
http://192.168.229.129:50070 可以看到是Active
http://192.168.229.132:50070 可以看到是Standby - 测试集群挂掉一台自动切换
- 查询hadoop进程jps
kill -9 杀掉NameNode 进程
http://192.168.229.129:50070 杀掉进程无法访问
http://192.168.229.132:50070 可以看到是Standby
结论:切换失败
报错看zkfc.log 需要xhy4免密登陆xhy1
修改操作:
- 停止所有集群 xhy1:stop-dfs.sh
- xhy4将公钥给xhy1,scp id_dsa.pub root@xhy1:/opt/
- xhy1追加到认证文件:cat /opt/id_dsa.pub >> ~/.ssh/authorized_keys
- 重启所有集群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,可以将不同类别的应用程序和用户隔离到不同的名称空间。
- Hadoop学习笔记2-HDFS的安装与部署以及HDFS Shell命令
- hadoop学习之HDFS(2.2):centOS7安装高可用(HA)完全分布式集群hadoop2.7.2
- Hadoop 学习笔记 (九) hadoop2.2.0 生产环境部署 HDFS HA部署方法
- Hadoop学习笔记-009-CentOS_6.5_64_HA高可用-Hadoop2.6+Zookeeper3.4.5安装Hive1.1.0
- Hadoop学习笔记之HA集群安装部署
- Hadoop学习笔记-011-CentOS_6.5_64_HA高可用-Zookeeper3.4.5安装Kafka+消息监控KafkaOffsetMonitor
- Spark Hadoop集群部署与Spark操作HDFS运行详解---Spark学习笔记10
- Hadoop 2.2.0 HDFS HA高可用安装与配置
- Hadoop2.x分布式安装以及HA部署
- Hadoop学习笔记-006-CentOS_6.5_64_HA高可用-安装Zookeeper3.4.5
- hadoop2.4.1伪分布式安装,hdfs命令行操作学习笔记
- 云计算学习笔记004---hadoop的简介,以及安装,用命令实现对hdfs系统进行文件的上传下载
- Spark Hadoop集群部署与Spark操作HDFS运行详解---Spark学习笔记10
- Hadoop学习笔记-010-CentOS_6.5_64_HA高可用-Hadoop2.6+Zookeeper3.4.5安装Hbase1.0.0
- 在hadoop2.8的HA+zookeeper的环境下安装分布式HBase 1.2.5 以及HMaster的高可用(HA)
- 安装、进程-云计算学习笔记---hadoop的简介,以及安装,用命令实现对hdfs系统进行文件的上传下载-by小雨
- Hadoop学习笔记二 安装部署
- 【3】搭建HA高可用hadoop-2.3(部署配置hadoop--cdh5.1.0)
- 个人hadoop学习总结:Hadoop集群+HBase集群+Zookeeper集群+chukwa监控(包括单机、伪分布、完全分布安装操作)
- hadoop学习3-MapReduce的集群安装与部署