做的好看的外国网站,专门提供做ppt小素材的网站,wordpress怎么绑定域名,广东省东莞市作者 | 慢慢变成大佬责编 | Carol出品 | CSDN云计算#xff08;ID#xff1a;CSDNcloud#xff09;在文章开始之前#xff0c;作者想要告诉大家#xff1a;读懂本篇文章#xff0c;能让小白快速入门#xff0c;并且能够搭建完全分布式的集群#xff0c;以及能对Hadoop … 作者 | 慢慢变成大佬责编 | Carol出品 | CSDN云计算IDCSDNcloud在文章开始之前作者想要告诉大家读懂本篇文章能让小白快速入门并且能够搭建完全分布式的集群以及能对Hadoop HDFS产生详细的认知对以后的学习有很大的帮助。我们先来了解Hadoop的HDFS基本概念熟知基本概念在搭环境时能够能加得心应手。Hadoop基本介绍Hadoop是一个框架Hadoop的本质其实就是一系列功能模块儿组成的框架每个模块分别负责Hadoop的一些功能如HDFS负责大数据的存储功能Yarn负责整个集群的资源调度Common则负责Hadoop远程过程调用的实现以及提供序列化机制。Hadoop具有高容错性以及高拓展性。Hadoop适合处理大数据数据。1、HDFS的架构这里对HDFS的组成架构做说明1NameNode : 是HDFS的主从架构中的Master负责维护整个文件系统的目录树管理数据块Block的元数据信息处理客户端的读写请求并且管理Block的副本放置策略。2DataNode: 是HDFS的主从架构中的Slave存放在HDFS中的文件都被分成块来存储DataNode负责存储文件的块对于DataNode所在的节点来说块就是一个普通的文件可以在DataNode存放块的目录下查看如果不改动默认是$(dfs.data.dir)/current块的文件名为blk_blkID。DataNode会通过心跳机制和NameNode通信。在集群初始化时每个DataNode启动后都将当前存储的块的元数据信息告诉NameNode在集群正常工作时DataNode会不断的向NameNode通信向它提供自己本地的信息同时会接受来自NameNode的读写命令来操作本地的数据块。这个时候我们会有疑问NameNode的元数据到底存放在哪里 首先不可能是磁盘因为如果存放在 磁盘那么经常操作HDFS效率会非常低那么就只能会存放内存里可是效率虽然快了但是如果 内存满了或者集群停止服务那么数据的元数据就会丢失对于这个问题HDFS做了一个专门用来解决 这个问题的角色SecondaryNameNode3SecondaryNamenode 是用于定期合并命名空间镜像和命名空间镜像的编辑日志的辅助守护进程每个HDFS集群都有一个SecondaryNameNode在生产环境下一般SecondaryNameNode也会单独运行在一台服务器上。FSImage文件命名空间镜像 可以理解为NameNode当时的内存状态或者内存中元数据序列化后形成的文件所有信息保存做成的镜像文件是可以被加载的。也可以理解为是文件系统元数据的一个永久的性检查点但并不是每一个写操作都会更新这个文件因为FSImage肯定是一个大型的文件如果频繁地执行对这个文件进行写操作会使系统运行极为缓慢。解决方案是NameNode只将改动内容预写日志WAL即写入命名空间镜像的编辑日志edit log 记录客户端更新元数据信息的每一步操作可通过Edits运算出元数据。随着时间的推移编辑日志会变得越来越大那么如果发生故障将会花费非常多的时间来进行回滚操作所以就像传统的关系型数据库一样需要定期地合并FSImage和编辑日志。如果由NameNode来做合并的操作那么NameNode在为集群提供服务时可能无法提供足够的资源那么为了彻底解决这一问题就加入了SecondaryNameNode这个角色。工作详解NameNode启动时先滚动Edits并生成一个空的edits.inprogress然后加载Edits和Fsimage到内存中此时NameNode内存就持有最新的元数据信息。Client开始对NameNode发送元数据的增删改的请求这些请求的操作首先会被记录到edits.inprogress中查询元数据的操作不会被记录在Edits中因为查询操作不会更改元数据信息如果此时NameNode挂掉重启后会从Edits中读取元数据的信息。然后NameNode会在内存中执行元数据的增删改的操作。由于Edits中记录的操作会越来越多Edits文件会越来越大导致NameNode在启动加载Edits时会很慢所以需要对Edits和Fsimage进行合并所谓合并就是将Edits和Fsimage加载到内存中照着Edits中的操作一步步执行最终形成新的Fsimage。SecondaryNameNode的作用就是帮助NameNode进行Edits和Fsimage的合并工作。4块 每个磁盘都有默认的数据块大小这是磁盘进行数据读/写的最小单位文件系统也有文件块的概念HDFS同样也有块block的概念但是HDFS的块比一般文件系统的块大得多默认为128MB并且可以随着实际需要而变化配置项为HDFS-site.xml文件中的dfs.block.size项。与单一文件系统相似HDFS上的文件也被划分为块大小的多个分块它是HDFS存储处理的最小单元。HDFS中的块如此之大的原因是为了最小化寻址开销。如果块设置的足够大从磁盘传输数据的时间可以明显大于定位这个块开始位置所需的时间。这样传输一个由多个块组成的文件的时间取决于磁盘传输的效率。得益于磁盘传输速率的提升块的大小可以被设为300 MB甚至更大。2、HDFS的容错机制1心跳机制在NameNode和DataNode之间维持心跳检测当由于网络故障之类的原因导致DataNode发出的心跳包没有被NameNode正常收到的时候NameNode就不会将任何新的I/O操作派发给那个DataNode该DataNode上的数据被认为是无效的因此NameNode会检测是否有文件块的副本数目小于设置值如果小于就自动开始复制新的副本并分发到其他DataNode节点。2检测文件块的完整性HDFS会记录每个新创建文件的所有块的校验和。当以后检索这些文件时或者从某个节点获取块时会首先确认校验和是否一致如果不一致会从其他DataNode节点上获取该块的副本。3集群的负载均衡由于节点的失效或者增加可能导致数据分布不均匀当某个DataNode节点的空闲空间大于一个临界值的时候HDFS会自动从其他DataNode迁移数据过来。4NameNode上的FSImage和编辑日志edits log文件NameNode上的FSImage和编辑日志文件是HDFS的核心数据结构如果这些文件损坏了HDFS将失效。因而NameNode由Secondary NameNode定期备份FSImage和编辑日志文件NameNode在Hadoop中确实存在单点故障的可能当NameNode出现机器故障手工干预是必须的。5文件的删除删除操作并不是马上从NameNode移出命名空间而是存放在/trash目录随时可恢复直到超过设置时间才被正式移除。设置的时间由hdfs-site.xml文件的配置项fs.trash.interval决定单位为秒。6多副本机制HDFS会将文件切片成块并存储至各个DataNode中文件数据块在HDFS的布局情况由NameNode和hdfs-site.xml中的配置dfs.replication共同决定。dfs.replication表示该文件在HDFS中的副本数默认为3即有两份冗余。3、副本的选择策略Hadoop的默认布局是在HDFS客户端节点上放第一个副本但是由于HDFS客户端有可能运行于集群之外就随机选择一个节点不过Hadoop会尽量避免选择那些存储太满或者太忙的节点。第二个副本放在与第一个不同且随机另外选择的机架中的节点上。第三个副本与第二个副本放在相同的机架且随机选择另外一个节点。其他副本如果dfs.replication大于3放在集群随机选择的节点上Hadoop也会尽量避免在相同的机架上放太多副本。4、HDFS写文件流程1客户端通过Distributed FileSystem模块向NameNode请求上传文件NameNode检查目标文件是否已存在父目录是否存在。2NameNode返回是否可以上传。3客户端请求第一个 Block上传到哪几个DataNode服务器上。4NameNode返回3个DataNode节点分别为dn1、dn2、dn3。如果有多个节点返回实际的副本数量并根据距离及负载情况计算5客户端通过FSDataOutputStream模块请求dn1上传数据dn1收到请求会继续调用dn2然后dn2调用dn3将这个通信管道建立完成。6dn1、dn2、dn3逐级应答客户端。7客户端开始往dn1上传第一个Block先从磁盘读取数据放到一个本地内存缓存以Packet为单位dn1收到一个Packet就会传给dn2dn2传给dn3dn1每传一个packet会放入一个应答队列等待应答。8当一个Block传输完成之后客户端再次请求NameNode上传第二个Block的服务器。重复执行3-7步。注意 如果写入的时候复制管道中的某一个DataNode无法将数据写入磁盘如DataNode死机。发生这种错误时管道会立即关闭已发送的但尚未收到确认的数据包会被退回到队列中以确保管道中错误节点的下游节点可以得到数据包。而在剩下的健康的DataNode中正在写入的数据块会被分配新的blk_id。这样当发生故障的数据节点恢复后冗余的数据块就会因为不属于任何文件而被自动丢弃由剩余DataNode节点组成的新复制管道会重新开放写入操作得以继续写操作将继续直至文件关闭。NameNode如果发现文件的某个数据块正在通过复制管道进行复制就会异步地创建一个新的复制块这样即便HDFS的多个DataNode发生错误HDFS客户端仍然可以从数据块的副本中恢复数据前提是满足最少数目要求的数据副本dfs.replication.min已经被正确写入dfs.replication.min配置默认为1。5、HDFS读文件流程1客户端通过Distributed FileSystem向NameNode请求下载文件NameNode通过查询元数据找到文件块所在的DataNode地址。2挑选一台DataNode就近原则然后随机服务器请求读取数据。3DataNode开始传输数据给客户端从磁盘里面读取数据输入流以Packet为单位来做校验。4客户端以Packet为单位接收先在本地缓存然后写入目标文件。到这里我们对HDFS的大部分概念已经了解了下面则来进行完全分布式的环境搭建。环境搭建1. 首先准备3台虚拟机并且要保证虚拟机的时间同步和hostsip都配置好集群能互相通信。这里可以看到我的三台都配好了ip而且hosts也都写了并且集群时间同步也都已经做了。接下来进行第二步。2. 解压安装JDK,并且在/etc/profile 里面配置环境变量通过xftp把文件传到linux本地里面 自己新建文件夹放到里面 然后解压到自己的文件夹内。通过tar命令进行解压并进行环境变量的配置最后记得source配置文件。然后我们进入Hadoop的目录看一看1bin目录存放对Hadoop相关服务HDFS,YARN进行操作的脚本2etc目录Hadoop的配置文件目录存放Hadoop的配置文件3lib目录存放Hadoop的本地库对数据进行压缩解压缩功能4sbin目录存放启动或停止Hadoop相关服务的脚本5share目录存放Hadoop的依赖jar包、文档、和官方案例3. 接下来我们进入etc目录并且对Hadoop的配置进行修改。我们总共要修改 core-site.xml . hadoop-env.sh . hdfs-site.xml ,mapred-env.sh, mapred-site.xml , slaves, yarn-env.sh, yarn-site.xml首先在上面这些配置文件后缀都是sh的比如hadoop-env.sh我们就只需要把JavaHome配置一下。其他的-env.sh的也是这样只需要配置JDK即可,这里就不多阐述 。接下来我们vim core-site并配置这些东西 !-- 指定HDFS中NameNode的地址 --propertynamefs.defaultFS/namevaluehdfs://hadoop102:9000/value/property!-- 指定Hadoop运行时产生文件的存储目录 --propertynamehadoop.tmp.dir/namevalue/opt/module/hadoop-2.7.2/data/tmp/value/property这个就配置完成接着我们就配置hdfs-site.xml !-- 配置块的副本数 --propertynamedfs.replication/namevalue3/value/property!-- 指定Hadoop辅助名称节点主机配置 --propertynamedfs.namenode.secondary.http-address/namevaluehadoop104:50090/value/property
然后配置yarn-site.xml!-- Reducer获取数据的方式 --
propertynameyarn.nodemanager.aux-services/namevaluemapreduce_shuffle/value
/property!-- 指定YARN的ResourceManager的地址 --
propertynameyarn.resourcemanager.hostname/namevaluehadoop103/value
/property
接着配置mapred-site.xml!-- 指定MR运行在Yarn上 --
propertynamemapreduce.framework.name/namevalueyarn/value
/property
到这里我们Hadoop的配置就已经完成因为是分布式所以我们就通过scp -r 的命令把jdk和Hadoop都拷贝过去并且各自配置一下环境变量并source到这里我们完全分布式就配置完成。然后我们可以单点启动也可以群起不过群起需要配置免密免密配置很简单就不再多说接下来我们直接通过start-all.sh启动集群可以通过jps查看一下。进程全部起来了接下来我们去webUI可以查看HDFS端口是50070,yarn是8088至此我们的完全分布式搭建成功相信大家也对搭建的过程很了解了对Hadoop HDFS也都算是非常详细的介绍了希望大家看完都能自己搭建一个集群对以后的大数据学习打下基础至于shell操作HDFS或者JavaAPI操作都是非常简单的在这里简单说一下 shell操作Hadoop十分简单部分命令和linux很像。powershell
-mkdir 在HDFS上创建目录
-moveFromLocal从本地剪切粘贴到HDFS
-appendToFile追加一个文件到已经存在的文件末尾
-cat显示文件内容
-chgrp 、-chmod、-chownLinux文件系统中的用法一样修改文件所属权限
-copyFromLocal从本地文件系统中拷贝文件到HDFS路径去
-copyToLocal从HDFS拷贝到本地
-cp 从HDFS的一个路径拷贝到HDFS的另一个路径
-mv在HDFS目录中移动文件
-get等同于copyToLocal就是从HDFS下载文件到本地
-getmerge合并下载多个文件比如HDFS的目录 /user/lmr/test下有多个文件:log.1, log.2,log.3,...
-put等同于copyFromLocal
-tail显示一个文件的末尾
-rm删除文件或文件夹
-rmdir删除空目录
-du统计文件夹的大小信息
至于Java的API相关操作也是很简单的这里就不多说。如果你有任何意见或想法欢迎在评论区和我们讨论在中国企业与「远程办公」正面相遇满月之际2月29日CSDN 联合广大「远程办公」工具服务企业共同举办【抗击疫情科技公司在行动】系列之【远程办公】专题线上峰会活动中国「远程办公」大考。扫下方二维码或点击阅读原文免费报名直播抽取奖品与大牛交流。想提前了解峰会详情可加小助手微信csdnai回复远程办公进直播群推荐阅读探索处理数据的新方法8 个重点带你搞懂云数据库——DBaaS数据库即服务到底是什么
你的企业混合云了吗来看看评估混合云解决方案时要注意的6个原则
程序员笔试面试最爱考察的算法到底怎么搞定
基于区块链技术的数据共享赋能AI驱动网络钉钉爆火背后真正的在线教育机构过得怎么样已有 1 家倒闭
先马后看详解线性回归、朴素贝叶斯、随机森林在R和Python中的实现应用附代码
真香朕在看了点击“阅读原文”参与报名