Hadoop HDFS最佳实践攻略_第1页
Hadoop HDFS最佳实践攻略_第2页
Hadoop HDFS最佳实践攻略_第3页
Hadoop HDFS最佳实践攻略_第4页
Hadoop HDFS最佳实践攻略_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 Hadoop HDFS最佳实践攻略本文主要帮您解决一下几个问题:HDFS是用来解决什么问题?怎么解决的?如何在命令行下操作HDFS?如何使用Java API来操作HDFS?在了解基本思路和操作方法后,进一步深究HDFS具体的读写数据流程学习并实践本文教程后,可以对HDFS有比较清晰的认识,并可以进行熟练操作,为后续学习Hadoop体系打好基础。目录:理论部分HDFS 基本原理文件读取、写入机制元数据管理思路实践部分安装实践环境Shell 命令行操作方式Java API操作方式一、HDFS基本原理HDFS(Hadoop Distribute File System)是一个分布式文件系统,是Ha

2、doop的重要成员。1、文件系统的问题文件系统是操作系统提供的磁盘空间管理服务,只需要我们制定把文件放到哪儿,从哪个路径读取文件就可以了,不用关心文件在磁盘上是如何存放的。当文件所需空间大于本机磁盘空间时,如何处理呢?一是加磁盘,但是加到一定程度就有限制了;二是加机器,用远程共享目录的方式提供网络化的存储,这种方式可以理解为分布式文件系统的雏形,可以把不同文件放入不同的机器中,空间不足了可继续加机器,突破了存储空间的限制。但这个方式有多个问题:单机负载可能极高例如某个文件是热门,很多用户经常读取这个文件,就使得次文件所在机器的访问压力极高。数据不安全如果某个文件所在的机器出现故障,这个文件就不

3、能访问了,可靠性很差。文件整理困难例如想把一些文件的存储位置进行调整,就需要看目标机器的空间是否够用,并且需要自己维护文件位置,如果机器非常多,操作就极为复杂。2、HDFS的解决思路HDFS是个抽象层,底层依赖很多独立的服务器,对外提供统一的文件管理功能,对于用户来讲,感觉就像在操作一台机器,感受不到HDFS下面的多台服务器。例如用户访问HDFS中的/a/b/c.mpg这个文件,HDFS负责从底层相应服务器中读取,然后返回给用户,这样用户只需和HDFS打交道,不关心这个文件是怎么存储的。例如用户需要保存一个文件/a/b/xxx.avi。HDFS首先会把这个文件进行分割,例如分为4块,然后分别放

4、到不同服务器上。这样做有个好处,不怕文件太大,并且读文件的压力不会全部集中在一台服务器上。但如果某台服务器坏了,文件就读不全了。HDFS为保证文件可靠性,会把每个文件块进行多个备份:块1:A B C块2:A B D块3:B C D块4:A C D这样文件的可靠性就大大增强了,即使某个服务器坏了,也可以完整读取文件。同时还带来一个很大的好处,就是增加了文件的并发访问能力,比如多个用户读取这个文件时,都要读块1,HDFS可以根据服务器的繁忙程度,选择从那台服务器读块1。3、元数据的管理HDFS中存了哪些文件?文件被分成了哪些块?每个块被放在哪台服务器上?这些都叫做元数据,这些元数据被抽象为一个目录

5、树,记录了这些复杂的对应关系。这些元数据由一个单独的模块进行管理,这个模块叫做NameNode。存放文件块的真实服务器叫做DataNode,所以用户访问HDFS的过程可以理解为:用户-HDFS-NameNode-DataNode4、HDFS优点容量可以线性扩展有副本机制,存储可靠性高,吞吐量增大有了NameNode后,用户访问文件只需指定HDFS上的路径二、HDFS实践经过上面介绍,可以对HDFS有个基本的了解,下面开始进行实际操作,在实践中更好的认识HDFS。1、安装实践环境您可以选择自己搭建环境,也可以使用打包好的Hadoop环境(版本2.7.3)这个Hadoop环境实际上是一个虚机镜像,

6、所以需要安装virtualbox虚拟机、vagrant镜像管理工具,和我的Hadoop镜像,然后用这个镜像启动虚机就可以了,下面是具体操作步骤:1)安装virtualbox下载地址:/wiki/Downloads2)安装vagrant因为官网下载较慢,我上传到了云盘Windows版链接:/s/1pKKQGHl密码:eykrMac版链接:/s/1slts9yt密码:aig4安装完成后,在命令行终端下就可以使用vagrant命令。3)下载Hadoop镜像链接:/s/1bpaisnd密码:pn6c4)启动加载Hadoop镜像vagrantboxadd自定义镜像名称镜像所在路径例如您想命名为Hadoo

7、p,镜像下载后的路径为d:hadoop.box,加载命令就是这样:vagrantboxaddhadoopd:hadoop.box创建工作目录,例如d:hdfstest。进入此目录,初始化cdd:hdfstestvagrantinithadoop启动虚机vagrant up启动完成后,就可以使用SSH客户端登录虚机了IP 端口 2222用户名 root密码 vagrant登录后使用命令ifconfig 查看本虚机的IP(如39),可以使用此IP和端口22登录了IP 39端口 22用户名 root密码 vagrantHadoop服务器环境搭建完成。2、Shell命令行操作登录Hadoop服务器后,

8、先启动HDFS,执行命令:start-dfs.sh查看帮助hdfsdfshelp显示目录信息-ls 后面是要查看的目录路径创建目录创建目录/testhdfsdfs-mkdir/test一次创建多级目录/aa/bbhdfsdfs-mkdir-p/aa/bb上传文件形式hdfsdfs-put本地路径hdfs中的路径实例(先创建好一个测试文件mytest.txt,内容随意,然后上传到/test)hadoop fs -put /mytest.txt /test显示文件内容hdfsdfs-cat/test/mytest.txt下载文件hdfsdfs-get/test/mytest.txt./mytest

9、2.txt合并下载先创建2个测试文件(log.access,log.error),内容随意,使用-put上传到/test目录下hdfsdfs-putlog.*/test然后把2个log文件合并下载到一个文件中hdfsdfs-getmerge/test/log.*./log查看本地log文件内容,应该包含log.access与log.error两个文件的内容。复制从HDFS的一个路径拷贝HDFS的另一个路径hdfsdfs-cp/test/mytest.txt/aa/mytest.txt.2验证hdfsdfs-ls/aa移动文件hdfsdfs-mv/aa/mytest.txt.2/aa/bb验证h

10、dfsdfs-ls/aa/bb应列出mytest.txt.2。删除hdfsdfs-rm-r/aa/bb/mytest.txt.2使用-r参数可以一次删除多级目录。验证hdfsdfs-ls/aa/bb应为空修改文件权限与Linux文件系统中的用法一样,修改文件所属权限-chgrp-chmod-chown示例hdfsdfs-chmod666/test/mytest.txthdfsdfs-chownsomeuser:somegrp/test/mytest.txt统计文件系统的可用空间hdfsdfs-df-h/统计文件夹的大小hdfsdfs-du-s-h/test3、Java API操作(1)环境配置

11、因为需要在本机链接Hadoop虚机服务器,所以需要配置Hadoop,使其可以被外部访问。先登录Hadoop虚机服务器,然后:1)查看本机IPipaddress例如IP为:392)修改文件:vi/usr/local/hadoop-2.7.3/etc/hadoop/core-site.xmlfs.defaultFShdfs:/localhost:9000把其中的localhost:9000修改为本机IP 39:90003)重新启动HDFS#停止stop-dfs.sh#启动start-dfs.sh(2)搭建开发环境1)新建项目目录hdfstest2)在项目目录下创建pom.xml内容:3)创建源码目

12、录src/main/java现在项目目录结构pom.xml!src main java(3)示例代码查看文件列表ls1)新建文件src/main/java/Ls.java列出/下的文件列表,及递归获取所有文件2)编译执行mvncompilemvnexec:java-Dexec.mainClass=Ls-Dexec.cleanupDaemonThreads=false创建目录mkdir在HDFS中创建目录/mkdir/a/b1)新建文件src/main/java/Mkdir.java2)编译执行mvncompilemvnexec:java-Dexec.mainClass=Mkdir-Dexec.

13、cleanupDaemonThreads=false3)在服务器中使用HDFS命令验证hdfsdfs-ls/mkdir上传文件put在当前项目目录下新建测试文件,上传到HDFS中的/mkdir1)在项目目录下创建测试文件testfile.txt,内容随意2)新建文件src/main/java/Put.java3)编译执行mvncompilemvnexec:java-Dexec.mainClass=Put-Dexec.cleanupDaemonThreads=false4)在服务器中使用HDFS命令验证hdfsdfs-ls/mkdirhdfsdfs-cat/mkdir/testfile.txt下

14、载文件get1)新建文件src/main/java/Get.java把HDFS中/mkdir/testle.txt下载到当前项目目录下2)编译执行mvncompilemvnexec:java-Dexec.mainClass=Get-Dexec.cleanupDaemonThreads=false3)查看项目目录下是否存在testle2.txt及其内容删除文件delete删除HDFS上之前上传的/mkdir/testle.txt1)新建文件src/main/java/Del.java2)编译执行mvncompilemvnexec:java-Dexec.mainClass=Del-Dexec.cl

15、eanupDaemonThreads=false3)在服务器中使用HDFS命令验证,检查testle.txt是否被删除hdfsdfs-ls/mkdir重命名rename把HDFS中的/mkdir/a重命名为/mkdir/a21)新建文件src/main/java/Rename.java2)编译执行mvncompilemvnexec:java-Dexec.mainClass=Rename-Dexec.cleanupDaemonThreads=false3)在服务器中使用HDFS命令验证hdfsdfs-ls/mkdir流方式读取文件部分内容上传一个文本文件,然后使用流方式读取部分内容保存到当前项目

16、目录。1)在服务器中创建一个测试文件test.txt,内容:123456789abcdefghijklmn上传到HDFShdfsdfs-puttest.txt/2)在本地项目中新建文件src/main/java/StreamGet.java2)编译执行mvncompilemvnexec:java-Dexec.mainClass=StreamGet-Dexec.cleanupDaemonThreads=false3)执行后查看项目目录下的test.txt.part26789abcdefghijklmn前面的12345已经被略过三、深入了解1、写入机制向HDFS中写入文件时,是按照块儿为单位的,c

17、lient会根据配置中设置的块儿的大小把目标文件切为多块,例如文件是300M ,配置中块大小值为128M,那么就分为3块儿。具体写入流程:client向namenode发请求,说想要上传文件namenode会检查目标文件是否存在、父目录是否存在,检查没有问题后返回确认信息client再发请求,问第一个block应该传到哪些datanode上namenode经过衡量,返回3个可用的datanode(A,B,C)client与A建立连接,A与B建立连接,B与C建立连接,形成一个pipeline传输管道建立完成后,client开始向A发送数据包,此数据包会经过管道一次传递到B和C当第一个block的

18、数据都传完以后,client再向namenode请求第二个block上传到哪些datanode,然后建立传输管道发送数据就这样,直到client把文件全部上传完成2、读取机制Client把要读取的文件路径发给namenode,查询元数据,找到文件块所在的datanode服务器Client直到了文件包含哪几块儿、每一块儿在哪些datanode上,就选择那些离自己进的datanode(在同一机房,如果有多个离着近的,就随机选择),请求简历socket流从datanode获取数据Client接收数据包,先本地缓存,然后写入目标文件直到文件读取完成3、NameNode机制通过对HDFS读写流程的了解,可以发现namenode是一个很重要的部分,它记录着整个HDFS系统的元数据,这些元数据是需要持久化的,要保存到文件中。Namenode还要承受巨大的访问量,client读写文件时都需要请求namenode,写文件时要修改元数据,读文件时要查询元数据。为了提高效率,namenode便将元数据加载到内存中,每次修改时,直接修改内存,而不是直接修改文件,同时会记录下操作日志,供后期修改文件时使用。这样,namenode对数据的管理就涉及到了3种存储形式:内存数据元数据文件操作日志文件namenode需要定期对元数据文件和日志文件进行整合,以保证文件中数据是新的,但

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论