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

网站空间的后台控制面板请写出网站建设的整个过程

网站空间的后台控制面板,请写出网站建设的整个过程,荆门做网站的公司,德州极速网站建设 小程序HDFS分布式文件系统 1.目标 理解分布式思想学会使用HDFS的常用命令掌握如何使用java api操作HDFS能独立描述HDFS三大组件namenode、secondarynamenode、datanode的作用理解并独立描述HDFS读写流程HDFS如何解决大量小文件存储问题 2. HDFS 2.1 HDFS是什么 HDFS是Hadoop中的一…HDFS分布式文件系统 1.目标 理解分布式思想学会使用HDFS的常用命令掌握如何使用java api操作HDFS能独立描述HDFS三大组件namenode、secondarynamenode、datanode的作用理解并独立描述HDFS读写流程HDFS如何解决大量小文件存储问题 2. HDFS 2.1 HDFS是什么 HDFS是Hadoop中的一个存储子模块 HDFS (全称Hadoop Distributed File System)即hadoop的分布式文件系统 File System文件系统 操作系统中负责管理文件、存储文件信息的软件 具体地说它负责为用户创建文件存入、读取、修改、转储、删除文件等等操作 比如windows下的文件系统 分布式文件系统distributed filesystem 当数据集大小超出一台计算机的存储能力时就有必要将它拆分成若干部分然后分散到不同的计算机中存储。 管理网络中跨多台计算机存储的文件系统称之为分布式文件系统 2.2 HDFS特点 2.2.1 优点 适合存储大文件能用来存储管理PB级的数据不适合存储小文件存储非结构化数据流式的访问数据一次写入、多次读写运行于廉价的商用机器集群上成本低高容错故障时能继续运行且不让用户察觉到明显的中断容量可扩展 2.2.2 局限性 不适合处理低延迟数据访问 DFS是为了处理大型数据集分析任务的主要是为达到高的数据吞吐量而设计的对于低延时的访问需求HBase是更好的选择 无法高效存储大量的小文件 小文件会给Hadoop的扩展性和性能带来严重问题How?利用SequenceFile、MapFile等方式归档小文件How? 不支持多用户写入及任意修改文件 文件有一个写入者只能执行追加操作不支持多个用户对同一文件的写操作以及在文件任意位置进行修改但支持追加 2.3 小结 HDFS是Hadoop中的分布式文件系统HDFS高容错可扩展HDFS适合存储大文件不适合存储小文件不适合处理低延时的数据方问 3. HDFS初体验 3.1 HDFS命令20分钟 若熟悉基本的linux命令HDFS学起来so easy HDFS命令与linux 命令的相似性 参考课件《HDFS命令》 3.2 WEB UI界面 注意 若在windows下能够访问node01:50070需要配置C:\Windows\System32\drivers\etc\hosts文件末尾添加如下三行内容 192.168.51.100 node01 192.168.51.110 node02 192.168.51.120 node03 访问HDFS的web界面浏览器访问 node01:500703.3 HDFS编程 HDFS java API编程 如何建MAVEN工程①pom.xml文件②建包、建类 如何编写HDFS读写代码 如何运行代码 方式①本地运行代码右键-run 方式②打包运行 如何打包两种方式 方式一得独立安装maven mvn clean package -DskipTests # 在工程目录下执行方式二利用IDEA打包 运行jar包 [hadoopnode01 ~]$ hadoop jar com.kaikeba.hadoop-1.0-SNAPSHOT.jar com.kaikeba.hadoop.hdfs.CopyFileFromLocal /kkb/install/hadoop-2.6.0-cdh5.14.2/README.txt /README.txt如何查看官方API文档 网址 HDFS代码 向HDFS上传文件 package com.kaikeba.hadoop.hdfs;import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IOUtils;import java.io.*; import java.net.URI;/*** 将本地文件系统的文件通过java-API写入到HDFS文件*/ public class CopyFileFromLocal {/*** param args* args0 windows本地磁盘文件C:/test.txt 或虚拟机本地磁盘文件/kkb/install/hadoop-2.6.0-cdh5.14.2/README.txt* args1 hdfs上文件hdfs://node01:8020/test.txt*/public static void main(String[] args){//本地磁盘路径String source args[0];//先确保/data目录存在String destination args[1];//HDFS的路徑InputStream in null;try {in new BufferedInputStream(new FileInputStream(source));//HDFS读写的配置文件Configuration conf new Configuration();FileSystem fs FileSystem.get(URI.create(destination),conf);//调用Filesystem的create方法返回的是FSDataOutputStream对象//该对象不允许在文件中定位因为HDFS只允许一个已打开的文件顺序写入或追加OutputStream out fs.create(new Path(destination));IOUtils.copyBytes(in, out, 4096, true);} catch (FileNotFoundException e) {System.out.println(exception);e.printStackTrace();} catch (IOException e) {System.out.println(exception1);e.printStackTrace();}} }从HDFS下载文件 package com.kaikeba.hadoop.hdfs;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 org.apache.hadoop.io.IOUtils;import java.io.BufferedOutputStream; import java.io.FileOutputStream; import java.io.IOException; import java.net.URI;/*** 从HDFS读取文件* 打包运行jar包 [brucenode01 Desktop]$ hadoop jar com.kaikeba.hadoop-1.0-SNAPSHOT.jar com.kaikeba.hadoop.hdfs.ReadFileFromHDFS*/ public class ReadFileFromHDFS {/*** param args* args0 hdfs上文件hdfs://node01:8020/test.txt* args1 windows本地磁盘文件C:/01 HK/高级03班/test01.txt或虚拟机本地磁盘文件*/public static void main(String[] args) {try {//源文件String srcFile args[0];Configuration conf new Configuration();FileSystem fs FileSystem.get(URI.create(srcFile),conf);FSDataInputStream hdfsInStream fs.open(new Path(srcFile));//本地文件BufferedOutputStream outputStream new BufferedOutputStream(new FileOutputStream(args[1]));IOUtils.copyBytes(hdfsInStream, outputStream, 4096, true);} catch (IOException e) {e.printStackTrace();}} }3.4 小结 学习HDFS命令学会借助help命令 根据HDFS与linux命令的相似性举一反三 HDFS API编程时要学会查看官方API文档不管什么编程都要会查看官方API文档啊~~~ 4. 核心概念block 4.1 数据块block 4.1.1 HDFS block块 向HDFS上传文件是按照128M为单位切分成一个个block分散的存储在集群的不同数据节点datanode上 问HDFS中一个44M大小的block块会不会占据128M的空间 不会小于128M大小的块不会占据128M空间此例占据44M 问这样存储有没有问题 hadoop集群搭建在廉价的商用服务器上所以服务器有出问题的几率 4.2 block副本 回答上一个问题因为HDFS是用普通的商用服务器搭建起来的所以有节点出问题的可能性 那么如果每个block只有一份的话当block所在的节点宕机后此block将无法访问进而导致文件无法完整读取 为保正数据的可用及容错HDFS设计成每个block共有三份即三个副本 如何设置副本数 replication 3 hdfs-site.xml propertynamedfs.replication/namevalue3/value /property4.3 机架存储策略 实际机房中会有机架rack每个机架上若干服务器 每个block有三个副本以block1为例 第一副本在本机器rack1机架中的datanode1的HDFS目录下存储block1的第一个副本。第二副本在不同Rack(如rack2)的某个DataNode(datanode4)上存储block1的第二个副本。第三副本在datanode4所在机架rack2下找一台其它的datanode节点(如datanode5)存储block1的第三个副本。能有多副本随机节点 了解下服务器参数https://item.jd.com/4564487.html 机架https://item.jd.com/16829137698.html 4.4 block的一些操作 设置文件副本数有什么用 数据分块存储和副本的存放是保证可靠性和高性能的关键 方式一使用命令设置文件副本数动态生效不需要重启hadoop集群 hadoop fs -setrep -R 4 /path方式二修改配置文件hdfs-site.xml需要 重启hadoop集群才能生效 propertynamedfs.replication/namevalue4/value /propertyHDFS提供了fsck命令用于检查HDFS上文件和目录的健康状态、获取文件的block信息和位置信息 [hadoopnode01 ~]$ hdfs fsck查看文件中损坏的块 [hadoopnode01 ~]$ hdfs fsck /tmall-201412-1w.csv -list-corruptfileblocks删除损坏的文件 [hadoopnode01 ~]$ hdfs fsck /tmall-201412-1w.csv -delete查看文件的块基本信息 hdfs fsck /02-041-0029.mp4 -files -blocks -locations4.5 小结 HDFS上的文件分块存储默认每个块block有3个副本考虑机架存储策略关于block的一些常用命令hdfs fsck 这个有时候会用到清理一些损坏的文件 5. HDFS架构重点 40分钟 大多数分布式大数据框架都是主从架构HDFS也是主从架构Master|Slave或称为管理节点|工作节点 主叫NameNode中文称“名称节点”从叫DataNode中文称“数据节点” 5.1 NameNode 5.1.1 文件系统 file system文件系统操作系统中负责管理文件、存储文件信息的软件 具体地说它负责为用户创建文件存入、读取、修改、转储、删除文件等 读文件 找到文件 在哪 叫啥元数据 关于文件或目录的描述信息如文件所在路径、文件名称、文件类型等等这些信息称为文件的元数据metadata注意元数据的概念在其他的大数据中也屡有提及 命名空间 文件系统中为了便于管理存储介质上的内容给每个目录、目录中的文件、子目录都起了名字这样形成的层级结构称之为命名空间同一个目录中不能有同名的文件或目录用处这样通过目录文件名称的方式能够唯一的定位一个文件 5.1.2 HDFS-NameNode HDFS本质上也是文件系统filesystem所以它也有元数据metadataHDFS元数据metadata保存在NameNode内存中NameNode作用 HDFS的主节点负责管理文件系统的命名空间将HDFS的元数据存储在NameNode节点的内存中负责响应客户端对文件的读写请求 HDFS元数据 文件目录树、所有的文件目录名称、文件属性生成时间、副本、权限、每个文件的块列表、每个block块所在的datanode列表 每个文件、目录、block占用大概150Byte字节的元数据所以HDFS适合存储大文件不适合存储小文件 HDFS元数据信息以两种形式保存①编辑日志edits log②命名空间镜像文件fsimage edits log HDFS编辑日志文件 保存客户端对HDFS的所有更改记录如增、删、重命名文件目录这些操作会修改HDFS目录树NameNode会在编辑日志edit日志中记录下来 fsimage HDFS元数据镜像文件 即将namenode内存中的元数据落入磁盘生成的文件保存了文件系统目录树信息以及文件、块、datanode的映射关系如下图 说明 ①为hdfs-site.xml中属性dfs.namenode.edits.dir的值决定用于namenode保存edits.log文件 ②为hdfs-site.xml中属性dfs.namenode.name.dir的值决定用于namenode保存fsimage文件 5.2 DataNode DataNode数据节点的作用 存储block以及block元数据到datanode本地磁盘此处的元数据包括数据块的长度、块数据的校验和、时间戳 5.3 SecondaryNameNode 为什么引入SecondaryNameNode 为什么元数据存储在NameNode在内存中这样做有什么问题如何解决 HDFS编辑日志文件 editlog在NameNode节点中的编辑日志editlog中记录下来客户端对HDFS的所有更改的记录如增、删、重命名文件目录每次更改对应一个事务每个事务有一个事务编号事务编号递增 作用一旦系统出故障可以根据editlog恢复元数据 但editlog日志大小会随着时间变的越来越大导致系统重启根据日志恢复元数据的时间会越来越长 为了避免这种情况引入检查点机制checkpoint命名空间镜像fsimage就是HDFS元数据的持久性检查点即将内存中的元数据落磁盘生成的文件 此时namenode如果重启可以将磁盘中的fsimage文件读入内容将元数据恢复到某一个检查点然后再执行检查点之后记录的编辑日志editlog最后完全恢复元数据。 但是依然随着时间的推移editlog记录的日志会变多那么当namenode重启恢复元数据过程中会花越来越长的时间执行editlog中的每一个日志而在namenode元数据恢复期间HDFS不可用。 为了解决此问题引入secondarynamenode辅助namenode用来合并fsimage及editlog SecondaryNameNode定期做checkpoint检查点操作 创建检查点checkpoint的两大条件 SecondaryNameNode每隔1小时创建一个检查点 另外Secondary NameNode每1分钟检查一次从上一检查点开始edits日志文件中是否已包括100万个事务如果是也会创建检查点 checkpoint相关属性hdfs-site.xml 属性值解释dfs.namenode.checkpoint.period3600秒(即1小时)The number of seconds between two periodic checkpoints.dfs.namenode.checkpoint.txns1000000The Secondary NameNode or CheckpointNode will create a checkpoint of the namespace every ‘dfs.namenode.checkpoint.txns’ transactions, regardless of whether ‘dfs.namenode.checkpoint.period’ has expired.dfs.namenode.checkpoint.check.period60(1分钟)The SecondaryNameNode and CheckpointNode will poll the NameNode every ‘dfs.namenode.checkpoint.check.period’ seconds to query the number of uncheckpointed transactions. Secondary NameNode首先请求原NameNode进行edits的滚动这样新的编辑操作就能够进入新的文件中 Secondary NameNode通过HTTP GET方式读取原NameNode中的fsimage及edits Secondary NameNode读取fsimage到内存中然后执行edits中的每个操作并创建一个新的统一的fsimage文件有ckpt后缀 Secondary NameNode通过HTTP PUT方式将新的fsimage发送到原NameNode 原NameNode用新的fsimage替换旧的fsimage同时系统会更新fsimage文件到记录检查点的时间。 这个过程结束后NameNode就有了最新的fsimage文件和更小的edits文件 SecondaryNameNode一般部署在另外一台节点上 因为它需要占用大量的CPU时间并需要与namenode一样多的内存来执行合并操作 如何查看edits日志文件 hdfs oev -i edits_0000000000000000256-0000000000000000363 -o /home/hadoop/edit1.xml如何查看fsimage文件 hdfs oiv -p XML -i fsimage_0000000000000092691 -o fsimage.xml 5.4 心跳机制 工作原理 NameNode启动的时候会开一个ipc server在那里DataNode启动后向NameNode注册每隔3秒钟向NameNode发送一个“心跳heartbeat”心跳返回结果带有NameNode给该DataNode的命令如复制块数据到另一DataNode或删除某个数据块如果超过10分钟NameNode没有收到某个DataNode 的心跳则认为该DataNode节点不可用DataNode周期性6小时的向NameNode上报当前DataNode上的块状态报告BlockReport块状态报告包含了一个该 Datanode上所有数据块的列表 心跳的作用 通过周期心跳NameNode可以向DataNode返回指令 可以判断DataNode是否在线 通过BlockReportNameNode能够知道各DataNode的存储情况如磁盘利用率、块列表跟负载均衡有关 hadoop集群刚开始启动时99.9%的block没有达到最小副本数(dfs.namenode.replication.min默认值为1)集群处于安全模式涉及BlockReport 相关配置项 hdfs-default.xml 属性值解释dfs.heartbeat.interval3Determines datanode heartbeat interval in seconds. 心跳间隔dfs.blockreport.intervalMsec21600000 (6小时)Determines block reporting interval in milliseconds. 上传块报告时间间隔 查看hdfs-default.xml默认配置文件 5.5 负载均衡 start-balancer 什么原因会有可能造成不均衡 机器与机器之间磁盘利用率不平衡是HDFS集群非常容易出现的情况尤其是在DataNode节点出现故障或在现有的集群上增添新的DataNode的时候 为什么需要均衡 防止热点出现提升集群存储资源利用率从存储与计算两方面提高集群性能 如何手动负载均衡下边命令无需重启hadoop $HADOOP_HOME/sbin/start-balancer.sh -t 5% # 磁盘利用率最高的节点若比最少的节点大于5%触发均衡停止负载均衡 $HADOOP_HOME/sbin/stop-balancer.sh5.6 小结 NameNode负责存储HDFS集群的元数据存在内存中DataNode负责存储block块及块的元数据SecondaryNameNode主要负责对HDFS元数据做checkpoint操作集群的心跳机制让集群中各节点形成一个整体主节点知道从节点的死活节点的上下线导致存储的不均衡可以手动触发负载均衡 6. HDFS读写流程重点 30分钟 6.1 数据写流程 6.1.1 详细流程 创建文件 HDFS客户端向HDFS写数据先调用DistributedFileSystem.create()方法在HDFS创建新的空文件RPCClientProtocol.create()远程过程调用NameNodeNameNodeRpcServer的create()首先在HDFS目录树指定路径添加新文件然后将创建新文件的操作记录在editslog中NameNode.create方法执行完后DistributedFileSystem.create()返回FSDataOutputStream它本质是封装了一个DFSOutputStream对象 建立数据流管道 客户端调用DFSOutputStream.write()写数据DFSOutputStream调用ClientProtocol.addBlock()首先向NameNode申请一个空的数据块addBlock()返回LocatedBlock对象对象包含当前数据块的所有datanode的位置信息根据位置信息建立数据流管道 向数据流管道pipeline中写当前块的数据 客户端向流管道中写数据先将数据写入一个检验块chunk中大小512Byte写满后计算chunk的检验和checksum值4Byte然后将chunk数据本身加上checksum形成一个带checksum值的chunk516Byte保存到一个更大一些的结构packet数据包中packet为64kB大小 packet写满后先被写入一个dataQueue队列中 packet被从队列中取出向pipeline中写入先写入datanode1再从datanoe1传到datanode2再从datanode2传到datanode3中 一个packet数据取完后后被放入到ackQueue中等待pipeline关于该packet的ack的反馈 每个packet都会有ack确认包逆pipelinedn3 - dn2 - dn1传回输出流 若packet的ack是SUCCESS成功的则从ackQueue中将packet删除否则将packet从ackQueue中取出重新放入dataQueue重新发送 如果当前块写完后文件还有其它块要写那么再调用addBlock方法流程同上 文件最后一个block块数据写完后会再发送一个空的packet表示当前block写完了然后关闭pipeline 所有块写完close()关闭流 ClientProtocol.complete()通知namenode当前文件所有块写完了 6.1.2 容错 在写的过程中pipeline中的datanode出现故障如网络不通输出流如何恢复 输出流中ackQueue缓存的所有packet会被重新加入dataQueue输出流调用ClientProtocol.updateBlockForPipeline()为block申请一个新的时间戳namenode会记录新时间戳确保故障datanode即使恢复但由于其上的block时间戳与namenode记录的新的时间戳不一致故障datanode上的block进而被删除故障的datanode从pipeline中删除输出流调用ClientProtocol.getAdditionalDatanode()通知namenode分配新的datanode到数据流pipeline中并使用新的时间戳建立pipeline新添加到pipeline中的datanode目前还没有存储这个新的blockHDFS客户端通过DataTransferProtocol通知pipeline中的一个datanode复制这个block到新的datanode中pipeline重建后输出流调用ClientProtocol.updatePipeline()更新namenode中的元数据故障恢复完毕完成后续的写入流程 6.2 数据读流程 6.2.1 基本流程 1、client端读取HDFS文件client调用文件系统对象DistributedFileSystem的open方法2、返回FSDataInputStream对象对DFSInputStream的包装3、构造DFSInputStream对象时调用namenode的getBlockLocations方法获得file的开始若干block如blk1, blk2, blk3, blk4的存储datanode以下简称dn列表针对每个block的dn列表会根据网络拓扑做排序离client近的排在前4、调用DFSInputStream的read方法先读取blk1的数据与client最近的datanode建立连接读取数据5、读取完后关闭与dn建立的流6、读取下一个block如blk2的数据重复步骤4、5、67、这一批block读取完后再读取下一批block的数据重复3、4、5、6、78、完成文件数据读取后调用FSDataInputStream的close方法 6.2.2 容错 情况一读取block过程中client与datanode通信中断 client与存储此block的第二个datandoe建立连接读取数据记录此有问题的datanode不会再从它上读取数据 情况二client读取block发现block数据有问题 client读取block数据时同时会读取到block的校验和若client针对读取过来的block数据计算检验和其值与读取过来的校验和不一样说明block数据损坏client从存储此block副本的其它datanode上读取block数据也会计算校验和同时client会告知namenode此情况 7. Hadoop HA高可用 7.1 HDFS高可用原理 对于HDFS NN存储元数据在内存中并负责管理文件系统的命名空间和客户端对HDFS的读写请求。但是如果只存在一个NN一旦发生“单点故障”会使整个系统失效。虽然有个SNN但是它并不是NN的热备份因为SNN无法提供“热备份”功能在NN故障时无法立即切换到SNN对外提供服务即HDFS处于停服状态。HDFS2.x采用了HAHigh Availability高可用架构。 在HA集群中可设置两个NN一个处于“活跃Active”状态另一个处于“待命Standby”状态。由zookeeper确保一主一备讲zookeeper时具体展开处于Active状态的NN负责响应所有客户端的请求处于Standby状态的NN作为热备份节点保证与active的NN的元数据同步Active节点发生故障时zookeeper集群会发现此情况通知Standby节点立即切换到活跃状态对外提供服务确保集群一直处于可用状态 如何热备份元数据 Standby NN是Active NN的“热备份”因此Active NN的状态信息必须实时同步到StandbyNN。可借助一个共享存储系统来实现状态同步如NFS(NetworkFile System)、QJM(Quorum Journal Manager)或者Zookeeper。Active NN将更新数据写入到共享存储系统Standby NN一直监听该系统一旦发现有新的数据写入就立即从公共存储系统中读取这些数据并加载到Standby NN自己内存中从而保证元数据与Active NN状态一致。 块报告 NN保存了数据块到实际存储位置的映射信息为了实现故障时的快速切换必须保证StandbyNN中也包含最新的块映射信息因此需要给所有DN配置Active和Standby两个NN的地址把块的位置和心跳信息同时发送到两个NN上。 8. Hadoop联邦 8.1 为什么需要联邦 虽然HDFS HA解决了“单点故障”问题但HDFS在扩展性、整体性能和隔离性方面仍有问题 系统扩展性方面元数据存储在NN内存中受限于内存上限每个文件、目录、block占用约150字节整体性能方面吞吐量受单个NN的影响隔离性方面一个程序可能会影响其他程序的运行如果一个程序消耗过多资源会导致其他程序无法顺利运行HDFS HA本质上还是单名称节点 8.2 联邦 多个命名空间 HDFS联邦可以解决以上三个问题 HDFS联邦中设计了多个命名空间每个命名空间有一个NN或一主一备两个NN使得HDFS的命名服务能够水平扩展这些NN分别进行各自命名空间namespace和块的管理相互独立不需要彼此协调每个DN要向集群中所有的NN注册并周期性的向所有NN发送心跳信息和块信息报告自己的状态HDFS联邦每个相互独立的NN对应一个独立的命名空间每一个命名空间管理属于自己的一组块这些属于同一命名空间的块对应一个“块池”的概念。每个DN会为所有块池提供块的存储块池中的各个块实际上是存储在不同DN中的 8.3 扩展 联邦-官网 9. 文件压缩 9.1 压缩算法 文件压缩好处 减少数据所占用的磁盘空间加快数据在磁盘、网络上的IO 常用压缩格式 压缩格式UNIX工具算 法文件扩展名可分割DEFLATE无DEFLATE.deflateNogzipgzipDEFLATE.gzNozipzipDEFLATE.zipYESbzipbzip2bzip2.bz2YESLZOlzopLZO.lzoNoSnappy无Snappy.snappyNo Hadoop的压缩实现类均实现CompressionCodec接口 压缩格式对应的编码/解码器DEFLATEorg.apache.hadoop.io.compress.DefaultCodecgziporg.apache.hadoop.io.compress.GzipCodecbzip2org.apache.hadoop.io.compress.BZip2CodecLZOcom.hadoop.compression.lzo.LzopCodecSnappyorg.apache.hadoop.io.compress.SnappyCodec 查看集群是否支持本地压缩所有节点都要确认 [hadoopnode01 ~]$ hadoop checknative9.2 编程实践 编程上传压缩过的文件到HDFS 对CopyFileFromLocal代码做修改向文件压缩后再上传到HDFS代码 package com.kaikeba.hadoop.compress;import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IOUtils; import org.apache.hadoop.io.compress.BZip2Codec; import org.apache.hadoop.io.compress.CompressionCodec; import org.apache.hadoop.io.compress.CompressionOutputStream; import org.apache.hadoop.util.ReflectionUtils;import java.io.*; import java.net.URI;/**** 将本地文件系统的文件通过java-API写入到HDFS文件并且写入时使用压缩*/ public class CopyFileFromLocal {/**** param args 两个参数 C:\test\01_018分钟.mp4 hdfs://node01:8020/copyFromLocal/01_018分钟.bz2* throws ClassNotFoundException*/public static void main(String[] args) throws ClassNotFoundException {//压缩相关//压缩类//HDFS读写的配置文件Configuration conf new Configuration();BZip2Codec codec new BZip2Codec();codec.setConf(conf);String source args[0]; //linux或windows中的文件路徑,demo存在一定数据String destinationhdfs://node01:8020/copyFromLocal/01_018分钟.bz2;//HDFS的路徑InputStream in null;try {in new BufferedInputStream(new FileInputStream(source));FileSystem fs FileSystem.get(URI.create(destination),conf);//调用Filesystem的create方法返回的是FSDataOutputStream对象//该对象不允许在文件中定位因为HDFS只允许一个已打开的文件顺序写入或追加OutputStream out fs.create(new Path(destination));//对输出流的数据压缩CompressionOutputStream compressedOut codec.createOutputStream(out);//流拷贝IOUtils.copyBytes(in, compressedOut, 4096, true);} catch (FileNotFoundException e) {System.out.println(exception);e.printStackTrace();} catch (IOException e) {System.out.println(exception1);e.printStackTrace();}} }扩展阅读 《Hadoop权威指南》 5.2章节 压缩HDFS文件压缩 10. 小文件治理 10.1 HDFS不适合存储小文件 NameNode存储着文件系统的元数据每个文件、目录、块大概有150字节的元数据NN内存有限因此HDFS存储文件数量的也有上限如果小文件过多则会造成NN的压力过大且HDFS能存储的数据总量也会变小 10.2 HAR文件方案10分钟 此方案本质启动mr程序所以需要启动yarn 用法hadoop archive -archiveName .har -p [-r ]* # 创建archive文件/testhar有两个子目录th1、th2两个子目录中有若干文件 hadoop archive -archiveName test.har -p /testhar -r 3 th1 th2 /outhar # 原文件还存在需手动删除# 查看archive文件 hdfs dfs -ls -R har:///outhar/test.har# 解压archive文件 # 方式一 hdfs dfs -cp har:///outhar/test.har/th1 hdfs:/unarchivef1 # 顺序解压 hadoop fs -ls /unarchivef1 # 方式二 hadoop distcp har:///outhar/test.har/th1 hdfs:/unarchivef2 # 并行解压效率高启动MR10.3 Sequence Files方案 !!! SequenceFile文件主要由一条条record记录组成具体结构如上图 一个SequenceFile首先有一个4字节的header文件版本号接着是若干record记录每个record是键值对形式的键值类型是可序列化类型如IntWritable、Text记录间会随机的插入一些同步点sync marker用于方便定位到记录边界 SequenceFile文件可以作为小文件的存储容器 每条record保存一个小文件的内容小文件名作为当前record的键小文件的内容作为当前record的值如10000个100KB的小文件可以编写程序将这些文件放到一个SequenceFile文件。 一个SequenceFile是可分割的所以MapReduce可将文件切分成块每一块独立操作。不像HARSequenceFile支持压缩。记录的结构取决于是否启动压缩 支持两类压缩 不压缩NONE如上图压缩RECORD如上图压缩BLOCK如下图①一次性压缩多条记录②每一个新块Block开始处都需要插入同步点 在大多数情况下以block注意指的是SequenceFile中的block为单位进行压缩是最好的选择因为一个block包含多条记录利用record间的相似性进行压缩压缩效率更高把已有的数据转存为SequenceFile比较慢。比起先写小文件再将小文件写入SequenceFile一个更好的选择是直接将数据写入一个SequenceFile文件省去小文件作为中间媒介. 向SequenceFile写入数据 package com.kaikeba.hadoop.sequencefile;import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IOUtils; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.SequenceFile; import org.apache.hadoop.io.Text; import org.apache.hadoop.io.compress.BZip2Codec;import java.io.IOException; import java.net.URI;public class SequenceFileWriteNewVersion {//模拟数据源数组中一个元素表示一个文件的内容private static final String[] DATA {The Apache Hadoop software library is a framework that allows for the distributed processing of large data sets across clusters of computers using simple programming models.,It is designed to scale up from single servers to thousands of machines, each offering local computation and storage.,Rather than rely on hardware to deliver high-availability, the library itself is designed to detect and handle failures at the application layer,o delivering a highly-available service on top of a cluster of computers, each of which may be prone to failures.,Hadoop Common: The common utilities that support the other Hadoop modules.};public static void main(String[] args) throws IOException {//输出路径要生成的SequenceFile文件名String uri hdfs://node01:8020/writeSequenceFile;Configuration conf new Configuration();FileSystem fs FileSystem.get(URI.create(uri), conf);//向HDFS上的此SequenceFile文件写数据Path path new Path(uri);//因为SequenceFile每个record是键值对的//指定key类型IntWritable key new IntWritable(); //key数字 - int - IntWritable//指定value类型Text value new Text();//value - String - Text//创建向SequenceFile文件写入数据时的一些选项//要写入的SequenceFile的路径SequenceFile.Writer.Option pathOption SequenceFile.Writer.file(path);//record的key类型选项SequenceFile.Writer.Option keyOption SequenceFile.Writer.keyClass(IntWritable.class);//record的value类型选项SequenceFile.Writer.Option valueOption SequenceFile.Writer.valueClass(Text.class);//SequenceFile压缩方式NONE | RECORD | BLOCK三选一//方案一RECORD、不指定压缩算法 // SequenceFile.Writer.Option compressOption SequenceFile.Writer.compression(SequenceFile.CompressionType.RECORD); // SequenceFile.Writer writer SequenceFile.createWriter(conf, pathOption, keyOption, valueOption, compressOption);//方案二BLOCK、不指定压缩算法 // SequenceFile.Writer.Option compressOption SequenceFile.Writer.compression(SequenceFile.CompressionType.BLOCK); // SequenceFile.Writer writer SequenceFile.createWriter(conf, pathOption, keyOption, valueOption, compressOption);//方案三使用BLOCK、压缩算法BZip2Codec压缩耗时间//再加压缩算法BZip2Codec codec new BZip2Codec();codec.setConf(conf);SequenceFile.Writer.Option compressAlgorithm SequenceFile.Writer.compression(SequenceFile.CompressionType.RECORD, codec);//创建写数据的Writer实例SequenceFile.Writer writer SequenceFile.createWriter(conf, pathOption, keyOption, valueOption, compressAlgorithm);for (int i 0; i 100000; i) {//分别设置key、value值key.set(100000 - i);value.set(DATA[i % DATA.length]); //%取模 3 % 3 0;System.out.printf([%s]\t%s\t%s\n, writer.getLength(), key, value);//在SequenceFile末尾追加内容writer.append(key, value);}//关闭流IOUtils.closeStream(writer);} }命令查看SequenceFile内容 hadoop fs -text /writeSequenceFile读取SequenceFile文件 package com.kaikeba.hadoop.sequencefile;import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IOUtils; import org.apache.hadoop.io.SequenceFile; import org.apache.hadoop.io.Writable; import org.apache.hadoop.util.ReflectionUtils;import java.io.IOException;public class SequenceFileReadNewVersion {public static void main(String[] args) throws IOException {//要读的SequenceFileString uri hdfs://node01:8020/writeSequenceFile;Configuration conf new Configuration();Path path new Path(uri);//Reader对象SequenceFile.Reader reader null;try {//读取SequenceFile的Reader的路径选项SequenceFile.Reader.Option pathOption SequenceFile.Reader.file(path);//实例化Reader对象reader new SequenceFile.Reader(conf, pathOption);//根据反射求出key类型对象Writable key (Writable)ReflectionUtils.newInstance(reader.getKeyClass(), conf);//根据反射求出value类型对象Writable value (Writable)ReflectionUtils.newInstance(reader.getValueClass(), conf);long position reader.getPosition();System.out.println(position);while (reader.next(key, value)) {String syncSeen reader.syncSeen() ? * : ;System.out.printf([%s%s]\t%s\t%s\n, position, syncSeen, key, value);//移动到下一个record开头的位置position reader.getPosition(); // beginning of next record}} finally {IOUtils.closeStream(reader);}} }11. 文件快照10分钟 11.1 什么是快照 快照比较常见的应用场景是数据备份以防一些用户错误或灾难恢复快照snapshots是HDFS文件系统的只读的、某时间点的拷贝可以针对某个目录或者整个文件系统做快照创建快照时block块并不会被拷贝。快照文件中只是记录了block列表和文件大小不会做任何数据拷贝 11.2 快照操作 允许快照 允许一个快照目录被创建。如果这个操作成功完成这个目录就变成snapshottable 用法hdfs dfsadmin -allowSnapshot hdfs dfsadmin -allowSnapshot /wordcount禁用快照 用法hdfs dfsadmin -disallowSnapshot hdfs dfsadmin -disallowSnapshot /wordcount创建快照(snapshotDir必须是snapshottable) 用法hdfs dfs -createSnapshot [] #注意先将/wordcount目录变成允许快照的 hdfs dfs -createSnapshot /wordcount wcSnapshot查看快照 hdfs dfs -ls /wordcount/.snapshot重命名快照 这个操作需要拥有snapshottabl目录所有者权限 用法hdfs dfs -renameSnapshot hdfs dfs -renameSnapshot /wordcount wcSnapshot newWCSnapshot用快照恢复误删除数据 HFDS的/wordcount目录文件列表如下 误删除/wordcount/edit.xml文件 hadoop fs -rm /wordcount/edit.xml恢复数据 hadoop fs -cp /wordcount/.snapshot/newWCSnapshot/edit.xml /wordcount删除快照 这个操作需要拥有snapshottabl目录所有者权限 用法hdfs dfs -deleteSnapshot hdfs dfs -deleteSnapshot /wordcount newWCSnapshot拓展总结 HDFS存储地位 block块为什么设置的比较大(面试) 磁盘基础知识 盘片platter、磁头head、磁道track、扇区sector、柱面cylinder为了最小化寻址开销从磁盘传输数据的时间明显大于定位这个块开始位置所需的时间 问块的大小是不是设置的越大越好呢 扩展阅读《HDFS新特性》 参考书籍《Hadoop权威指南 第4版》 总结
http://www.w-s-a.com/news/30858/

