本文主要是介绍大数据修炼之hadoop--HDFS,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文章目录
- 原理
- 组件
- 文件系统shell
- java api
- 数据流
- NameNode
- 作用:
原理
假设前提与设计目标
- 硬件错误
- 大规模数据集
- 简单的一致性模型
- 移动计算比移动数据共划算
- 异构软硬件平台见的可以执行
组件
- Namenode:HDFS的守护进程,用来管理文件系统的命名空间,负责记录文件是如何分割成数据块,以及这些数据块分别被存储到哪些数据节点上,它的主要功能是对内存及IO进行集中管理。
- Datanode:文件系统的工作节点,根据需要存储和检索数据块,并且定期向Namenode发送它们所存储的块的列表。
- Secondary Namenode:辅助后台程序,与NameNode进行通信,以便定期保存HDFS元数据的快照,用以备份和恢复数据。
在Namenode节点上,fsimage保存了元数据镜像文件(文件系统的目录树),而edits中完整记录了元数据的操作日志(针对文件系统做的修改操作记录)。Namenode内存中存储的元数据可以用“fsimage+edits”来表达。而SecondaryNamenode负责定时(默认1小时)从Namenode上获取fsimage和edits进行合并,然后再发送给Namenode,减少Namenode的工作量。
每个文件存储成一系列的数据块(128MB)。为了容错,文件的所有数据块都会有副本。每个文件的数据块大小和副本系数都是可配置的。
文件系统shell
命令形式:hadoop fs -cmd
java api
maven依赖:
<dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-common</artifactId><version>3.2.0</version></dependency><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-hdfs</artifactId><version>3.2.0</version></dependency><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-client</artifactId><version>3.2.0</version></dependency><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-mapreduce-client-core</artifactId><version>3.2.0</version></dependency><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.2</version></dependency>
代码:
@org.junit.Testpublic void downloadFile() throws URISyntaxException, IOException {// 获得FileSystem对象FileSystem fileSystem = FileSystem.get(new URI("hdfs://192.168.31.101:9000"), new Configuration());// 调用open方法进行下载,参数HDFS路径InputStream in = fileSystem.open(new Path("/wcinput/logs/hadoop-hadoop-namenode-hadoop1.log"));// 创建输出流,参数指定文件输出地址OutputStream out = new FileOutputStream("D://nn.log");// 使用Hadoop提供的IOUtils,将in的内容copy到out,设置buffSize大小,是否关闭流设置trueIOUtils.copyBytes(in, out, 4096, true);}@Testpublic void uploadFile() throws URISyntaxException, IOException, InterruptedException {FileSystem fileSystem = FileSystem.get(new URI("hdfs://192.168.31.101:9000"), new Configuration(),"root");// 获得FileSystem对象,指定使用root用户上传
// FileSystem fileSystem = FileSystem.get(new URI("hdfs://192.168.0.0:9000"), new Configuration(), );// 创建输入流,参数指定文件输出地址InputStream in = new FileInputStream("D:\\apache-maven-3.6.3\\conf\\settings.xml");// 调用create方法指定文件上传,参数HDFS上传路径OutputStream out = fileSystem.create(new Path("/settings.xml"));// 使用Hadoop提供的IOUtils,将in的内容copy到out,设置buffSize大小,是否关闭流设置trueIOUtils.copyBytes(in, out, 4096, true);}
数据流
DataNode在写数据的时候创建packet(64k,包含多个chunk 512b数据+4b校验码),DateNode间建立数据通道。DataNode的选择与Hadoop的机架感知能力有关。
packet会放在一个dataQueue中,成功确认,失败回滚切换DN继续传输。
具体要看源码
NameNode
作用:
保存HDFS所有文件的元数据
接收客户端的请求
NameNode接收DataNode上报的信息,给DataNode分配任务
这篇关于大数据修炼之hadoop--HDFS的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!