向网站上传文件怎么做,如何把自己的网站推广出去,佛山品牌网站设计制作,云南响应式网站建设一.HDFS出现的背景 随着社会的进步#xff0c;需要处理数据量越来越多#xff0c;在一个操作系统管辖的范围存不下了#xff0c;那么就分配到更多的操作系统管理的磁盘中#xff0c;但是却不方便管理和维护—因此#xff0c;迫切需要一种系统来管理多台机器上的文件需要处理数据量越来越多在一个操作系统管辖的范围存不下了那么就分配到更多的操作系统管理的磁盘中但是却不方便管理和维护—因此迫切需要一种系统来管理多台机器上的文件于是就产生了分布式文件管理系统英文名成为DFSDistributed File System。 那么什么是分布式文件系统简而言之就是一种允许文件通过网络在多台主机上分享的文件系统可以让多个机器上的多个用户分享文件和存储空间。它最大的特点是“通透性”DFS让实际上是通过网络来访问文件的动作由用户和程序看来就像是访问本地的磁盘一般In other words,使用DFS访问数据你感觉不到是访问远程不同机器上的数据。 图1.一个典型的DFS示例 二.深入了解HDFS原理 作为Hadoop的核心技术之一HDFSHadoop Distributed File SystemHadoop分布式文件系统是分布式计算中数据存储管理的基础。它所具有的高容错、高可靠、高可扩展性、高吞吐率等特性为海量数据提供了不怕故障的存储也为超大规模数据集Large Data Set的应用处理带来了很多便利。 图2.Hadoop HDFS的LOGO 提到HDFS不得不说Google的GFS。正是Google发表了关于GFS的论文才有了HDFS这个关于GFS的开源实现。 2.1 设计前提与目标 1硬件错误是常态而不是异常最核心的设计目标—HDFS被设计为运行在众多的普通硬件上所以硬件故障是很正常的。因此错误检测并快速恢复是HDFS最核心的设计目标 2流式数据访问HDFS更关注数据访问的高吞吐量 3大规模数据集HDFS的典型文件大小大多都在GB甚至TB级别 4简单一致性模型一次写入多次读取的访问模式 5移动计算比移动数据更为划算对于大文件来说移动计算比移动数据的代价要低 2.2 HDFS的体系结构 HDFS是一个主/从Master/Slave式的结构如下图所示。 图3.HDFS的基本架构 从最终用户的角度来看它就像传统的文件系统一样可以通过目录路径对文件执行CRUD增删查改操作。但由于分布式存储的性质HDFS拥有一个NameNode和一些DataNodes。NameNode管理文件系统的元数据DataNode存储实际的数据。客户端通过同NameNode和DataNode的交互访问文件系统→客户端联系NameNode以获取文件的元数据而真正的I/O操作是直接和DataNode进行交互的。 下面我们再来看看HDFS的读操作和写操作的流程 ①读操作 图4.HDFS的读操作 客户端要访问一个文件首先客户端从NameNode中获得组成该文件数据块位置列表即知道数据块被存储在哪几个DataNode上然后客户端直接从DataNode上读取文件数据。在此过程中NameNode不参与文件的传输。 ②写操作 图5.HDFS的写操作 客户端首先需要向NameNode发起写请求NameNode会根据文件大小和文件块配置情况返回给Client它所管理部分DataNode的信息。最后Client开发库将文件划分为多个文件块根据DataNode的地址信息按顺序写入到每一个DataNode块中。 下面我们看看NameNode和DataNode扮演什么角色有什么具体的作用 1NameNode NameNode的作用是管理文件目录结构是管理数据节点的。NameNode维护两套数据一套是文件目录与数据块之间的关系另一套是数据块与节点间的关系。前一套是静态的是存放在磁盘上的通过fsimage和edits文件来维护后一套数据时动态的不持久化到磁盘每当集群启动的时候会自动建立这些信息。 2DataNode 毫无疑问DataNode是HDFS中真正存储数据的。这里要提到一点就是Block数据块。假设文件大小是100GB从字节位置0开始每64MB字节划分为一个Block以此类推可以划分出很多的Block。每个Block就是64MB也可以自定义设置Block大小。 3典型部署 HDFS的一个典型部署是在一个专门的机器上运行NameNode集群中的其他机器各运行一个DataNode。当然也可以在运行NameNode的机器上同时运行DataNode或者一个机器上运行多个DataNode一个集群中只有一个NameNode但是单NameNode存在单点问题在Hadoop 2.x版本之后解决了这个问题的设计大大简化了系统架构。 2.3 保障HDFS的可靠性措施 HDFS具备了较为完善的冗余备份和故障恢复机制可以实现在集群中可靠地存储海量文件。 1冗余备份HDFS将每个文件存储成一系列的数据块Block默认块大小为64MB可以自定义配置。为了容错文件的所有数据块都可以有副本默认为3个可以自定义配置。当DataNode启动的时候它会遍历本地文件系统产生一份HDFS数据块和本地文件对应关系的列表并把这个报告发送给NameNode这就是报告块BlockReport报告块上包含了DataNode上所有块的列表。 2副本存放HDFS集群一般运行在多个机架上不同机架上机器的通信需要通过交换机。通常情况下副本的存放策略很关键机架内节点之间的带宽比跨机架节点之间的带宽要大它能影响HDFS的可靠性和性能。HDFS采用一种称为机架感知Rack-aware的策略来改进数据的可靠性、可用性和网络带宽的利用率。在大多数情况下HDFS副本系数是默认为3HDFS的存放策略是将一个副本存放在本地机架节点上一个副本存放在同一个机架的另一个节点上最后一个副本放在不同机架的节点上。这种策略减少了机架间的数据传输提高了写操作的效率。机架的错误远远比节点的错误少所以这种策略不会影响到数据的可靠性和可用性。 图6.副本存放的策略 3心跳检测NameNode周期性地从集群中的每个DataNode接受心跳包和块报告NameNode可以根据这个报告验证映射和其他文件系统元数据。收到心跳包说明该DataNode工作正常。如果DataNode不能发送心跳信息NameNode会标记最近没有心跳的DataNode为宕机并且不会给他们发送任何I/O请求。 4安全模式 5数据完整性检测 6空间回收 7元数据磁盘失效 8快照HDFS目前还不支持 三.HDFS常用Shell操作 1列出文件目录hadoop fs -ls 目录路径 查看HDFS根目录下的目录hadoop fs -ls / 递归查看HDFS根目录下的目录hadoop fs -lsr / 2在HDFS中创建文件夹hadoop fs -mkdir 文件夹名称 在根目录下创建一个名称为di的文件夹 3上传文件到HDFS中hadoop fs -put 本地源路径 目标存放路径 将本地系统中的一个log文件上传到di文件夹中hadoop fs -put test.log /di *PS:我们通过Hadoop Shell上传的文件是存放在DataNode的Block数据块中的通过Linux Shell是看不到文件的只能看到Block。因此可以用一句话来描述HDFS把客户端的大文件存放在很多节点的数据块中。 4从HDFS中下载文件hadoop fs -get HDFS文件路径 本地存放路径 将刚刚上传的test.log下载到本地的Desktop文件夹中hadoop fs -get /di/test.log /home/hadoop/Desktop 5直接在HDFS中查看某个文件hadoop fs -text(-cat) 文件存放路径 在HDFS查看刚刚上传的test.log文件hadoop fs -text /di/test.log 6删除在HDFS中的某个文件(夹)hadoop fs -rm(r) 文件存放路径 删除刚刚上传的test.log文件hadoop fs -rm /di/test.log 删除HDFS中的di文件夹hadoop fs -rmr /di 7善用help命令求帮助hadoop fs -help 命令 查看ls命令的帮助hadoop fs -help ls 四.使用Java操作HDFS 我们在工作中写完的各种代码是在服务器中运行的HDFS的操作代码也不例外。在开发阶段我们使用Windows下的Eclipse作为开发环境访问运行在虚拟机中的HDFS也就是通过在本地的Eclipse中的Java代码访问远程Linux中的HDFS。 在本地的开发调试过程中要使用宿主机中的Java代码访问客户机中的HDFS需要确保以下几点宿主机和虚拟机的网络能否互通确保宿主机和虚拟机中的防火墙都关闭确保宿主机与虚拟机中的jdk版本一致 4.1 准备工作 1导入依赖jar包如下图所示 2关联hadoop源码项目如下图所示 4.2 第一个Java-HDFS程序 1定义HDFS_PATHpublic static final String HDFS_PATH hdfs://hadoop-master:9000/testdir/testfile.log; 2让URL类型识别hdfs://URL类型默认只识别http://URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory()); 3具体详细代码如下 1 package hdfs;2 3 import java.io.InputStream;4 import java.net.MalformedURLException;5 import java.net.URL;6 7 import org.apache.hadoop.fs.FsUrlStreamHandlerFactory;8 import org.apache.hadoop.io.IOUtils;9
10 public class firstApp {
11
12 public static final String HDFS_PATH hdfs://hadoop-master:9000/testdir/testfile.log;
13
14 /**
15 * param args
16 * throws MalformedURLException
17 */
18 public static void main(String[] args) throws Exception {
19 // TODO Auto-generated method stub
20 URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());
21 final URL url new URL(HDFS_PATH);
22 final InputStream in url.openStream();
23 /**
24 * params in 输入流
25 * params out 输出流
26 * params buffersize 缓冲区大小
27 * params close 是否自动关闭流
28 */
29 IOUtils.copyBytes(in, System.out, 1024, true);
30 }
31
32 } View Code 4运行结果后面不再贴运行结果图 4.3 对HDFS进行CRUD编程 1获得万能的大神对象final FileSystem fileSystem FileSystem.get(new URI(HDFS_PATH),new Configuration()); 2调用HDFS API进行CRUD操作详情见下代码 public class FileSystemApp {private static final String HDFS_PATH hdfs://hadoop-master:9000/testdir/;private static final String HDFS_DIR /testdir/dir1;public static void main(String[] args) throws Exception {FileSystem fs getFileSystem();// 01.创建文件夹 对应shellmkdircreateDirectory(fs);// 02.删除文件 对应shellhadoop fs -rm(r) xxxdeleteFile(fs);// 03.上传文件 对应shellhadoop fs -input xxxuploadFile(fs);// 04.下载文件 对应shellhadoop fs -get xxx xxxdownloadFile(fs);// 05.浏览文件夹 对应shellhadoop fs -lsr /listFiles(fs,/);}private static void listFiles(FileSystem fs,String para) throws IOException {final FileStatus[] listStatus fs.listStatus(new Path(para));for (FileStatus fileStatus : listStatus) {String isDir fileStatus.isDir() ? Directory : File;String permission fileStatus.getPermission().toString();short replication fileStatus.getReplication();long length fileStatus.getLen();String path fileStatus.getPath().toString();System.out.println(isDir \t permission \t replication \t length \t path);if(isDir.equals(Directory)){listFiles(fs, path);}}}private static void downloadFile(FileSystem fs) throws IOException {final FSDataInputStream in fs.open(new Path(HDFS_PATH check.log));final FileOutputStream out new FileOutputStream(E:\\check.log);IOUtils.copyBytes(in, out, 1024, true);System.out.println(Download File Success!);}private static void uploadFile(FileSystem fs) throws IOException {final FSDataOutputStream out fs.create(new Path(HDFS_PATH check.log));final FileInputStream in new FileInputStream(C:\\CheckMemory.log);IOUtils.copyBytes(in, out, 1024, true);System.out.println(Upload File Success!);}private static void deleteFile(FileSystem fs) throws IOException {fs.delete(new Path(HDFS_DIR), true);System.out.println(Delete File: HDFS_DIR Success!);}private static void createDirectory(FileSystem fs) throws IOException {fs.mkdirs(new Path(HDFS_DIR));System.out.println(Create Directory: HDFS_DIR Success!);}private static FileSystem getFileSystem() throws IOException,URISyntaxException {return FileSystem.get(new URI(HDFS_PATH), new Configuration());}} View Code 参考文献与资料 1传智播客Hadoop从入门到工作视频教程第二季http://bbs.itcast.cn/thread-21310-1-1.html 2刘鹏教授《实战Hadoop开启通向云计算的捷径》http://item.jd.com/10830089.html 3吴超《Hadoop的底层架构——RPC机制》http://www.superwu.cn/2013/08/05/360 4zy19982004《Hadoop学习十一Hadoop-HDFS RPC总结》http://zy19982004.iteye.com/blog/1875969 作者周旭龙 出处http://www.cnblogs.com/edisonchou/ 本文版权归作者和博客园共有欢迎转载但未经作者同意必须保留此段声明且在文章页面明显位置给出原文链接。 转载于:https://www.cnblogs.com/edisonchou/p/3538524.html