Hadoop,HDFS原理及操作 |
您所在的位置:网站首页 › 分布式的原理 › Hadoop,HDFS原理及操作 |
今天来聊下Hadoop和HDFS。 1、Hadoop介绍 1.1、Hadoop是什么?Hadoop是一个由Apache基金会所开发的分布式系统基础架构。主要解决海量数据的存储和海量数据的分析计算问题。 1.2、Hadoop发展历史Hadoop的雏形是由Doug Cutting等人借鉴Google在大数据方面的三篇论文后(GFS->HDFS,MapReduce->MR,BigTable->HBase),用了2年业余时间实现的,后来被引入Apache基金会立项,2006年3月Hadoop正式诞生,标志着大数据时代来临。名字来源于Doug Cutting儿子的玩具大象。 Apache版本是最原始最基础的版本,开源免费。 Cloudera内部集成了很多大数据框架,对应产品CDH,收费,每年每个节点10000美元。 Hortonworks文档较好,对应产品HDP,目前已被Cloudera公司收购。 1.4、Hadoop的优势 高可靠性:Hadoop底层维护多个数据副本,即使Hadoop某个计算元素或存储出现故障,也不会导致数据丢失。高扩展性:在集群间分配任务数据,可方便的扩展数以千计的节点。高效性:在MapReduce的思想下,Hadoop是并行工作的,以加快任务处理速度。高容错性:能够自动将失败的任务重新分配。 1.5、Hadoop的组成Hadoop2.x和3.x都由HDFS、MapReduce和Yarn组成。HDFS负责数据存储,MapReduce负责计算,Yarn负责资源调度。 Hadoop各组成介绍: HDFS:HDFS由NameNode、DataNode和Secondary NameNode组成。NameNode存储文件的元数据,DataNode存储文件块数据,Secondary NameNode每隔一段时间对NameNode元数据备份。MapReduce:MapReduce将计算过程分成两个阶段,Map阶段和Reduce阶段,Map阶段并行处理输入数据,Reduce阶段对Map结果进行汇总。Yarn:Yarn由ResourceManager、NodeManager、ApplicationMaster和Container组成。 2、HDFS介绍 2.1、HDFS概述随着数据量越来越大,需要一种系统来管理多台机器上的文件,就是分布式文件管理系统,其中HDFS只是分布式文件管理系统的一种。 HDFS全称是Hadoop Distributed File System,它是一个文件系统,用来存储文件,通过目录树来定位文件,其次它是分布式的,由很多服务器联合起来实现功能。 由于HDFS是分布式的,不难想到它的使用场景,适合一次写入,多次读出的场景,且不支持文件的修改。 HDFS优点:高容错性、适合处理大数据、可构建在廉价机器上。 HDFS缺点:不适合低延时数据访问(比如毫秒级存储数据做不到)、无法高效的对大量小文件进行存储、不支持并发写入和文件随机修改(仅支持数据追加)。 HDFS组织架构如下: HDFS中的文件在物理上是分块存储的,块的大小可以通过配置参数(dfs.blocksize)来规定,默认大小在Hadoop2.x版本中是128M,旧版本中是64M。 根据经验公式当寻址时间为传输时间的1%时为最佳状态,那么寻址时间是10ms时传输时间就是1s,而目前磁盘的传输速率普遍为100MB/s,得到block大小为100MB,取整数就是128M(对于计算机而言的整数)。 块太小会增加寻址时间。块太大则从磁盘传输数据的时间会明显大于定位块开始位置的时间,导致处理块数据速度变慢。 HDFS块的大小设置主要取决于磁盘传输速度。 2.2、HDFS的Shell操作 2.2.1、基本语法 bin/hadoop fs 具体命令 bin/hdfs dfs 具体命令有环境变量可不用加路径bin/。 2.2.2、常用命令实操 hadoop fs -help rm # 输出这个命令参数上传: hadoop fs -moveFromLocal ./test01.txt /files # 从本地剪切粘贴到HDFS hadoop fs -copyFromLocal ./test02.txt /files # 从本地拷贝到HDFS hadoop fs -appendToFile ./test03.txt /files/test02.txt # 追加一个文件到已经存在的文件末尾 hadoop fs -put ./test04.txt /files # 等同于copyFromLocal下载: hadoop fs -copyToLocal /files/test01.txt ./ # 从HDFS拷贝到本地 hadoop fs -get /files/test02.txt ./ # 等同于copyToLocal hadoop fs -getmerge /files/* ./merge.txt # 合并下载多个文件HDFS直接操作: hadoop fs -ls / # 显示目录树 hadoop fs -mkdir -p /files/create/ # 在HDFS上创建目录 hadoop fs -cat /files/test01.txt # 显示文件内容 hadoop fs -chmod 777 /files/test02.txt # 修改文件所属权限 hadoop fs -chown dgf:dgf /files/test03.txt # 修改文件拥有者 hadoop fs -cp /files/test04.txt /files/create/ # 从HDFS一个路径拷贝到另一个路径 hadoop fs -mv /files/test05.txt /files/create/ # 在HDFS目录中移动文件 hadoop fs -tail /files/test06.txt # 显示一个文件的末尾 hadoop fs -rm /files/test07.txt # 删除文件或文件夹 hadoop fs -rmdir /test # 删除空目录 hadoop fs -du -s -h /files/create # 只统计文件夹的大小信息 hadoop fs -du -h /files/create # 统计文件夹下各文件的大小信息 hadoop fs -setrep 6 /files/test08.txt # 设置HDFS中文件的副本数量 # 这里设置的副本数只是记录在NameNode的元数据中,是否真有这么多副本还得看DataNode的数量 2.3、HDFS客户端操作 2.3.1、客户端环境准备将windows依赖拷贝到系统,然后配置环境变量,最后重启下电脑。 创建Maven工程并添加依赖: junit junit 4.12 org.apache.logging.log4j log4j-slf4j-impl 2.16.0 org.apache.hadoop hadoop-client 3.1.3创建HdfsClient类: public class HdfsClient{ @Test public void testMkdirs() throws IOException, InterruptedException, URISyntaxException{ //1.获取文件系统 Configuration configuration = new Configuration(); //配置在集群上运行 //configuration.set("fs.defaultFS", "hdfs://hadoop1:9820"); //FileSystem fs = FileSystem.get(configuration); FileSystem fs = FileSystem.get(new URI("hdfs://hadoop1:9820"), configuration, "dgf"); //2.创建目录 fs.mkdirs(new Path("/files/create/files")); //3.关闭资源 fs.close(); } }配置用户名称并执行程序: HDFS文件上传: @Test public void testCopyFromLocalFile() throws IOException, InterruptedException, URISyntaxException { //1.获取文件系统 Configuration configuration = new Configuration(); configuration.set("dfs.replication", "2"); FileSystem fs = FileSystem.get(new URI("hdfs://hadoop1:9820"), configuration, "dgf"); //2.上传文件 fs.copyFromLocalFile(new Path("e:/test.txt"), new Path("/test.txt")); //3.关闭资源 fs.close(); System.out.println("over"); }参数优先级:客户端代码>工程配置文件>服务器默认配置。 HDFS文件下载: @Test public void testCopyToLocalFile() throws IOException, InterruptedException, URISyntaxException{ //1.获取文件系统 Configuration configuration = new Configuration(); FileSystem fs = FileSystem.get(new URI("hdfs://hadoop1:9820"), configuration, "dgf"); //2.执行下载操作 //boolean delSrc 指是否将原文件删除 //Path src 指要下载的文件路径 //Path dst 指将文件下载到的路径 //boolean useRawLocalFileSystem 是否开启文件校验 fs.copyToLocalFile(false, new Path("/test.txt"), new Path("e:/test.txt"), true); //3.关闭资源 fs.close(); }通过流向HDFS上传和下载文件: //上传 @Test public void test01() throws Exception { //创建输入流读取本地文件的内容 FileInputStream fis = new FileInputStream(new Path("E:\\test.txt")); //创建输出流将文件写到HDFS上 FSDataOutputStream fos = fs.create(new Path("/test.txt")); //文件对拷 IOUtils.copyBytes(fis,fos,2000); //关闭流 IOUtils.closeStream(fis); IOUtils.closeStream(fos); } //下载 @Test public void test02() throws Exception { FSDataInputStream fis = fs.open(new Path("/test.txt")); FileOutputStream fos = new FileOutputStream(new Path("E://test.txt")); //最后一个参数 :true就会关流 false不会关流 IOUtils.copyBytes(fis,fos,2000,true); } 2.4、HDFS的数据流 2.4.1、HDFS读数据流程在HDFS写数据的过程中,NameNode会选择距离待上传数据最近距离的DataNode接受数据。下面介绍下节点距离的计算。 副本节点的选择: 以上介绍了HDFS的读写流程和实际操作命令,关于HDFS的组成这里先不做介绍。 今天的内容就到这里,下篇见。 更多内容可以关注公众号「大数据技术开发」,与你分享我的成长历程与技术感悟~ |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |