赞
踩
目录
学习目标:(1)了解企业存储系统相关概念、(2)掌握如何实现分布式文件存储系统、(3)理解HDFS概述、设计目标、应用场景(4)掌握HDFS重要特性(5)掌握HDFS Shell、Java操作(6)了解LibHDFS客户端
近几年为何企业重视存储系统?
数字经济:人类通过大数据识别、选择、过滤、使用,引导资源快速优化配置和再生,实现经济高质量发展
产业互联网:企业数字化转型,传统业务数字化改造。降低成本、进行资源精准配置、提升效率、增加资产附加值、整合企业内外部数据,以数据支撑精细化运营
面临的首要问题:大规模数据存储
硬盘:是计算机的主要存储硬件,可以用来存储数据,目前硬盘存储比较流行的是TB级的,分类:机械、固态、混合
硬盘不够了怎么办?
RAID(磁盘阵列):很多快独立的磁盘组合成一个容量巨大的磁盘组,容错。相关文章RAID磁盘阵列详解_kid00013的博客-CSDN博客,
DAS存储架构:直连式存储,通过电缆、SCSI接口直接挂到服务器总线上,依赖操作系统进行IO,接口个数受限(结构:应用<-->存储系统<-->存储设备)
NAS网络接入存储:通过网络拓扑结构如以太网连接,共享文档、图片、电影等。一些NAS厂商也推出云存储和云共享。(结构:应用 《《网络》》存储系统<-->存储设备)
SAN存储区域网络存储:高速的、专门的用于存储的操作的网络,局域网内,通过高速交换机进行数据交换。(结构:应用<-->存储系统《《网络》》存储设备)
文件系统:是一种存储和组织数据的方法。,下图是windows系统的文件目录。
使用文件和树形目录的抽象概念代替了物理设备使用数据块的概念,用户使用文件系统没有必要关系底层数据存储再哪里(扇区,盘片),只需要记住文件所属目录和文件名。
文件系统通常使用硬盘、光盘这样的存储设备存储,并维护文件在设备中的物理位置
文件系统时一套实现了数据的存储、分级组织、访问和获得的一种抽象数据模型。
文件名:相同目录下不能重名(唯一性),DOS操作系统中包含文件主名和扩展名,之间一个小圆点隔开。可用于定位位置、区分不同文件。计算机实行按名存取的操作方式,某些特殊字符不能出现在文件名中。
元数据:解释性数据,记录数据的数据,例如
文件系统中一般是指文件的各类信息。
基于磁盘的文件系统,非易失。
虚拟文件系统:比如proc,Linux内核
网络文件系统:文件系统在其他地方,文件操作网络进行
成本高:通用性差、设备投资加上后期维护、升级扩容的成本非常高
性能低:单节点IO瓶颈
可扩展性差:无法实现快速部署、动态扩容、缩容实现难度大
如何支撑高效率的计算分析:传统存储意味着存储是存储,计算是计算,需要将处理的数据移动过来,程序和数据存储不同厂商实现,无法有机整合
产品设计不能追求单一指标的极限性。
多台机器存储意味着分布式存储
文件分布到多台机器,如何快速查找到文件哪,例如图书馆查找图书
借助元数据记录来姐姐这个问题,把文件和其存储的机器位置记录下来。
分块存储,把大文件拆分成若干小块,分别存储在不同机器上,并行操作,提高效率
同时解决了存储负载均衡的问题
元数据应该记录每一个文件块的信息。
冗余存储、副本机制,图下图,将每一块在其他机器上在存储一份。
带有层次感的命名控件(namespace),抽象成树目录结构。
Hadoop Distributed File System,意为Hadoop分布文件存储系统,是Hadoop和核心组件之一,作为大数据生态圈最底层的分布式存储服务而存在,之解决存储问题,不解决计算和分析。
解决大数据如何存储的问题,横跨在多台机器上(可以是普通的廉价的已有的计算机)
高容错,适用于大数据集存储
提供统一的访问接口
Doug cutting(卡大爷)领导Nutch项目研发,Natch设计目标是构建一个大型的全网搜索引擎,网页抓取-->索引-->查询
数据抓取越来越多,遇到严重的可扩展性问题,如何解决数十亿网页的数据存储和索引问题
2003年谷歌开发出来GFS文件存储系统,写了一篇论文《分布式文件系统(GFS),可用于处理海量网页的存储》
Nutch开发人员完成了相应的开源实现,从Nutch中剥离出来和Mapreduce成立了Hadoop开源软件
大文件、数据流式访问、一次写入多次读取、低成本部署,廉价pc、高容错
不适合场景:小文件、数据交互式访问(想怎么开发,编辑,保存)、频繁任意修改、低延迟处理。
主从架构:master/slave架构,几个HDFS集群有一个namenode和一定数目的datanode,namenode是主节点,datanode是HDFS的从节点
分块存储机制:物理上分块存储(block),块的大小可以通过参数配置来规定,参数位于hdfs-defalt.xml中,dfs.blocksize。默认大小是128M(134217728)
副本机制:文件的所有block都会有副本。每个文件的block大小和副本系数(dfs.replication)都是可以配置的默认是3,副本系统可以在文件创建的时候指定,,也可以通过命令改变,
namespace :支持传统的层次文件组织结构。用户可以创建目录、然后将文件保存在这些目录里面。文件系统名字控件的层次结构和大多数现有文件系统类似:用户可以创建、删除、移动、重命名文件。HDFS提供一个统一的抽象目录
元数据管理:namenode元数据具有两种类型:文件自身属性信息(名称、权限、修改时间、文件大小、复制因子、数据块大小)、文件块位置映射信息(记录文件块和datanode之间的映射信息,即哪个块位于那个节点上)
数据块存储:存储管理由dataNode节点承担
命令行界面,指用户通过键盘数据指令,予以一种人机交互
命令行用法
- hdfs dfs #根文件读写相关的命令
- Usage: hadoop fs [generic options]
- [-appendToFile <localsrc> ... <dst>]
- [-cat [-ignoreCrc] <src> ...]
- [-checksum <src> ...]
- [-chgrp [-R] GROUP PATH...]
- [-chmod [-R] <MODE[,MODE]... | OCTALMODE> PATH...]
- [-chown [-R] [OWNER][:[GROUP]] PATH...]
- [-copyFromLocal [-f] [-p] [-l] [-d] [-t <thread count>] <localsrc> ... <dst>]
- [-copyToLocal [-f] [-p] [-ignoreCrc] [-crc] <src> ... <localdst>]
- [-count [-q] [-h] [-v] [-t [<storage type>]] [-u] [-x] [-e] <path> ...]
- [-cp [-f] [-p | -p[topax]] [-d] <src> ... <dst>]
Usage: hdfs dfs [COMMAND [COMMAND_OPTIONS]]
Run a filesystem command on the file system supported in Hadoop. The various COMMAND_OPTIONS can be found at File System Shell Guide.
HDFS shell cli 支持操作多种文件系统,本地,分布式等
操作什么文件系统取决于url中前缀的协议file:/// ,hdfs://,,可以在文件中配置默认选项
- hdfs dfs -ls hdfs://node1:8020 /
- hdfs dfs -ls file:///
- hadoop dfs 只能操作HDFS文件系统(包括于local fs之间的操作),已经过时了
- hdfs dfs 只能操作HDFS文件系统(包括Local fs之间的操作),常用
- hadoop fs 可操作任意文件系统,不仅仅是hdfs文件系统,使用范围更广
- 目前官方推荐使用hadoop fs,当然hdfs dfs使用也较多
文件操作命令根linux相似,可以通过hadoop fs --help学习。命令官网:Apache Hadoop 3.3.4 – Overview
微博的大量用户评论数据,用于分析用户行为和习惯,进行精准分析和推送。
目录规划
目录 | 说明 |
/source | 原始数据 |
/common | 公共数据,ip,省份、经纬度 |
/workspace | 计算出来的结果数据 |
/tmp | 临时数据,每周清理 |
/warehourse | 存储hive数据仓库中的数据 |
HDFS创建目录
- hadoop fs -mkdir [-p] <path>
- # -p 创建父目录,可选
- # path 创建的目录
- hadoop fs -mkdir /common/
- hadoop fs -mkdir /workspace/
- hadoop fs -mkdir /tmp/
- hadoop fs -mkdir /warehouse/
- hadoop fs -mkdir /source/
查看创建的目录
hadoop fs -ls -h -R /
上传文件
- # 创建目录
- hadoop fs -mkdir -p /source/weibo/star/comment_log/20190810_node1.itcast.cn/
- # 上传文件,本地还在
- hadoop fs -put /export/data/caixukun.csv /source/weibo/star/comment_log/20190810_node1.itcast.cn
- # moveFromLocal 上传,本地没有了
- hadoop fs -moveFromLocal /export/data/caixukun.csv /tmp/
查看hdfs文件
- # 慎重使用cat命令,尤其是大文件
- hadoop fs -cat /tmp/caixukun.csv
- # 查看前1kb的内容
- hadoop fs -head /tmp/caixukun.csv
- # 查看后1kb的命令,可选参数-f,查看动态添加的内容
- hadoop fs -tail /tmp/caixukun.csv
-
-
下载HDFS文件
- hadoop fs -get [-f] [-p] <src> <local>
-
- # -f 覆盖目标文件
- # -p 保留访问和修改时间
-
- hadoop fs -get /tmp/caixukun.csv /export/data/
-
- hadoop fs -getmerge [-nl] [-skip-empty-file] <src> <local>
- # [-nl] 每个文件后添加换行符
-
- echo hello1 >> /export/data/1.txt
- echo hello2 >> /export/data/2.txt
- echo hello3 >> /export/data/3.txt
- hadoop fs -put /export/data/1.txt /tmp/small
- hadoop fs -put /export/data/2.txt /tmp/small
- hadoop fs -put /export/data/3.txt /tmp/small
- hadoop fs -getmerge /tmp/small/* /export/data/Hello.txt
-
-
- cat /export/data/Hello.txt
HDFS拷贝文件
- # 准备文件夹
- hadoop fs -mkdir -p /source/weibo/star/comment_log/20221121_node1.itcast.cn
- # 拷贝数据
- hadoop fs -cp /source/weibo/star/comment_log/20190810_node1.itcast.cn/caixukun.csv /source/weibo/star/comment_log/20221121_node1.itcast.cn/
HDFS文件追加
hadoop fs -appendToFile /export/data/caixukun_new.csv /source/weibo/star/comment_log/20190810_node1.itcast.cn/caixukun.csv
查看剩余空间
- # 磁盘空间
- hadoop fs -df -h /
- # 文件使用的空间量
- # hadoop fs -du [-s] [-h] [-v] /source/weibo/
- hadoop fs -du -s -h -v /source/weibo/
- -s 表示显示指定文件长度的汇总摘要,而不是单个文件的摘要
数据移动
- hadoop fs -mv <src> <target>
- hadoop fs -mv /source/weibo/star/comment_log/20221121_node1.itcast.cn/caixukun.csv /tmp/caixukun_dirtydata.csv
修改HDFS文件副本个数(特别耗时,在文件上传时确定好)
- hdfs dfs -setrep [-R] [-w] <numReplicas> <path>
-
- #-w:标志请求命令等待复制完成。 这可能会花费很长时间。
- #-R:标志是为了向后兼容。 没有作用。
-
- hadoop fs -setrep -w 2 /tmp/caixukun_dirtydata.csv
其他命令
再次上官方手册
奇yin巧计,在hdfs webui中操作,文件和文件夹属性具有下划线的属性,可以直接修改。
客户端核心类 Configuration 配置对象类,加载和设置参数属性
文件系统类 FileSystem 基类,针对不同实现,具有不同文件系统,封装了各类方法。
配置windows 系统hadoop。
配置HADOOP_HOME
建立maven项目
导包
- <dependencies>
- <dependency>
- <groupId>org.apache.hadoop</groupId>
- <artifactId>hadoop-common</artifactId>
- <version>3.1.4</version>
- </dependency>
- <dependency>
- <groupId>org.apache.hadoop</groupId>
- <artifactId>hadoop-client</artifactId>
- <version>3.1.4</version>
- </dependency>
- <dependency>
- <groupId>org.apache.hadoop</groupId>
- <artifactId>hadoop-hdfs</artifactId>
- <version>3.1.4</version>
- </dependency>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>4.13</version>
- </dependency>
- </dependencies>
-
- <build>
- <plugins>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-compiler-plugin</artifactId>
- <version>3.1</version>
- <configuration>
- <source>1.8</source>
- <target>1.8</target>
- </configuration>
- </plugin>
- </plugins>
- </build>
java代码
- package cn.itcast.hdfs;
-
- import org.apache.hadoop.conf.Configuration;
- import org.apache.hadoop.fs.FileSystem;
- import org.apache.hadoop.fs.Path;
- import org.junit.After;
- import org.junit.Before;
- import org.junit.Test;
-
- import java.io.IOException;
-
- /**
- * @author admin
- */
- public class HdfsClientTest {
- private static Configuration conf;
- private static FileSystem fs;
-
- /**
- * 初始化方法,用于和hdfs集群建立连接
- * @throws IOException
- */
- @Before
- public void connect2Hdfs() throws IOException {
- //设置客户端身份,已具备权限在hdfs上进行操作
- System.setProperty("HADOOP_USER_NAME","root");
- //创建配置对象实例
- conf = new Configuration();
- //设置操作的文件系统时HDFS,并且指定HDFS操作地址 ,
- // 因为虚拟机和程序不再同一网络,通过端口映射进行设置
- //conf.set("fs.defaultFS","hdfs://node1:8020");
- conf.set("fs.defaultFS","hdfs://192.168.31.201:8020");
- //创建配置对象实例
- fs = FileSystem.get(conf);
- }
-
- /**
- * 创建文件夹操作
- */
- @Test
- public void mkdir() throws IOException {
- //首先判断文件家是否存在,如果不存在再创建
- String dirString = "/itheima";
- if (!fs.exists(new Path(dirString))){
- fs.mkdirs(new Path(dirString));
- }
- }
-
- /**
- * 上传文件到HDFS
- */
-
- @Test
- public void putFile2HDFS() throws IOException {
- //创建本地文件路径,hdfs上传路径
- String fileScrString = "D:\\hadoop-3.1.4\\README.txt";
- String fileDstString = "/itheima/README.txt";
- Path src = new Path(fileScrString);
- Path dst = new Path(fileDstString);
- fs.copyFromLocalFile(src,dst);
- }
-
- /**
- * 下载文件
- * @throws IOException
- */
-
- @Test
- public void getFile2HDFS() throws IOException {
- //源路径
- String fileScrString = "/tmp/small/1.txt";
- String fileDstString = "D:\\hadoop-3.1.4\\README.txt";
- Path src = new Path(fileScrString);
- Path dst = new Path(fileDstString);
- fs.copyToLocalFile(src,dst);
- }
-
-
-
- /**
- * 关闭客户端和hfds连接
- */
- @After
- public void close(){
- //首先判断文件系统对象是否为空,如果不为空,进行关闭
- if (fs!=null){
- try {
- fs.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- }
下载文件错误
因为不是编译源码的问题。缺失
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。