5Hadoop云盘应用实践资料.docx
- 文档编号:7092536
- 上传时间:2023-01-17
- 格式:DOCX
- 页数:20
- 大小:1.33MB
5Hadoop云盘应用实践资料.docx
《5Hadoop云盘应用实践资料.docx》由会员分享,可在线阅读,更多相关《5Hadoop云盘应用实践资料.docx(20页珍藏版)》请在冰豆网上搜索。
5Hadoop云盘应用实践资料
Hadoop云盘实践
1、实验目的
1、熟悉HDFS(HadoopDistributedFileSystem)的基本原理
2、掌握HDFS的特点、基本操作、常用API及读写数据流等。
2、实验原理
1、HDFS的主要设计理念
1.1、存储超大文件
这里的“超大文件”是指几百MB、GB甚至TB级别的文件。
1.2、最高效的访问模式是一次写入、多次读取(流式数据访问)
HDFS存储的数据集作为hadoop的分析对象。
在数据集生成后,长时间在此数据集上进行各种分析。
每次分析都将设计该数据集的大部分数据甚至全部数据,因此读取整个数据集的时间延迟比读取第一条记录的时间延迟更重要。
1.3、运行在普通廉价的服务器上
HDFS设计理念之一就是让它能运行在普通的硬件之上,即便硬件出现故障,也可以通过容错策略来保证数据的高可用。
2、HDFS的忌讳
2.1、将HDFS用于对数据访问要求低延迟的场景
由于HDFS是为高数据吞吐量应用而设计的,必然以高延迟为代价。
2.2、存储大量小文件
HDFS中元数据(文件的基本信息)存储在namenode的内存中,而namenode为单点,小文件数量大到一定程度,namenode内存就吃不消了。
3、HDFS基本概念
数据块(block):
大文件会被分割成多个block进行存储,block大小默认为64MB。
每一个block会在多个datanode上存储多份副本,默认是3份。
namenode:
namenode负责管理文件目录、文件和block的对应关系以及block和datanode的对应关系。
datanode:
datanode就负责存储了,当然大部分容错机制都是在datanode上实现的。
4、HDFS基本架构图
图中有几个概念需要介绍一下
Rack是指机柜的意思,一个block的三个副本通常会保存到两个或者两个以上的机柜中(当然是机柜中的服务器),这样做的目的是做防灾容错,因为发生一个机柜掉电或者一个机柜的交换机挂了的概率还是蛮高的。
5、HDFS写文件流程
6、HDFS读文件流程
3、实验内容
1、开发环境的搭建
2、云盘实例开发
4、实验步骤
本实验以unbutu14.04,hadoop2.20集群为前提进行实验。
Hadoop集群ip及角色分配如下
10.31.44.117master(namenode)
10.31.44.200slaver1(datanode)
10.31.44.201slaver2(datanode)
第一部分:
云盘实践项目实验UI设计要求
云盘实践项目主要是为了让大家掌握HDFS文件操作基本知识和API的使用,故对UI效果要求不高,重在实现功能。
源码最终实现效果如下图:
第二部分:
HDFS开发环境的搭建
在云盘实际开发项目中,本人是在win7系统下,使用eclipse进行HDFS开发。
所以这里搭建的环境仍然以实际项目中win7-64位操作系统、eclipse为开发环境进行试验。
对于eclipse的具体安装就不在介绍,eclipse版本比较多对于HDFS的开发一般都是支持的,我曾经一直开发Android应用和底层项目,所以这里用的eclipse是google发型的adt-bundle-windows-x86_64-201403,其实作为开发工具这些都是无关紧要的。
下面主要讲解eclipse使用插件hadoop-eclipse-plugin-2.2.0.jar开发HDFS环境配置。
1、下载eclipse开发hadoop2.20MapReduce插件hadoop-eclipse-plugin-2.2.0.jar
提供一个网址免费下载链接:
将下载好的插件放入eclipse安装目录下的dropins文件夹中。
放置好之后,重启eclipse,按照1、2、3进行操作,如下图
紧接着如下图进行如下操作:
以上步骤完成后,会在eclipse左边出现DFSXX目录可以进行如下操作:
此时将可以看到HDFS文件存储结构,并可以尝试进行上传,下载创建等操作,如能正常操作则至此HadoopHDFS开发平台搭建完毕。
下面创建做一个demo工程看看是否能正常创建MapReduce工程。
至此我们可以看到工程创建完成,效果图如下:
第三部分:
HDFS云盘实例开发
基本设计思路
作为云盘,我们主要是运用hadoop分布式存储系统特性,实现数据的上传、下载、删除主要功能,当然还有其他的服务包括私有云分享,公有云共享等功能。
在这里我们主要讲解云盘实践中文件的操作,即是HDFS基本操作、常用API及读写数据流。
从功能上来说,本实验主要包括登录、注册、上传、下载、删除、重命名,6个模块。
从涉及到HDFS技术方面分析,主要涉及HDFS基本API操作,读写数据流。
本实验的基本思路如下图:
云盘工程目录结构如下:
基本操作(上传、下载、重命名、删除)
下面,从hdfs.java文件里面剪切出来部分代码,讲解云盘项目对分布式文件系统的操作的基本方法。
如下图
下面这些代码是连接分布式文件系统必须的一段代码,可以根据注释详细了解分析:
Configurationconf=newConfiguration();//?
?
?
?
?
?
//?
?
?
?
HDFS?
?
conf.set("fs.default.name","hdfs:
//10.31.44.117:
9000");
//?
?
?
?
?
?
?
?
?
PathdelefPath=newPath(hdfspath);
//?
?
HDFS?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
FileSystemhdfs=delefPath.getFileSystem(conf);
下面贴出云盘实践项目中文件处理核心代码hdfs.java(这里面包含了文件的下载、上传、删除、移动、新建文件夹等方法),通过注释的方式进行相关知识的介绍。
hdfs.java具体代码如下
packagehdfs;
importjava.io.FileOutputStream;
importjava.io.IOException;
importjava.io.OutputStream;
import.URI;
importorg.apache.hadoop.conf.Configuration;
importorg.apache.hadoop.fs.FSDataInputStream;
importorg.apache.hadoop.fs.FileStatus;
importorg.apache.hadoop.fs.FileSystem;
importorg.apache.hadoop.fs.Path;
publicclasshdfs{
privatestaticintfilesnum;
/*测试用例
*publicstaticvoidmain(String[]args)throwsException{String[]str=
*listAll("hdfs:
//10.31.44.117:
9000/usr");for(inti=0;i *i++){System.out.println(str[i]);}} */ /** *? ? ? ? ? * *@paramhdfspath *@return *@throwsIOException */ publicstaticbooleanremoveFile(Stringhdfspath)throwsIOException{ Configurationconf=newConfiguration();//? ? ? ? ? ? //? ? ? ? HDFS? ? conf.set("fs.default.name","hdfs: //10.31.44.117: 9000"); //? ? ? ? ? ? ? ? ? PathdelefPath=newPath(hdfspath); //? ? HDFS? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? FileSystemhdfs=delefPath.getFileSystem(conf); booleanretval=false; if(hdfs.exists(delefPath)){ retval=hdfs.delete(delefPath,true); System.out.println("? ? ? ? ? ? "); } returnretval; } /** *? ? ? ? ? ? ? ? * *@paramoldPath *@paramnewPath *@return *@throwsIllegalArgumentException *@throwsIOException */ publicstaticbooleanreNameFile(StringoldPath,StringnewPath) throwsIllegalArgumentException,IOException{ Configurationconf=newConfiguration(); conf.set("fs.default.name","hdfs: //10.31.44.117: 9000"); FileSystemfs=FileSystem.get(conf); booleanretval=fs.rename(newPath(oldPath),newPath(newPath));//? ? ? fs.close(); returnretval; } /** *? ? ? ? * *@paramhdfsDir *@return *@throwsIOException */ @SuppressWarnings("deprecation") publicstaticbooleanremoveDir(StringhdfsDir)throwsIOException{ Configurationconf=newConfiguration(); conf.set("fs.default.name","hdfs: //10.31.44.117: 9000"); FileSystemfs=FileSystem.get(conf); booleanretval=fs.delete(newPath(hdfsDir)); fs.close(); returnretval; } /** *? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? : ? ? ? ? ? ? ? ? ? ? ? ? * *@paramdir *@return *@throwsIOException */ publicstaticFileStatus[]getAllFileStatus(Stringdir)throwsIOException{ Configurationconf=newConfiguration(); conf.set("fs.default.name","hdfs: //10.31.44.117: 9000"); FileSystemfs=FileSystem.get(conf); FileStatus[]stats=fs.listStatus(newPath(dir)); returnstats; } /** *? ? ? ? ? * *@paramoldPath *@paramnewPath *@return *@throwsIOException */ publicstaticbooleanmoveFileTo(StringoldPath,StringnewPath) throwsIOException{ Configurationconf=newConfiguration(); conf.set("fs.default.name","hdfs: //10.31.44.117: 9000"); FileSystemfs=FileSystem.get(conf); fs.moveFromLocalFile(newPath(oldPath),newPath(newPath)); fs.close(); returntrue; } /** *? ? ? ? * *@paramoldPath *@paramnewPath *@return *@throwsIOException */ publicstaticbooleancopyFileTo(StringoldPath,StringnewPath) throwsIOException{ Configurationconf=newConfiguration(); conf.set("fs.default.name","hdfs: //10.31.44.117: 9000"); FileSystemfs=FileSystem.get(conf); fs.copyToLocalFile(newPath(oldPath),newPath(newPath)); fs.close(); returntrue; } //? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? publicstaticbooleanisPathExists(StringhdfsPath)throwsIOException{ Configurationconf=newConfiguration(); conf.set("fs.default.name","hdfs: //10.31.44.117: 9000"); FileSystemfs=FileSystem.get(conf); booleanexists=fs.exists(newPath(hdfsPath)); if(! exists){ fs.mkdirs(newPath(hdfsPath)); returnfalse; } returntrue; } /** *? ? ? ? ? * *@paramhdfsPath *@paramdirName *@return *@throwsIOException */ publicstaticintcreateDir(StringhdfsPath,StringdirName) throwsIOException{ Configurationconf=newConfiguration(); conf.set("fs.default.name","hdfs: //10.31.44.117: 9000"); FileSystemfs=FileSystem.get(conf); System.out.println("? ? ? ? ###0! "+hdfsPath); Stringpath=hdfsPath+dirName; System.out.println("? ? ? ? ###00! "+path); booleanexists=fs.exists(newPath(path)); if(! exists){ System.out.println("? ? ? ? ###1! "+path); booleanresult=fs.mkdirs(newPath(path+dirName)); System.out.println("? ? ? ? ###2! "+result); if(result==true) return0; else return1; }else{ System.out.println("? ? ? ? ? ? ? ? ! "); return-1; } } /** *? ? ? ? * *@paramhdfsPath *@paramfilePath *@return *@throwsIOException */ publicstaticbooleanuploadFile(StringhdfsPath,StringfilePath) throwsIOException{ Configurationconf=newConfiguration(); conf.set("fs.default.name","hdfs: //10.31.44.117: 9000"); FileSystemhdfs=FileSystem.get(conf); Pathsrc=newPath(filePath); Pathdst=newPath(hdfsPath); hdfs.copyFromLocalFile(src,dst); System.out.println("UpLoadDone\n"); hdfs.close(); returntrue; } /** *? ? ? ? * *@paramhdfsPath *@paramfilePath *@return *@throwsIOException */ publicstaticbooleandownLoadFile(StringhdfsPath,StringfilePath) throwsIOException{ Configurationconf=newConfiguration(); PathhadoopPath=newPath(hdfsPath); FileSystemfs=FileSystem.get(URI.create(hdfsPath),conf); FSDataInputStreamhdfsInStream=fs.open(hadoopPath); OutputStreamout=newFileOutputStream(filePath); byte[]ioBuffer=newbyte[1024]; intreadLen=hdfsInStream.read(ioBuffer); while(-1! =readLen){ out.write(ioBuffer,0,readLen); readLen=hdfsInStream.read(ioBuffer); } System.out.println("DownLoadDone! "); out.close(); hdfsInStream.close(); fs.close(); returntrue; } /** *? ? ? ? ? ? * *@paramdir *@return *@throwsIOException */ publicstaticString[]listAll(Stringdir)throwsIOException{ Configurationconf=newConfiguration(); conf.set("fs.default.name","hdfs: //10.31.44.117: 9000"); FileSystemfs=FileSystem.get(conf); FileStatus[]stats=fs.listStatus(newPath(dir)); String[]dfname=newString[stats.length]; filesnum=stats.length; for(inti=0;i dfname[i]=stats[i].getPath().toString(); } fs.close(); returndfname; } publicstaticbooleandownloadDir(StringhdfsDir,StringfileDir){ returntrue; } publicstaticbooleanuploadDir(StringhdfsDir,StringfileDir){ returntrue; } } 注册功能 登录,注册采用的是Mysql数据库 1、创建数据库: user 2、表名: userinfor 3、字段: uName(varchar),uPasswd(varchar) 具体设计,本人使用的是数据库管理工具NavicatPremium,建议学生手动使用命令行进行创建,具体效果图如下: 注册功能主要实现了,在Hadoop分布式文件系统中创建用户文件夹,如用户名为: 123456,那么注册成功后,在分布式文件系统中就创建123456这个文件夹,作为用户私有存储访问目录,每个用户的目录都是其用户名,操作权限仅在此目录下,这就是用户的云盘。 登录功能 登录功能主要是为了获得用户云盘路径,即用户的的文件,用户在此文件下可以进行上传、删除、重命名、创建文件夹功能。 云盘实践总结 本实验在核心功能的基础上进行讲解HDFS文件的操作,在实验代码中,希望能够给出的hdfs.java代码对Hadoop分布式文件操作方法有一定的了解。 另外细心的同学会发现我们导入了hadoop所有的.jar文件,其实这些是没有必要的,但是其架包较多,对hadoop有一定了解之后就知道用那些了,关键的仅需要以下几个就行:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Hadoop 应用 实践 资料