相关文章:

  • 网站开发实训h5总结个人网站注册平台要多少钱
  • 空白网站建设wordpress高亮代码过长
  • 盐城 网站开发什么叫做门户网站
  • 广东快速做网站公司哪家好本地建wordpress
  • dedecms如何做网站贵阳seo计费管理
  • 企业网站设计一般多少钱呼和浩特最好的互联网公司
  • 黄浦专业做网站海南网站策划
  • 网站开发工程师有证书考试吗织梦cms是免费的吗
  • 电子商务网站建设需要学什么门户网站推广介绍方案
  • 网站里的专题页面wordpress查询数据库结构
  • WordPress子站站群网站建设代码生成器
  • 怎么攻击织梦网站甘肃省最新消息今天
  • 赣州哪里可以做网站看装修案例的网站
  • 旅游网站专业化建设的要点php 手机网站 模板
  • wordpress百度站长主动推送长春火车站官网
  • 比较好的响应式网站wordpress博客增加音乐页面
  • 广告公司出售家具 税率江门做网站seo的
  • 网站设计建议建设商务网站作用
  • 网站策划的最终体现是什么模板网站建设流程图
  • 网站设计与开发技术教程十度公司做网站怎么样
  • 企业网站推广方案在哪里智慧团建登录入口官网手机版
  • google网页版入口seo索引擎优化
  • 东乡做网站常州网络公司联系方式
  • 做网站激励语家居装饰网站设计论文
  • 镜像的网站怎么做排名无极网站建设质量
  • 奉贤集团公司网站建设小工具文本wordpress
  • 不用代码做网站网站建设和运行费用
  • 阜阳网站开发招聘网站建设合作协议申请
  • 电子配件 技术支持 东莞网站建设wordpress 生成html代码
  • 网站用免费空间好不好网站建设的视频