当前位置: 首页 > news >正文

河北廊坊seo网站建设网站优化湖南建设监理官方网站

河北廊坊seo网站建设网站优化,湖南建设监理官方网站,wordpress选哪个主题,网站设置访问频率怎么办2. 分布式文件系统 HDFS 1. 引入HDFS【面试点】 问题一#xff1a;如果一个文件中有 10 个数值#xff0c;一行一个#xff0c;并且都可以用 int 来度量。现在求 10 个数值的和 思路#xff1a; 逐行读取文件的内容把读取到的内容转换成 int 类型把转换后的数据进行相加…2. 分布式文件系统 HDFS 1. 引入HDFS【面试点】 问题一如果一个文件中有 10 个数值一行一个并且都可以用 int 来度量。现在求 10 个数值的和 思路 逐行读取文件的内容把读取到的内容转换成 int 类型把转换后的数据进行相加输出最后的一个累加和 问题二10000 个文件每个文件 2T文件里的内容依然是每行一个数值求这一堆文件的所有数值的和 思路与方案 使用单进程的程序执行即一行一行读取串行可能会计算出结果但效率很低且大概率是算不出来将串行改为并行即分布式运算 第一阶段先把大的任务切分成小的任务然后将集群中的每个节点都可以对这些小任务进行计算第二阶段将之前中间性的结果进行汇总 问题三问题二中的 10000 个 2T 的文件应该怎么分布才能让这 10000 个任务的执行效率达到最高 思路 如果集群有 10000 个节点每个节点都放了一个文件然后对每个节点上的数据启动计算引擎进行任务的计算这样效率高计算在 A 节点存储的数据在 B 节点这样效率不高计算和存储在同一个节点效率高。因为数据传输肯定有延迟从而降低效率 问题四数据的处理存储和计算是这么设计的 答存储和计算相互依赖。在涉及存储时必须考虑计算反之相同 存储HDFS计算MapReduce HDFS 设计思想把存入到 HDFS 集群的数据均匀分散的存储到整个集群中 说明集群的配置是去全局的 案例1 100G 数据分多少集群节点存储的比较 都是 100G 数据假设 1G 的数据需要 1秒 的运算时间 序号集群节点数切分存储块的大小存储方式运算所需时间秒11001G每个节点 1G 数据量12901G10 台存 2G80 台存 1G2390512M20 台存 1.5G70 台存 1G1.5 上述案例得出切分的块是不是越小越好但有弊端小文件很多时会有问题 案例2 大文件 access.log 100G 的切分方法 第一种切分法block0 50G block1 50G第二种切分法block0 20G block1 20G block2 20G block3 20G block4 20G 对于用户来说一个文件是完整的存储到 HDFS 进来的所以用户再去下载该文件时要的是完整的文件整体要把所有的块合并起来且顺序不能错。块越少拼接越容易 上述案例得出切分的块是不是越大越好 总结不大不小最好。不大不小HDFS 在设计时考虑到不同的应用场景在每个不同的应用场景中可能需要的块的大小不一样可以自己配置。 HDFS 块的默认大小为 Hadoop2.x 版本以前默认块的大小64MHadoop2.x 版本含以后默认块的大小128M 让大数据能够存储到 HDFS 集群并考虑计算的效率问题让文件切分存储并让这些块均匀分散的存储到整个集群中 HDFS 集群存储的使用场景 数据量特别多前期数据量不大后期数据量快速增长可能导致数据量快速增多 HDFS 集群理论上可无限制的增加节点但有上限 HDFS 集群是主从架构主节点 NameNode加的机器的性能一般数据安全 问题五HDFS 如何保障数据安全 解决配置多份 多份数据分布的原则 数据备份的数量由用户指定如果一个文件存储多份这多份数据完全没必要存储在一个节点上 小问题 若集群有 3 个存储节点但用户指定存储 4 份则 HDFS 上最终有几份数据3 份 结论HDFS 集群中的任何一个节点肯定没有完全相同的两份数据 问题六HDFS 核心思想分而治之冗余备份 分散存储 一个大的文件要存储必须要借助分布式的存储系统将大文件进行 分而治之分治冗余备份 整个 HDFS 集群架设在不是特别牢靠的服务器上所以要保证数据安全。采用 副本 的策略针对用户上传的整个文件将该文件切分出来的多个块备份多份 冗余备份的默认值3 份。备份数量的配置文件路径 /software/hadoop/etc/hadoop/hdfs-site.xml 更改后重启服务生效propertynamedfs.replication/namevalue1/value /property知识点1如果节点机器性能有差异怎么均匀分散 数据节点机器性能差异不是特别多若某一台机器的性能比较差可设置该机器少存一些数据。设置 hadoop fs -setrep [-R] [-w] numPeplicas path知识点2block 块的大小设置多少 默认 128M实际生产最多 256M。若不懂就按照默认的大部分都是按默认的 知识点3HDFS 集群节点很多会导致什么情况 元数据信息 fsimage 很多加载到内存中的时间越来越长 DataNode 节点多节点保存的数据块的个数也多 知识点4跨网络肯定有数据延迟和丢失问题 知识点5HDFS 不适合存储小文件 原因存储一亿个小文件大小仅仅 1T但要消耗 20G 左右的内存 文件存储在硬盘上存储文件元信息比如文件的创建者、文件的创建日期和文件的大小等的区域叫 iNode中文译名为 “索引节点” iNode 是有限的。当有成千上万个小文件存储于服务器的文件系统中时最先消耗完的肯定不是磁盘的空间而是 iNode这会导致大量空闲磁盘的空间无法使用。小文件带来的问题归根结底是由于其小且数量巨大 解决方案对小文件进行合并或对小文件提前做处理 将一定数量的小文件合并为一个个的大文件并且只存储合并后的大文件那存储系统中的文件数量就会大大减少通过一定方式再从合并后的大文件中分离出小文件按需获取想要的数据即可 知识点文件存储在硬盘上硬盘的最小存储单位叫做 “扇区”sector。每个扇区存储512字节相当于0.5KB。操作系统读取硬盘时不会一个个扇区的读取这样效率太低而是一次性连续读取多个扇区即一次性读取一个 “块”block。这种由多个扇区组成的 “块”是文件存储的最小单位。“块” 的大小最常见的是 4KB即连续 8 个 sector 组成一个 block。文件数据都存储在 “块” 中那么很显然我们还必须找到一个地方存储文件的元信息比如文件的创建者、文件的创建日期、文件的大小等等。这种存储文件元信息的区域就叫做 iNode。 2. HDFS 概述 HDFS 是大数据存储的基础几乎所有的大数据分布式存储需求都会使用到。 1. HDFS 设计思路 HDFS 被设计成使用低廉的服务器进行海量数据的存储如何做到分散存储 大文件被切割成小文件使用分而治之的思想对同一个文件进行管理每个切分后的块都进行冗余备份高可用不丢失 2. HDFS 架构 主从架构。下边三个节点的架构是最基础的高可用会有 StandbyNameNode用于防止 NameNode 宕机。 NameNode 主节点掌管文件系统的目录树处理客户端的请求保存元数据信息DataNode 从节点存储实际数据处理真正的读写SecondaryNameNode单机/伪分布式/分布式分担 NameNode 的压力协助合并元数据信息 3. HDFS 优缺点 优点 可构建在廉价机器上通过多个副本来提高可靠性文件切分多个块进行存储高容错性。数据可自动保存多个副本副本丢失后可自动恢复适合批处理。移动计算比移动数据更方便流式文件访问。一次写入多次读取。可以保证数据一致性 缺点不适合以下操作 要求高的数据访问。比如毫秒级小文件存储。寻道时间超过读取时间并发写入文件随机修改。一个文件只能有一个写仅支持追加写入 3. HDFS 操作 1. HDFS 的 Shell 操作【重点】 命令功能举例hadoop fshdfs dfs两种方式操作 hdfs 文件的命令前缀-help输出这个命令参数手册hadoop fs -help-ls显示目录信息hadoop fs -ls hdfs://ip:9000/hadoop fs -ls /-put本地文件上传至 hdfs把当前目录下的 a.txt 上传到 hdfshadoop fs -put a.txt /hdfsPath-get从 hdfs 下载文件到本地hadoop fs -get /a.txt localPath-cp从 hdfs 的一个路径拷贝到另一个路径把 /a.txt 拷贝到 /aa 下并更名为 a2.txthadoop fs -cp /a.txt /aa/a2.txt-mv在 hdfs 目录中移动文件hadoop fs -mv /a.txt /aa-mkdir创建文件夹hadoop fs -mkdir /b-rm删除文件或文件夹hadoop fs -rm -r /aa/bb-rmdir删除空目录hadoop fs -rmdir /aa/bb-moveFromLocal从本地剪切到 hdfshadoop fs -moveFromLocal /home/a.txt /aa/bb-moveToLocal从 hdfs 剪切到本地hadoop fs -moveToLocal /aa/bb/a.txt /home-copyFromLocal从本地文件系统中拷贝文件到 hdfshadoop fs -copyFromLocal ./a.txt /aa-copyToLocal从 hdfs 拷贝到本地hadoop fs -copyToLocal /a.txt .-appendToFile追加一个文件到已经存在的文件末尾hadoop fs -appendToFile ./a.txt /a.txt-cat显示文件内容hadoop fs -cat /aa/a.txt-tail显示一个文件的末尾hadoop fs -tail /aa/a.txt-text以字符形式打印一个文件的内容hadoop fs -text /aa/a.txt-chmod与 Linux 文件系统的用法一样对文件设置权限hadoop fs -chmod 666 /aa/a.txt-df统计文件夹的大小信息hadoop fs -df -sh /aa/*-count统计一个指定目录下的文件节点数量hadoop fs -count /aa-setrep设置 hdfs 中文本的副本数量hadoop fs -setrep 3 /aa/a.txthdfs dfsadmin -report查看 hdfs 集群工作状态Live datanodes (2)说明有两台是正常运行的数据节点 2. HDFS 的 API 操作 ​ HDFS 的 API 操作所需的 maven 依赖导入 pom.xml 文件的 artifactIdmodule_name/artifactId 和 /project 之间并等待下载完成 dependenciesdependencygroupIdorg.apache.hadoop/groupIdartifactIdhadoop-common/artifactIdversion2.7.4/version/dependencydependencygroupIdorg.apache.hadoop/groupIdartifactIdhadoop-client/artifactIdversion2.7.4/version/dependencydependencygroupIdorg.apache.hadoop/groupIdartifactIdhadoop-hdfs/artifactIdversion2.7.4/version/dependencydependencygroupIdorg.apache.hadoop/groupIdartifactIdhadoop-mapreduce-client-core/artifactIdversion2.7.4/version/dependency /dependencies buildpluginsplugingroupIdorg.apache.maven.plugins/groupIdartifactIdmaven-compiler-plugin/artifactIdversion3.1/versionconfigurationsource1.8/sourcetarget1.8/targetencodingUTF-8/encoding!-- verbaltrue/verbal--/configuration/pluginplugingroupIdorg.apache.maven.plugins/groupIdartifactIdmaven-shade-plugin/artifactIdversion2.4.3/versionexecutionsexecutionphasepackage/phasegoalsgoalshade/goal/goalsconfigurationminimizeJartrue/minimizeJar/configuration/execution/executions/plugin/plugins /build propertiesmaven.compiler.source16/maven.compiler.sourcemaven.compiler.target16/maven.compiler.target /properties1. 访问数据 1. 获取 FileSystem // FileSystem.get() import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import java.io.IOException;public class hdfs01GetFileSystem {public static void main(String[] args) throws IOException {// 1. 创建Configuration对象Configuration conf new Configuration();// 2. 设置文件系统类型// 第二个参数是访问域名做过域名解析可设置成 hdfs://hadoop0:8020conf.set(fs.defaultFS, hdfs://hadoop0:8020);// 3. 获取指定文件系统FileSystem fileSystem FileSystem.get(conf);// 4. 打印输出System.out.println(fileSystem); }}执行上述代码返回下图所示结果即成功 2. 文件的遍历 // FileSystem.listFiles() for循环 import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.*; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException;public class traverseFile {public static void main(String[] args) throws IOException, URISyntaxException, InterruptedException {// 1. 获取FileSystem默认端口8020FileSystem fileSystem FileSystem.get(new URI(hdfs://hadoop0:8020), new Configuration(), root);// 2. 调用 listFile()方法 获取根目录下所有的文件信息RemoteIteratorLocatedFileStatus iterator fileSystem.listFiles(new Path(/), true);// 3. 遍历迭代器while (iterator.hasNext()) {LocatedFileStatus fileStatus iterator.next();// 获取文件的绝对路径hdfs://172.16.15.100/xxxSystem.out.println(fileStatus.getPath() fileStatus.getPath().getName());// 文件的block信息BlockLocation[] blockLocations fileStatus.getBlockLocations();for (BlockLocation blockLocation : blockLocations) {String[] hosts blockLocation.getHosts();for (String host : hosts) {System.out.println(主机为 host);}}System.out.println(block数量为 blockLocations.length); }}}输出结果 hdfs://hadoop0:8020/0320/data.txtdata.txt 主机为hadoop1 主机为hadoop2 block数量为1 hdfs://hadoop0:8020/0320/merge.txtmerge.txt 主机为hadoop2 主机为hadoop1 block数量为1 ...3. 创建文件夹 // FileSystem.mkdirs() import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException;public class hdfs03CreateFolder {public static void main(String[] args) throws IOException, URISyntaxException, InterruptedException {// 1. 获取FileSystemFileSystem fileSystem FileSystem.get(new URI(hdfs://hadoop0:8020), new Configuration(), root);// 2. 创建文件夹fileSystem.mkdirs(new Path(/0320));// 3. 关闭FileSystemfileSystem.close(); }}执行结果 4. 文件的上传 // FileSystem.copyFromLocalFile() import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException;public class hdfs04FileUpload {public static void main(String[] args) throws InterruptedException, IOException, URISyntaxException {hdfs04FileUpload fileUpload new hdfs04FileUpload();fileUpload.FileUpload();}/* 定义上传文件的方法 */public void FileUpload() throws URISyntaxException, IOException, InterruptedException {// 1. 获取文件系统FileSystem fileSystem FileSystem.get(new URI(hdfs://hadoop0:8020), new Configuration(), root);// 2. 上传文件fileSystem.copyFromLocalFile(new Path(/Users/jason93/Desktop/BigData/file/data.txt), new Path(/0320));// 3. 关闭FileSystemfileSystem.close(); }}执行结果 5. 文件的下载 // IOUtils.copy() import org.apache.commons.io.IOUtils; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FSDataInputStream; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import java.io.FileOutputStream; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException;public class hdfs05FileDownload {public static void main(String[] args) throws IOException, URISyntaxException, InterruptedException {// 1. 获取FileSystemFileSystem fileSystem FileSystem.get(new URI(hdfs://hadoop0:8020), new Configuration(), root);// 2. 获取hdfs的输入流FSDataInputStream inputStream fileSystem.open(new Path(/0320/data.txt));// 3. 获取本地文件的输出流FileOutputStream outputStream new FileOutputStream(/Users/jason93/Desktop/BigData/file/hdfs/dataDown.txt);// 4. 文件的拷贝IOUtils.copy(inputStream, outputStream);// 5. 关闭流IOUtils.closeQuietly(inputStream);IOUtils.closeQuietly(outputStream);fileSystem.close(); }}运行结果其文件内容与 data.txt 一样 2. 合并小文件 1. 合并小文件上传 首先准备几个小文件 # /Users/jason93/Desktop/BigData/file/hdfs/merge/ # data1.txt hello,world # data2.txt hello,hadoop # data3.txt hello,hdfs代码 // IOUtils.copy() import org.apache.commons.io.IOUtils; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.*; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException;public class hdfs06MergeFileUpload {public static void main(String[] args) throws URISyntaxException, IOException, InterruptedException {// 1. 获取FileSystemFileSystem fileSystem FileSystem.get(new URI(hdfs://hadoop0:8020), new Configuration(), root);// 2. 获取hdfs大文件的输出流FSDataOutputStream fsDataOutputStream fileSystem.create(new Path(/0320/hdfs/merge.txt));// 3. 获取一个本地文件系统LocalFileSystem localFileSystem FileSystem.getLocal(new Configuration());// 4. 获取本地文件夹下所有文件的详情FileStatus[] fileStatuses localFileSystem.listStatus(new Path(/Users/jason93/Desktop/BigData/file/hdfs/merge));// 5. 遍历每个文件获取每个文件的输入流for (FileStatus fileStatus : fileStatuses) {FSDataInputStream fsDataInputStream localFileSystem.open(fileStatus.getPath());// 6. 将小文件的内容复制到大文件IOUtils.copy(fsDataInputStream, fsDataOutputStream);IOUtils.closeQuietly(fsDataInputStream);}// 7. 关闭流IOUtils.closeQuietly(fsDataOutputStream);localFileSystem.close();fileSystem.close(); }}运行后看结果 2. 合并小文件下载 方式一通过命令行方式 将 hdfs 的/0320/hdfs/下的三个文件合并下载到本地 说明若本地该文件不存在则创建写入若存在则覆盖文件的原内容 # 合并指定目录下的所有文件 hadoop fs -getmerge /0320/hdfs/* /home/data/hdfs/mergeDown.txt # 合并目录下的指定文件也可以(相对路径) hadoop fs -getmerge /0320/hdfs/data1.txt /0320/hdfs/data3.txt mergeDown13.txt # 查看结果 [roothadoop0 hdfs]# ls mergeDown13.txt mergeDown.txt merge.txt [roothadoop0 hdfs]# cat mergeDown.txt hello,world hello,hadoop hello,hdfs [roothadoop0 hdfs]# cat mergeDown13.txt hello,world hello,hdfs方式二通过 Java API方式 // IOUtils.copy() import org.apache.commons.io.IOUtils; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.*; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException;public class hdfs07MergeFileDownload {public static void main(String[] args) throws URISyntaxException, IOException, InterruptedException {// 1. 获取FileSystemFileSystem fileSystem FileSystem.get(new URI(hdfs://hadoop0:8020), new Configuration(), root);// 2. 获取一个本地文件系统LocalFileSystem localFileSystem FileSystem.getLocal(new Configuration());// 3. 获取本地大文件的输出流FSDataOutputStream outputStream localFileSystem.create(new Path(/Users/jason93/Desktop/BigData/file/hdfs/mergeDown.txt), true);// 4. 获取hdfs下的所有小文件RemoteIteratorLocatedFileStatus listFiles fileSystem.listFiles(new Path(/0320/hdfs), true);// 5. 遍历while (listFiles.hasNext()) {LocatedFileStatus locatedFileStatus listFiles.next();FSDataInputStream inputStream fileSystem.open(locatedFileStatus.getPath());// 6. 将小文件复制到大文件中IOUtils.copy(inputStream, outputStream);IOUtils.closeQuietly(inputStream);}// 7. 关闭流IOUtils.closeQuietly(outputStream);localFileSystem.close();fileSystem.close(); }}运行结果 4. HDFS 原理 1. HDFS 的启动流程【重要】 先启动 NameNode 进程加载 NameNode 文件夹中存储的磁盘的元数据信息fsimage edits_inprogressNameNode 在启动完毕后会在 NameNode 节点启动一个服务该服务会等待所有 DataNode 上线后汇报块信息DataNode 一旦上线就会通过心跳机制把自身所持有的所有块信息汇报给 NameNode只有 NameNode 等到了所有的 DataNode 的上线以及把所有的块信息都汇报完毕后最后 NameNode 才能得知当前集群中所有文件的所有块的副本的分布。这样才代表 NameNode 正常启动 2. DataNode 页面信息介绍 信息说明 Node地址和端口Last Contact最近通讯时间正常是 0/1/2 的间隔若不正常则为最后一次的通讯时间Admin State管理员状态CapacityHDFS 容量Used已使用容量Non DFS Used非 HDFS 使用容量Remaining剩余容量Blocks块容量Block pool used块使用占比Failed Volumes失败卷的个数确定当前数据节点停止服务允许卷出错的服务0 代表任何卷出错都停止服务Version版本 3. HDFS 的读写剖析 1. HDFS 读数据流程 客户端把要读取的文件路径发送给 NameNodeNameNode 获取文件的元信息主要信息是 block 块的存放位置返回给客户端 NameNode 根据 block 块所在节点与客户端的距离判断返回哪个节点哪个节点离客户端最近就返回哪个 客户端根据返回的信息找到相应 DataNode然后逐个获取文件的 block并在客户端本地进行数据追加合并从而获得整个文件 异常情况 HDFS 在读取文件时如果其中一个块突然坏掉了怎么办 客户端在 DataNode 上读取完后会对读取到的数据进行 checksum 验证该验证就是将读取到数据和 HDFS 块的元数据进行校验如果校验过程中发现了错误则说明该 DataNode 读取的数据不完整可能这个 DataNode 坏掉了这时客户端会跟 NameNode 通讯告诉它存在异常的 DataNode而客户端可以从拥有该 block 备份的其他 DataNode 上重新读取文件当 DataNode 确认数据异常后将会启动异步删除并同时告诉 NameNode 更新元数据信息若没有其余副本则需通过 SecondaryNameNode 进行数据恢复 2. HDFS 写数据流程 具体步骤 Client 发送写数据请求 NameNode 响应请求然后做一系列校验如果能上传该数据则返回该文件的所有切块应该被存放在哪些 DataNode 上的 DataNode 列表 block-001: hadoop2 hadoop3 block-002: hadoop3 hadoop4Client 拿到 DataNode 列表后开始传数据 首先传第一个block-001DataNode 列表就是 hadoop2 和 hadoop3Client 就把 block-001 传到 hadoop2 和 hadoop3 上 以此类推用传第一个数据块的方式传其他的数据 当所有的数据块都传完后Client 会给 NameNode 返回一个状态信息表示数据已全部写入成功或者失败 NameNode 接收到 Client 返回的状态信息来判断当次写入数据的请求是否成功若成功则更新元数据信息 异常情况 场景一HDFS 在上传文件时若其中一个 DataNode 突然挂掉了怎么办 客户端上传文件时与 DataNode 建立 pipeline 管道管道正向是客户端向 DataNode 发送的数据包管道反向是 DataNode 向客户端发送 ACK 确认也就是正确接收到数据包后发送一个已确认接收到的应答当 DataNode 突然挂掉了客户端接收不到该 DataNode 发送的 ACK 确认此时不会立刻终止写入如果立刻终止易用性和可用性都太不友好客户端会通知 NameNodeNameNode 检查该块的副本与规定的不符会通知其他 DataNode 去复制副本并将挂掉的 DataNode 作下线处理不再让它参与文件上传与下载该过程称为 pipeline recovery 场景二HDFS 向 DataNode 写入数据失败怎么办上传 100MB 的文件上传到 50MB突然断了或 block 由于网络等原因异常了HDFS 会怎么处理 Pipeline 数据流管道会被关闭ACK 队列中的 packets 会被添加到数据队列的前面以确保数据包不丢失在已正常存储 block 块的 DataNode 的 blockID 版本会更新升级这样发生故障的 DataNode 节点上的 block 数据会在节点恢复正常后被删除失效节点也会从 Pipeline 中删除剩下的数据会被写入到 Pipeline 数据流管道中的其他节点上 5. HDFS 三大机制核心设计 HDFS 三大核心机制心跳机制、安全模式、副本存放策略 1. HDFS 心跳机制【重要】 Hadoop 是 Master/Slave 架构Master 中有 NameNode 和 ResourceManagerSlave 中有 DataNode 和 NodeManager。 【心跳机制】DataNode 每隔一段时间默认 3 秒就会跟 NameNode 取得一次联系从而证明自己还活着让 NameNode 能够识别到当前集群中有多少存活的节点。 详细点Master 启动时会启动一个 IPCInter-Process Communication进程间通信server 服务等待 Slave 连接Slave 启动时会主动连接 Master 的 IPC server 服务并且每隔 3 秒连接一次 Master这个每隔一段时间去连接一次的机制称为心跳。Slave 通过心跳给 Master 汇报自己的信息Master 也通过心跳给 Slave 下达命令。NameNode 通过心跳得知 DataNode 的状态ResourceManager 通过心跳得知 NodeManager 的状态。如果 Master 长时间都没收到 Slave 的心跳就认为该 Slave 挂掉了。 NameNode 判断 DataNode 是否宕机需要一个标准超时 timeout超时时长 10 * 心跳时长3秒 2 * 检测心跳是否正常工作的间隔5分钟 即 10 * 3 2 * 5 * 60 630 秒 超时时间可在 hdfs-site.xml 文件中配置 dfs.heartbeat.interval 参数或使用 Zookeeper 做一个监控有节点宕机可迅速感知。 心跳机制分两个方面 命令NameNode 给 DataNode 发汇报DataNode 给 NameNode 发 心跳机制作用 让 NameNode 能够识别当前各个 DataNode 的状态DataNode 向 NameNode 传送 心跳数据包 心跳数据包 该节点自身状态磁盘使用量、block 块的数量、block 块的状态该 DataNode 节点保存的所有 block 块的信息 block 块的信息在 Linux 系统的文件位置 2. HDFS 安全模式【重要】 ​ 在正常的启动范围内HDFS 集群会进入安全模式无法对外提供服务。安全模式下客户端不能对任何数据进行操作只能查看元数据信息。 1. 进入安全模式 进入安全模式的场景 大概率是因为集群出现问题时进入安全模式当 HDFS 集群中部分 DataNode 节点宕机后HDFS 启动服务做恢复当丢失数据的比例超过 0.1% 时会进入安全模式 丢失率 可手动配置 默认是dfs.safemode.threshold.pct0.999f新版本的配置是dfs.namenode.safemode.threshold-pct0.999f 若要强制对外提供服务可使用HDFS命令操作 hdfs dfsadmin -safemode leave # 退出安全模式 hdfs dfsadmin -safemode enter # 进入安全模式 hdfs dfsadmin -safemode get # 获取安全模式状态 hdfs dfsadmin -safemode wait # 等待2. 退出安全模式 hdfs dfsadmin -safemode leave说明 找到集群的问题进行修复比如修复宕机的 DataNode修复好了会自动退出安全模式手动强行退出安全模式并没有真正解决数据丢失的问题 3. 副本存放策略 决定一个数据块的那几个副本默认是 3到底该存储到哪些服务器上 原则 任意一个节点上不可能存储两个一样的副本块如果一个数据块要保存完整的 3 个副本块则至少有 3 个节点 副本存放策略 策略 第一个副本块选取和客户端相同的节点第二个副本块选取跟第一个副本块存储节点相邻的机架Rack上面的任意一个节点第三个副本块存放在和第二个副本块所在机架不同的节点上 策略是一个参考不是硬性标准。所以实际选取存储空间大、不忙的节点 **方法**将每个文件的数据分块存储每一个数据块又保存多个副本这些数据块副本分布在不同的机器节点上 作用数据分块存储和副本存放是保证可靠性和高性能的关键 6. HDFS 三大组件 重点组件的职责、元数据 1. NameNode 主节点 1. 职责 维护元数据查询、修改响应客户端的读写数据请求配置副本存放策略管理集群数据库负载均衡问题 2. 元数据 如何管理元数据 使用 WALWrite-Ahead Logging预写日志系统 WAL数据库中一种高效的日志算法对于非内存数据库而言磁盘 I/O 操作是数据库效率的一大瓶颈。在相同的数据量下采用 WAL 日志的数据库系统在事务提交时磁盘写操作只有传统的回滚日志的一半左右大大提高了数据库磁盘 I/O 操作的效率从而提高了数据库的性能。 说明MySQL 实现了 WAL所有的事务操作都会记录日志若某张表的数据丢失后可根据该日志拿到对应数据对表进行恢复 元数据信息的位置${HADOOP_HOME}/data/namenode/current/ 。示例如下 相关说明 1edits_inprogress_000… 文件它是时刻操作的文件按一定时间或一定大小不同版本有差异分割为若干 edits_000… 文件 edits 和 fsimage 的关系操作性文件 edits_00…-000… 合并起来为镜像文件 fsimage_00… 。比如 fsimage_000…0013725表示 edits_000…0013725 及之前所有的 edits_000xxx 文件合并后的文件fsimage_000…0013727 表示 edits_000…0013727 及之前所有的 edits_000xxx 文件合并后的文件。至于什么时候合并有个 Checkpoint 检查点。后一个 fsimage 包含前一个 fsimage 和更新的 edits 文件生成两个 fsimage 是起到 备份 的作用。若合并 edits_000…0013727 时失败则在 hdfs 冷启动时加载 fsimage_000…0013726、edits_000…0013727 和 edits_inprogress_000… 三个文件即可当然若合并 edits_000…0013727 成功了则只加载 fsimage_000…0013727 和 edits_inprogress_000… 两个文件即可通过生成一个可查看的 xml 文件查看 edits 和 fsimage 文件信息 # edits 文件 hdfs oev -i edits_0000000000000013664-0000000000000013665 -o edits.xml cat edits.xml# fsimage 文件 hdfs oiv -i fsimage_0000000000000013725 -p XML -o fsimage.xml cat fsimage.xml2seen_txid存放 edits_inprogress_00… 日志最新的 id存放 transactionId 的文件比如 edits_inprogress_00xxx0013728则 3seen_txid 为13728。format 之后是 0 4VERSION存放 HDFS 集群的版本信息 5fsimage_000xxx.md5校验性文件 NameNode 元数据存储机制 内存 中的元数据信息metadata内存中一份完整的元数据信息目录树结构 文件块映射 数据库和 DataNode 的映射 目录树结构文件地址的目录信息文件块映射文件切分成哪些块 磁盘 中的元数据镜像fsimage 快照 edits 编辑日志 edits_inprogress实时操作变化日志在 NameNode 的工作目录中用于衔接内存 metadata 和持久化元数据镜像 fsimage 之间的操作日志edits 文件 当客户端对 HDFS 中的文件进行新增或修改时操作记录首先被写入 edits 日志文件中当客户端操作成功后相应的元数据会更新到内存 metadata 中 元数据合并的好处【面试点】 大大缩小操作日志的大小合并后的镜像磁盘文件可以被快速加载到内存中去。可以不用加载所有的操作性文件只加载 fsimage 和 edits_inprogress 两个文件有利于加快程序的冷启动 元数据的 Checkpoint 每隔一段时间会有 SecondaryNameNode 将 NameNode 上积累的所有 edits 和一个最新的 fsimage 下载到本地并加载到内存中进行 merge合并该过程称为 Checkpoint。 2. DataNode 从节点 1. 职责 维护 NameNode 分配给它的 block 块存储管理用户的文件块数据通过心跳机制汇报自身所有的块信息给 NameNode真正的提供读写数据 数据块的两个参数 块的大小、副本的个数 data 数据的存放目录 ${HADOOP_HOME}/data/datanode/current/BP-1365453085-172.16.15.103-1646548673937/current/finalized/subdir0/2. DataNode 上下线 例1一个集群有 500 个节点现增加 10 个节点。HDFS 如何表现 新增加的 DataNode 启动后会按照配置文件寻找 HDFS 集群的 NameNode 进行汇报新上线的 DataNode 没有任何数据块的信息只有自身的状态信息原来的 DataNode 和新加的 DataNode 之间存在数据倾斜的问题 解决数据倾斜的方法负载均衡 负载均衡类型服务器之间的负载均衡、磁盘之间的负载均衡说明启动负载均衡需要手工启动一个 start-balance 的进程负载均衡举例比如一个节点 4 个磁盘每个盘 2T该节点存储了 1T 的数据若该 1T 的数据都在第一个磁盘上就意味着其他 3 个磁盘没用到这时最好做负载均衡每个磁盘 256G 例2一个集群 500 个节点现减少 10 个节点这 10 个节点上的数据块信息丢失。HDFS 如何表现 HDFS 集群会利用自身的恢复机制恢复到原来副本块的个数 知识点 下线节点在被动情况下某个块的所有副本所在节点都宕机了怎么处理 若之前做过 异地灾备可以从异地机房做数据恢复若之前没做过异地灾备那数据就丢失了 假设一个节点异常数据被负载到其他节点上了后来该节点又恢复了那数据会重新分配吗 某个数据所在的节点异常在一个时间间隔630秒之内数据不会进行恢复超过该时间后若原来是 3 个数据块副本现在是 2 个则启动恢复模式恢复成 3 个数据块副本。原节点恢复过来后会在一个时间间隔后向 NameNode 汇报NameNode 检测到该数据块副本已经正常了则恢复过来的节点就不起作用 了 3. SecondaryNameNode **职责**分担 NameNode 合并元数据信息镜像文件和操作日志的压力 **注意**SecondaryNameNode 不要和 NameNode 配置在一个节点上 说明 SecondaryNameNode 并不是 NameNode 的热备份所以当 NameNode 挂掉后不能代替 NameNode 工作对外提供服务SecondaryNameNode 只在单机模式、伪分布模式和分布式模式中使用在高可用、联邦集群中由 StandbyNameNode 取代所以 SecondaryNameNode 与 StandbyNameNode 是互斥的关系二者存且仅存一个SecondaryNameNode 只能帮助 NameNode 恢复部分数据因为当 SecondaryNameNode 接收到 NameNode 的编辑日志 edits 和镜像文件 fsimage 之后NameNode 之中的操作还会记录到它本身的编辑日志edits中不会同步到 SecondaryNameNode所以SecondaryNameNode 只有 checkpoint 之前的数据只能恢复部分的数据如果 NameNode 将 checkpoint 之后的数据丢失则无法恢复 工作机制 SecondaryNameNode 向 NameNode 发出请求看 NameNode 是否需要进行 checkpoint 活动NameNode 返回自己是否需要 checkpoint 活动的结果若需要则继续若不需要就没有后续了SecondaryNameNode 在接收到 NameNode 需要进行 checkpoint 的请求后会向 NameNode 发起 checkpoint 请求NameNode 接收到请求后对编辑日志edits进行回滚然后将编辑日志edits和镜像文件fsimage拷贝到 SecondaryNameNode 中SecondaryNameNode 将 NameNode 拷贝过来的 fsimage 和 edits 加载到内存中进行合并生成新的 fsimage.chkpointSecondaryNameNode 将 fsimage.chkpoint 拷贝到 NameNode 中NameNode 将 fsimage.chkpoint 重新命名为 fsimage 7. HDFS 的高可用和联邦【重点】 1. 高可用HA 集群要对外提供服务首先要保证 NameNode 正常不能宕机。因为企业一般都 7*24 小时不间断提供服务。保证 NameNode 实时提供服务而不宕机的机制HAHigh Available高可用 SPOFSingle Point Of Failure单点故障是主从架构存在的通性问题 单点故障具体解决方案做备份 ​ 为防止 Active 的 NameNode 宕机在旁边准备一台 Standby 节点。假设 Active 的 NameNode 节点是 Hadoop0Standby 的 NameNode 节点是 Hadoop4若 Hadoop0 宕机了Hadoop4 会代替它运行。 ​ HDFS 高可用功能用配置过 Active/Standby 两个 NameNode 实现在集群中对 NameNode 的热备份来解决 NameNode 机器宕机或软硬件升级导致集群无法使用的问题。 ​ 元数据信息在 NameNode 节点 Hadoop0 中当它宕机后Hadoop4 要迅速取代 Hadoop0也就意味着 Hadoop4 和 Hadoop0 要存储一模一样的元数据信息即 Hadoop4 是 Hadoop0 的一个热备份。【重要】 不管 Active 节点做了什么操作Standby 节点都要 时刻保持同步。 保持同步的方法创建 JournalNode 集群NameNodeActive写入该集群NameNodeStandby从该集群中读取。JournalNode 集群的各个节点跟 Zoopeeper 集群类似每个节点都有可能成为主节点因此不存在单点故障。至于区分 Active 和 Standby由 Zookeeper 集群的文件目录树决定。该目录树是一个 LOCK两个 NameNode 谁先抢到谁就是 Active。 为了保险起见设置多个 Standby 是否可以可以但有条件也不建议特别多个位数。 条件Hadoop2.x 版本中不行一个 Active 只能对应一个 StandbyHadoop3.x 版本中可以 多主多从主节点是一个小集群从节点也是一个集群比如 Kudu 2. 联邦Federation 元数据信息加载到内存中有可能内存放不下导致 内存受限。解决内存受限问题联邦 HDFS Federation指 HDFS 集群可同时存在多个 NameNode包含多组 HA每组 HA 中各 NameNode 存储相同元数据元数据分多份均分到各组 HA 的 NameNode中。 这种设计可解决单 NameNode 存在的以下问题 HDFS 集群扩展性性能更高效良好的隔离性 HDFS Federation方案
http://www.hkea.cn/news/14355586/

