hdfs设计原则
1.非常大的文件:
这里的非常大是指几百MB,GB,TB.雅虎的hadoop集群已经可以存储PB级别的数据
2.流式数据访问:
基于一次写,多次读。
3.商用硬件:
hdfs的高可用是用软件来解决,因此不需要昂贵的硬件来保障高可用性,各个生产商售卖的pc或者虚拟机即可。
hdfs不适用的场景
1.低延迟的数据访问
hdfs的强项在于大量的数据传输,递延迟不适合他,10毫秒以下的访问可以无视hdfs,不过hbase可以弥补这个缺陷。
2.太多小文件
namenode节点在内存中hold住了整个文件系统的元数据,因此文件的数量就会受到限制,每个文件的元数据大约150字节
1百万个文件,每个文件只占一个block,那么就需要300MB内存。你的服务器可以hold住多少呢,你可以自己算算
3.多处写和随机修改
目前还不支持多处写入以及通过偏移量随机修改
hdfs block
1 为了最小化查找时间比例,hdfs的块要比磁盘的块大很多。hdfs块的大小默认为64MB,和文件系统的块不同,默认大小可以修改
2 hdfs的文件可以小于块大小,并且不会占满整个块大小
3 做个统数据统计:
查找时间在10ms左右,数据传输几率在100MB/s,为了使查找时间是传输时间的1%,块的大小必须在100MB左右,一般都会设置为128MB
在有了块概念后,hdfs增加如下优点:(这三个没看出来是多大的优点,或许是对hdfs理解不深入吧)
1.可以存储比单个磁盘更大的文件
2.存储块比存储文件更加简单,每个块的大小都基本相同
3.使用块比文件更适合做容错性和高可用
namenodes和datanodes
hdfs集群有两种类型的节点,一种为master及namenode,另一种为worker及datanodes。
namenode节点管理文件系统的命名空间。它包含一个文件系统的树,所有文件和目录的原数据都在这个树上,这些信息被存储在本地磁盘的两个文件中,image文件和edit log文件。
文件相关的块存在哪个块中,块在哪个地方,这些信息都是在系统启动的时候加载到namenode的内存中
datanode节点在文件系统中充当的角色就是苦力,按照namenode和client的指令进行存储或者检索block,并且周期性的向namenode节点报告它存了哪些文件的block
namenode节点如果不能使用了,那么整个hdfs就玩完了,为了防止这种情况,有两种方式可供选择
1.namenode通过配置元数据可以写到多个磁盘中,最好是独立的磁盘,或者NFS.
2 使用第二namenode节点(secondnamenode),第二namenode节点平时并不作为namenode节点工作,
它的主要工作内容就是定期将编辑日志(edit log)合并到namespace image中,并清空 edit log,
合并后的image它自己也保留一份,等着namenode节点挂掉,然后它可以转正,由于不是实时的,
有数据上的损失是很可能发生的。
hdfs Federation
namenode节点保持所有的文件和块的引用在内存中,这就意味着在一个拥有很多很多文件的很大的集群中,内存就成为了一个
限制的条件,hdfs federation在hadoop 2.x的被实现了,允许hdfs有多个namenode节点,每个管hdfs的一部分,比如一个管/usr,
另一个管/home,每个namenode节点是相互隔离的,一个挂掉不会影响另外一个。
hdfs的高可用
不管namenode节点的备份还是第二namenode节点都只能保证数据的恢复,并不能保证hdfs的高可用性,
一旦namenode节点挂掉就会产生单点故障,这时候要手动去数据恢复,并且启用第二name节点
新的namenode节点在对外服务器要做三件事:
1.把命名空间的镜像加载到内存中
2.重新运行编辑日志
3.接受各个datanode节点的block报告
在一个大型一点的hdfs系统中,等这些做完需要30分钟左右。
hadoop2.x已经支持了高可用性(HA),通过一对namenode热备来实现,一台挂掉,备机马上提供无中断服务
要实现HA,要做三点微调:
1.namenode节点必须使用高可用的共享存储。
2.datanode节点必须象两个namenode节点发送block报告
3.客户端做改动可以在故障时切换到可用的namenode节点上,而且要对用户是无感知的
failover和fencing
将备份namenode激活的过程就叫failover,管理激活备份namenode的系统叫做failover controller,
zookeeper就可以担当这样的角色,可以保证只有一个节点处于激活状态。
必须确认原来的namenode已经真的挂掉了,很多时候只是网络延迟,如果备份节点已经激活了,
原来的节点又可以提供服务了,这样是不行的,防止原来namenode活过来的过程就叫fencing。
可以用STONITH实现, STONITH可以做到直接断电把原namenode节点fencing掉
java操作hdfs最核心的类就是FileSystem, 可以通过如下代码创建此对象:
static FileSystem getFileSystem() { try { return FileSystem.get(new URI(PATH), new Configuration()); } catch (IOException e) { e.printStackTrace(); } catch (URISyntaxException e) { e.printStackTrace(); } return null; } new Configuration(), 查看源代码发现有如下写法 addDefaultResource("core-default.xml"); addDefaultResource("core-site.xml"); 会自动加载hdfs的这两个核心文件
写数据
FileSystem类有很多种创建文件的方法,最简单的一种是
public FSDataOutputStream create(Path f) throws IOException
它还有很多重载方法,可以指定是否强制覆盖已存在的文件,文件的重复因子,写缓存的大小,文件的块大小,文件的权限等。
还可以指定一个回调接口:
public interface Progressable { void progress(); } 和普通文件系统一样,也支持apend操作,写日志时最常用 public FSDataOutputStream append(Path f) throws IOException但并非所有hadoop文件系统都支持append,hdfs支持,s3就不支持。
以下是个拷贝本地文件到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 org.apache.hadoop.util.Progressable; import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.InputStream; import java.io.OutputStream; import java.net.URI; public class FileCopyWithProgress { public static void main(String[] args) throws Exception { String localSrc = args[0]; String dst = args[1]; InputStream in = new BufferedInputStream(new FileInputStream(localSrc)); Configuration conf = new Configuration(); FileSystem fs = FileSystem.get(URI.create(dst), conf); OutputStream out = fs.create(new Path(dst), new Progressable() { @Override public void progress() { System.out.print("."); } }); IOUtils.copyBytes(in, out, 4096, true);
FileStatus
封装了hdfs文件和目录的元数据,包括文件的长度,块大小,重复数,修改时间,所有者,权限等信息,FileSystem的getFileStatus可以获得这些信息
Listing files
有时候你可能会需要找一组符合要求的文件,那么下面的示例就可以帮到你,通过FileSystem的listStatus方法可以获得符合条件的一组FileStatus对象,listStatus有几个重载的方法,可以传入多个路径,还可以使用PathFilter做过滤
PathFilter
接着上面我们来讲PathFilter接口,该接口只需实现其中的一个方法即可,即accpet方法,方法返回true时表示被过滤掉,我们来实现一个正则过滤,并在下面的例子里起作用
import org.apache.hadoop.fs.Path; import org.apache.hadoop.fs.PathFilter; public class RegexExludePathFilter implements PathFilter { private final String regex; public RegexExludePathFilter(String regex) { this.regex = regex; } @Override public boolean accept(Path path) { return !path.toString().matches(regex); } }
File patterns
当需要很多文件时,一个个列出路径是很不便捷的,hdfs提供了一个通配符列出文件的方法,通过FileSystem的globStatus方法提供了这个便捷,globStatus也有重载的方法,使用PathFilter过滤,那么我们结合两个来实现一下
import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileStatus; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.FileUtil; import org.apache.hadoop.fs.Path; import java.io.IOException; import java.net.URI; public class GlobStatus { public static void main(String[] args) throws IOException { String uri = args[0]; Configuration conf = new Configuration(); FileSystem fs = FileSystem.get(URI.create(uri), conf); FileStatus[] status = fs.globStatus(new Path(uri),new RegexExludePathFilter("^.*/1901")); Path[] listedPaths = FileUtil.stat2Paths(status); for (Path p : listedPaths) { System.out.println(p); } } }
删除数据
删除数据比较简单
public abstract boolean delete(Path f, boolean recursive) throws IOException
下面贴上java操作hdfs的一些简单代码:
package hdfs; import java.io.FileInputStream; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FSDataInputStream; import org.apache.hadoop.fs.FSDataOutputStream; import org.apache.hadoop.fs.FileStatus; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IOUtils; // 使用 hadoop的FileSystem API进行文件操作 public class FileSystemHdfs { static final String PATH = "hdfs://master:9000/"; // 本机host中已经配置 192.168.1.105 master static final String DIR = "/d1"; static final String FILE = "/d1/file"; public static void main(String[] args) { // 获取hadoop文件系统 FileSystem fileSystem = getFileSystem(); // 创建文件夹 //mkdir(fileSystem); // 上传文件 //putData(fileSystem); // 下载文件 //getData(fileSystem); // 浏览文件夹 list(fileSystem); // 删除文件 //remove(fileSystem); } private static void list(FileSystem fileSystem) { try { FileStatus[] filesStatus = fileSystem.listStatus(new Path("/")); for (FileStatus fileStatus : filesStatus) { String isDir = fileStatus.isDir()?"文件夹":"文件"; String permission = fileStatus.getPermission().toString(); short replication = (short) fileStatus.getBlockSize(); long len = fileStatus.getLen(); String path = fileStatus.getPath().toString(); System.out.println(isDir+"\t"+permission+"\t"+replication+"\t"+len+"\t"+path); } } catch (IOException e) { e.printStackTrace(); } } private static void getData(FileSystem fileSystem) { try { FSDataInputStream in = fileSystem.open(new Path(FILE)); IOUtils.copyBytes(in, System.out, 1024,true); } catch (IOException e) { e.printStackTrace(); } } private static void putData(FileSystem fileSystem) { try { /** * * @param in InputStrem to read from * @param out OutputStream to write to * 虽然下面定义 hdfs上的FILE文件为输出流感觉和真正JAVA上学的IO 输出流概念正好相反,但是看到IOUtils.copyBytes(in, out, 1024, true) * 方法中对 in,out的英文解释,你就按照Java世界IO概念的反方向理解吧。 */ FSDataOutputStream out = fileSystem.create(new Path(FILE)); FileInputStream in = new FileInputStream("E:/yy.txt"); IOUtils.copyBytes(in, out, 1024, true); } catch (Exception e) { e.printStackTrace(); } //fileSystem.geto } private static void remove(FileSystem fileSystem) { try {// true表示递归删除 fileSystem.delete(new Path(DIR), true); } catch (IOException e) { e.printStackTrace(); } } private static void mkdir(FileSystem fileSystem) { try { fileSystem.mkdirs(new Path(DIR)); } catch (IOException e) { e.printStackTrace(); } } // 创建hadoop的文件操作系统 filesystem实例 private static FileSystem getFileSystem() { try { return FileSystem.get(new URI(PATH), new Configuration()); } catch (IOException e) { e.printStackTrace(); } catch (URISyntaxException e) { e.printStackTrace(); } return null; } /** * new Configuration()会自动加载hdfs的 * addDefaultResource("core-default.xml"); addDefaultResource("core-site.xml"); */ }
相关推荐
### Spark并行编程详解 #### 一、Spark简介与特性 **Spark** 是一个快速且易于使用的集群计算系统,能够与 Apache Hadoop 兼容。它不仅支持多种 Hadoop ...掌握这些基础知识和技术,对于高效地进行并行编程至关重要。
Hive还提供了命令行选项和交互式shell命令,以及调用Python、Shell等语言的支持。 Hive支持的Map/Reduce操作包括: - JOIN - GROUPBY - DISTINCT 使用Hive时需要注意的点包括字符集、数据压缩、数据的count...
Hive是一种建立在Hadoop之上的数据仓库基础架构,用于存储、查询和分析存储在Hadoop文件系统(HDFS)中的大规模数据。Hive定义了一种类SQL查询语言(即Hive QL),让熟悉SQL的用户能够以简单的方式查询Hadoop中的数据...
3.4.7-卡尔曼滤波与运动估计算法介绍和使用 STM32串口通信 openmv+STM32串口通信 openmv串口通信openmv识别物体 openmv神经网络训练 openmv数字识
内容概要:本文档详细介绍了MATLAB的高级编程技巧,涵盖高级数据结构与操作、高效编程与优化、高级可视化技术、并行计算与GPU编程、代码调试与性能分析以及高级算法与数值方法六个主要部分。具体内容包括细胞数组和结构体的创建与使用、面向对象编程、向量化
用于设计和测试受洋流和风影响的单点海洋系泊设备。提供的数据库(可以添加到)将允许您在典型的当前条件下构建系泊并对其进行测试,或者通过电流剖面的时间序列迫使其生成系泊形状和组件位置的时间序列。该程序为地下和地面系泊提供了解决方案,甚至可以预测地面系泊何时被淹没。将溶液上下翻转,它还模拟了拖曳体,在拖曳体中,一个负浮力(重)体被拖在一艘移动的船后面(有一个立管下沉器)。如果聚焦电流剖面随时间变化(即来自ADCP),则会保存/访问系泊组件位置和形状的动画(电影)或时间(序列)历史。系泊装置可以保存和取回
内容概要:本文档详细介绍了线程基础、线程安全与锁、线程安全集合、死锁与同步工具、线程池以及分布式部署存储考虑等方面的知识,并针对Spring Framework的核心技术(IoC&AOP)、Spring Boot、Spring MVC和数据库与事务进行了重点知识提取及考试题目方向的说明。具体包括线程的创建方式、状态转换,线程安全问题的根源及其解决方案,不同锁的对比与应用,线程安全集合的特点,死锁条件及同步工具类的功能,线程池的核心参数和拒绝策略,分布式系统的数据一致性和锁机制,缓存与数据库同步策略,以及Spring相关技术的关键概念、配置方式、请求处理流程、事务管理和MyBatis的使用等。; 适合人群:具
基于C++的无锁队列,有信号量,可以阻塞读、写线程,目前测试10线程读,10线程写是没有问题的
内容概要:本文详细介绍了混合动力汽车在交通拥堵情况下采用等效燃油消耗最小策略(ECMS)进行节能控制的研究与实现。通过MATLAB代码展示了如何模拟前车速度、跟车策略以及能量管理系统的工作原理。文中提到,ECMS算法能够根据实时速度、加速度和电池状态等因素动态调整发动机和电动机之间的能量分配,从而达到最佳的燃油经济性和排放性能。此外,文章还讨论了安全距离模型、动能回收机制以及应对突发情况的具体措施,如急减速时的能量管理和电池温度保护等。 适合人群:从事汽车工程、自动化控制领域的研究人员和技术人员,尤其是关注混合动力汽车节能技术的专业人士。 使用场景及目标:适用于希望深入了解混合动力汽车在复杂城市交通环境中的节能控制策略及其具体实施方法的人群。目标是在理论层面掌握ECMS算法的核心思想,并能够在实践中应用相关技术和工具进行验证。 其他说明:文章不仅提供了详细的代码示例,还分享了一些实用的操作技巧和经验教训,帮助读者更好地理解和运用这一先进技术。
环形队列的一种实现方式
2005-2019年各地级市绿色专利申请量数据 1、时间2005-2019年 2、来源:国家知识产权j 3、指标:省份、城市、年份、绿色发明专利申请量、绿色实用新型专利申请量 4、范围:360+地级市
# 基于C语言的WebP图片编码解码库 ## 项目简介 本项目是一个基于C语言的WebP图片编码解码库。WebP是一种现代开源图像格式,支持无损和有损压缩,在保持图像质量的同时能显著减少图像文件大小,加快传输速度。此库实现了WebP格式的核心编码解码功能,还支持动画WebP图像的编码和组装,以及颜色空间转换、图像缩放等辅助功能,适用于网页开发、图像处理软件、视频编辑工具等多种应用场景。 ## 项目的主要特性和功能 1. 高性能采用优化算法和指令集(如SSE2、NEON、MIPS等)加速编码解码过程。 2. 灵活性支持多种图像格式(如RGB、YUV)和颜色空间转换。 3. 支持动画可编码和组装WebP格式的动画图像。 4. 内存管理提供安全的内存分配和释放函数,防止内存泄漏。 5. 错误处理具备错误报告和处理机制,确保程序的健壮性。 6. 核心功能实现图像分析、预测、变换、量化、反变换等编码解码步骤,并提供进度报告机制。 ## 安装使用步骤
本资源是《基于电影知识图谱和微信小程序的智能问答系统新版源码+说明.zip》,专为计算机科学领域的学习者设计,融合了人工智能、数据管理和前端应用开发的先进技术。通过构建电影知识图谱,该系统能够深度理解和处理用户的电影相关查询,提供精准且丰富的答案。微信小程序作为前端交互平台,以其便捷性和广泛覆盖性,让用户随时随地享受智能化的电影信息服务。此资源不仅是课程设计和毕业设计的理想选择,也为开发者提供了实践前沿技术的机会,助力提升编程能力和项目经验。请务必用于学习和研究目的,不得用于商业用途。
# 基于TensorFlow的GAN图像生成项目SteGANography ## 项目简介 本项目是一个基于TensorFlow深度学习框架的图像生成项目,主要利用生成对抗网络(GAN)进行图像混淆与恢复的研究。项目名称中的“Ste”代表Steganography(隐写术),是一种隐藏信息的技术。本项目的目的是利用神经网络将信息嵌入图像中,然后再恢复出来。这涉及到图像生成、加密和解密的过程。 ## 主要功能及特点 利用GAN生成混淆图像。 通过对混淆图像进行解码恢复原始图像。 包含Alice、Bob和Eve三个网络部分,分别负责生成、处理和识别图像。 提供了可视化的功能,能够绘制关于训练迭代与位错误之间的关系图。 可配置的训练参数,包括学习率、迭代次数等。 提供了模型保存和恢复的机制,便于训练中断后继续训练或在不同任务间迁移模型。 ## 安装与运行 ### 环境依赖 Python 3.x
# 基于Arduino的环境监测系统 ## 项目简介 本项目是一个基于Arduino的环境监测系统,主要用于收集并保存环境数据,如温度、湿度、降雨量、气体值和风速等。通过使用Arduino平台和多种传感器,实现数据的实时采集、处理和存储。 ## 项目的主要特性和功能 1. 数据采集通过Arduino板连接多种环境传感器,实时采集环境数据。 2. 数据处理对采集的数据进行本地处理,如温度湿度的转换等。 3. 数据存储将处理后的数据保存到SD卡或其他存储设备中,以便于后续分析。 4. 数据传输通过串行通信或无线通信模块将数据发送到计算机或其他设备。 ## 安装使用步骤 1. 硬件准备准备Arduino板、环境传感器(如DHT温湿度传感器)、SD卡模块等硬件。 2. 软件准备安装Arduino IDE,并下载项目代码。 3. 传感器连接将传感器连接到Arduino板的相应引脚。 4. 代码上传将项目代码上传到Arduino板。
内容概要:本文详细介绍了100kw模块式三相光伏并网逆变器的整体设计方案,涵盖功率接口板、主控DSP板、驱动扩展板及其逆变器并联仿真的各个方面。首先,文章阐述了功率接口板的原理图和PCB设计,解释了各个元件的作用及其选择依据。接着,重点讲解了主控DSP板的原理图、元器件明细表及核心代码,特别是PID控制算法的应用。然后,探讨了驱动扩展板的设计要点,包括驱动芯片的选择和PCB布局技巧。最后,分析了逆变器并联仿真文件,讨论了环流抑制算法及其效果。 适合人群:具备一定电子工程和嵌入式系统基础知识的专业人士,尤其是从事光伏逆变器及相关电力电子设备的研发工程师和技术爱好者。 使用场景及目标:①帮助读者深入了解100kw模块式三相光伏并网逆变器的工作原理和设计思路;②为实际项目开发提供详尽的技术参考资料,包括原理图、PCB设计、源码及元器件选择;③通过实例代码和仿真分析,提升读者解决复杂控制系统问题的能力。 其他说明:文中不仅提供了理论知识,还分享了许多实际设计中的经验和技巧,如PCB布线注意事项、元件选型标准、代码优化方法等,有助于读者更好地理解和应用所学内容。
# 基于Python和OpenAI的微信智能聊天机器人 ## 项目简介 本项目是一个基于Python和OpenAI的微信智能聊天机器人,能够将微信打造成一个智能对话平台。通过集成OpenAI的ChatGPT模型,机器人可以进行智能对话,支持多轮会话上下文记忆、语音识别、图片生成等功能。此外,项目还支持多种插件扩展,如多角色切换、文字冒险游戏、敏感词过滤等,极大地丰富了用户的互动体验。 ## 主要特性和功能 多端部署支持个人微信、微信公众号和企业微信应用等多种部署方式。 智能对话支持私聊及群聊的智能回复,支持多轮会话上下文记忆,支持GPT3、GPT3.5、GPT4模型。 语音识别支持语音消息的识别与回复,支持Azure、Baidu、Google、OpenAI等多种语音模型。 图片生成支持图片生成和图生图功能,支持DALLE、Stable Diffusion、Replicate等模型。
微信小程序图表组件源码简介 这份资源是精心整理的微信小程序图表组件源码包,涵盖了柱状图、折线图、饼图、雷达图等多种常见且实用的图表类型。在当今数据可视化盛行的时代,无论是商业数据分析、项目进度展示,还是日常信息统计,这些图表都起着关键作用。 对于微信小程序开发者而言,这无疑是一份极具价值的学习宝藏。它提供了现成的图表实现代码,能帮助开发者深入理解不同图表在小程序中的构建逻辑与交互方式,快速掌握如何将数据以直观的图表形式呈现给用户,从而提升小程序的用户体验与功能性。通过研究这些源码,开发者可以学习到图表绘制的技巧、数据处理的方法以及与小程序其他组件协同工作的方式,为开发更复杂、更专业的小程序应用奠定坚实基础,加速开发进程,少走弯路,进而打造出功能完备、界面美观且数据展示清晰的优质小程序产品,满足用户多样化的数据可视化需求。总之,这是一份不可多得的学习资源,助力开发者在微信小程序开发领域不断进步。
《幼儿园招生报名小程序源码简介》 本资源是一份极具实用价值的幼儿园招生报名小程序源码。它为幼儿园的招生工作提供了高效便捷的解决方案,同时也方便家长进行报名操作。 在功能方面,幼儿家长能够通过该小程序填写丰富的信息,涵盖幼儿的基本信息、住址信息以及监护人信息等各类必要资料,且这些资料可根据实际需求进行灵活的自定义设置,满足不同幼儿园的个性化要求。园方人员则拥有强大的管理权限,可依据家长提交的资料进行预先审核,若发现资料不完善或存在问题,能及时提示用户修改,确保信息的准确性和完整性。此外,园方还能方便地查看所有报名名单,并支持将名单导出,便于后续的整理和统计工作。 需要强调的是,此资源仅为学习资源,旨在帮助开发者学习和研究相关技术,不应用于商业用途。
4.1 openmv相关资料如何查找 STM32串口通信 openmv+STM32串口通信 openmv串口通信openmv识别物体 openmv神经网络训练 openmv