相关文章:

  • 私人订制网站的建设的设计表wordpress编辑器美化
  • 苏州 网站制作公司新闻热点事件素材
  • 网站架构方案浙江创都建设有限公司网站
  • 如果网站设计时经常浏览不良网站会被记录吗
  • 临沧市网站建设网站开发开发需求文档模板
  • 如何做古诗词网站网站动态图怎么做
  • 公司网站二维码怎么做的公司网站费怎么做分录
  • 锤子 网站 模版WordPress报表模板
  • 网站推广方式都有哪些深圳市住房和建设局官方网站
  • 一键免费创建论坛网站wordpress 微视频主题
  • 设计网站 知乎国外设计欣赏
  • 上海建设安全生产协会网站脑叶公司
  • 建设科技信息 网站建设电子商务企业网站建设发展论文
  • 靖江网站建设公司dw制作网站网页模板
  • 芜湖镜湖区做网站公司东营远见网站建设公司
  • 建设个人网站多少钱河南省汝州市建设网站
  • 做二手房网站食堂网站建设方案
  • 技术支持 桂林网站建设优秀企业网站案例
  • 个人网站怎么盈利手机商城网站设计
  • 网站建设项目流程图广州网站建设高端
  • 口碑好网站建设多少钱深圳wap网站建设
  • 网站域名 空间中国施工企业协会官网
  • 公司网站建设怎么做账微网站预约网站开发
  • 企业网站制作哪家好王也天与葛优
  • jquery网站开发教程织梦网站提示保存目录数据时报
  • php网站开发实例教程简介北京网站建设外包公司
  • 郑州企业网站制作怎么做国内做网站的大公司有哪些
  • 专业管道疏通网站建设图片犀牛云做网站推广怎么样
  • 网站推广软件赚钱难吗?重庆可视化网站制作
  • 网站后台 请示网页设计学编程吗