一、分布式文件存储面临的挑战
1.海量数据存储问题 采用多台服务器,支持横向扩展 2.海量数据问题查询便捷问题 使用元数据记录文件和机器的位置信息 3.大文件传输效率慢问题 分块存储,分别存储在多台机器上,并行操作提高效率 4.数据丢失问题 冗余存储,多副本机制 5.解决用户查询视角统一规整问题 可以报分布式文件系统的元数据记录抽象为统一的目录树结构,类似传统的操作系统
二、HDFS应用场景
适合场景 1.主要以流式读取数据,主要用于批处理,相较于数据访问的反应时间,更注重数据访问的吞吐量 2.HDFS支持大文件,典型的文件大小是GB到TB级别 3.HDFS对文件的要求是 write-one-read-many访问模型,一个文件一旦创建、写入、关闭之后就不需要修改了 不适合场景 1.小文件 2.数据交互式访问 3.频繁任意修改 4.低延迟处理
三、HDFS特性
1.主从架构 HDFS采用master/slave架构。一般一个HDFS集群是有一个Namenode和一定数目的Datanode组成。Namenode是HDFS主节点,Datanode是HDFS从节点,两种角色各司其职,共同协调完成分布式的文件存储服务 Namenode:管理文件系统元数据信息 Datanode:负责数据存储 2.分块存储 HDPS中的文件在物理上是分块存储(block)的,块的大小可以通过配置参数来规定,参数位于hdfs-default.xml中: dfs.blocksize。默认大小是128M (134217728) 3.副本机制 文件的所有block都会有副本,默认值为3(3副本)。每个文件的block大小(dfs.blocksize)和副本系数(dfs.replication)都是可配置的。副本系数可以在文件创建的时候指定,也可以在之后通过命令改变 4.namespace HDFS支持传统的层次型文件组织结构。用户可以创建目录,然后将文件保存在这些目录里。文件系统名字空间的层次结构和大多数现有的文件系统类似∶用户可以创建、删除、移动或重命名文件。 Namenode负责维护文件系统的namespace名称空间,任何对文件系统名称空间或属性的修改都将被Namenode记录下来。 5.元数据管理 在HDFS中,Namenode管理的元数据具有两种类型: 文件自身属性信息 文件名称、权限,修改时间,文件大小,副本数,数据块大小。 文件块位置映射信息 记录文件块和DataNode之间的映射信息,即哪个块位于哪个节点上。 6.数据块存储 文件的各个block的具体存储管理由DataNode节点承担。每一个block都可以在多个DataNode上存储
四、HDFS Shell CLI使用
参考:https://hadoop.apache.org/docs/r3.1.4/hadoop-project-dist/hadoop-hdfs/HDFSCommands.html
1.创建目录 hdfs dfs -mkdir /{source,common,workspace,tmp,warehouse} #如果是非/目录,可以添加-p地柜创建 hdfs dfs -ls / #-h 适合人类查看的格式 -R 递归查看 2.上传文件 hddoop fs -put [-f] [-p] <localsrc> <dst> # -f 强制覆盖 -p 保留访问和修改时间,所有权和权限 localsrc 本地文件系统 dst HDFS hadoop fs -mkdir -p /source/weibo/star/comment_log/20221227_hdp01.dialev.com hadoop fs -put caixukun.csv /source/weibo/star/comment_log/20221227_hdp01.dialev.com/ hadoop fs -ls -h /source/weibo/star/comment_log/20221227_hdp01.dialev.com/ Found 1 items -rw-r--r-- 2 root supergroup 2.4 M 2022-12-27 13:40 /source/weibo/star/comment_log/20221227_hdp01.dialev.com/caixukun.csv hddoop fs -moveFromLocal #和put类似,但是上传完成后文件会被删除 3.查看文件 hadoop fs -cat <src> #读取文件全部内容显示再标准输出控制台,大文件慎重 hadoop fs -head <file> #查看文件前1KB内容 hadoop fs tail [-f] <file> #查看文件最后1KB内容 4.下载文件 hadoop fs -get [-f] [-p] <src> <localdst> #从HDFS下载文件 -f 覆盖本地已存在目录 -p 保留访问和修改时间,所有权和权限 hadoop fs -getmerge [nl] [-skip-empty-file] <src> <localdst> #下载多个文件到本地合成成一个文件 -nl 每个文件末尾添加换行符 5.追加数据到文件 hadoop fs -appendToFile <localsrc> <dst> #如果dst不存在则创建,如果未-则表示从标准输入中获取 6.查看磁盘空间大小 hadoop fs -df [h] <path> #显示文件系统容量即使用大小 hadoop fs -du -s -h <path> # -s显示指定路径文件长度的汇总摘要 7.文件移动 hadoop fs -mv [-f] <src> <localdst> 8.修改指定文件副本个数 hadoop fs -setrep [-R] [-w] <rep> <path> # -w 命令行等待副本修改完毕,时间可能会比较长
hdfs hadoop 命令区别
hdfs dfs options(只能操作HDFS系统相关包括local FS) hadoop fs optinos(任意操作系统) https://hadoop.apache.org/docs/r3.1.4/hadoop-project-dist/hadoop-common/FileSystemShell.html
Java Cli API
Configuration 配置对象类,用于加载或设置参数属性 FileSystem 文件系统对象基类。针对不同文件系统有不同具体实现。该类封装了文件系统的相关操作方法。 1.pom.xml文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.dialev.hadoop</groupId> <artifactId>example-hdfs</artifactId> <version>1.0-SNAPSHOT</version> <properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <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> </project> =============================================================================================================== 2.HDFSClientTest.java文件
package com.dialev.hadoop; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.yarn.webapp.hamlet2.Hamlet; import org.junit.After; import org.junit.Before; import org.junit.Test; import java.io.IOException; public class HDFSClientTest { private static Configuration conf = null; private static FileSystem fs = null; @Before public void connect2HDFS() throws IOException { // 创建配置对象实例 conf = new Configuration(); // 设置连接用户,默认为当前登录用户 System.setProperty("HADOOP_USER_NAME","root"); // https://github.com/steveloughran/winutils 下载winutils到 C:/windows/system32 下,下载Hadoop到本地将HADOOP_HOME指向解压的目录 System.setProperty("HADOOP_HOME","D:\\hadoop-3.1.4"); // 设置操作的文件系统是HDFS 并指定HDFS地址 键值对为core-site.xml中fs.defaultFS配置 conf.set("fs.defaultFS", "hdfs://192.168.1.131:8020"); // 创建FileSystem对象实例 fs = FileSystem.get(conf); } @Test public void mkdir() throws IOException { if (! fs.exists(new Path("/test"))){ fs.mkdirs(new Path("/test")); } } @Test public void getFile2Local() throws IOException { Path src = new Path("/bowen/yarn-env.sh"); Path dst = new Path("C:\\Users\\kaluomei\\Desktop\\yarn-env.sh"); fs.copyToLocalFile(src,dst); } @Test public void putFile2HDFS() throws IOException { Path src = new Path("C:\\Users\\kaluomei\\Desktop\\安装部署手册.docx"); Path dst = new Path("/bowen/安装部署手册.docx"); fs.copyFromLocalFile(src,dst); } @After public void close() throws IOException { // 判断文件系统是否初始化 if (fs != null) { fs.close(); } } }
五、webHDFS
FileSystem URIs vs HTTP URLs · WebHDFS的文件系统schema为webhdfs://。URL格式为: webhdfs://<HOST>:<HTTP_PORT>/<PATH> 效果相当于hdfs://<HOST>:<RPC_PORT>/<PATH>在RESTful风格的API中,相应的HTTP URL格式: http://<HOST>:<HTTP_PORT>/webhdfs/v1/<PATH>?op=... #op后面参数是需要执行的动作 示例:http://192.168.1.131:50070/webhdfs/v1/?op=LISTSTATUS http://192.168.1.131:50070/webhdfs/v1/bowen/t1.txt?op=OPEN&noredirect=false #noredirect指定是否从定向到datanode节点,以设置不跳转,返回一个datanode的链接 参数参考文档:https://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/WebHDFS.html
六、httpFS(HDFS网关代理)
client (http)--> httpFS (WebHTTP)--> HDFS HttpFS本身是Java Web应用程序。使用内置的Jetty服务器对外提供服务。 HttpFS是一个独立于HDFS的服务。本质上是一个代理服务。 1.开启 core-site.xml 添加 <property> <name>hadoop.proxyuser.root.hosts</name> # root.hosts为服务器上用户 <value>*</value> </property> <property> <name>hadoop.proxyuser.root.groups</name> #root.groups同上 <value>*</value> </property> 2.同步配置并重启 hdfs --daemon start httpfs 3.访问 http://192.168.1.131:14000/static/index.html #默认14000端口 /static/index.html 为主页 Namec Descriptione /conf Display configuration properties /jmx Java JMX management interfacee /logLevel Get or set log level per classe /logs Display log filese /stacks Display JVM stackse /static/index.htmle The static home pagee 4.默认访问401,需要认证 http://192.168.1.131:14000/static/index.html?user.name=root http://192.168.1.131:14000/webhdfs/v1?user.name=root&op=LISTSTATUS #使用方法和webhdfs类似,但是更安全和高效
七、HDFS存储
7.1 存储类型
RAM_DISK(内存) SSD(固态) DISK(机械,默认使用) ARCHIVE(高密度存储介质,存储历史数据)
7.2 存储类型配置
配置属性时主动声明。HDFS并没有自动检测的能力。 配置参数dfs.datanode.data.dir = [SSD]file://grid/dn/ssdO 如果目录前没有带上[SSD][DISK] [ARCHIVE][RAM_DISK ]这4种类型中的任何一种,则默认是DISK类型。 vim core-site.xml <property> <name>hadoop.tmp.dir</name> <value>/Hadoop/tmp</value> </property>
7.3 查看当前存储类型
访问http://192.168.1.131:50070/dfshealth.html#tab-datanode ,点击任意datanode节点查看StorageType字段
7.4 存储策略
HOT(默认,所有副本都存储在DISK中) COLD(所有副本存储再ARCHIVE中) WARM(一部分在DISK,一部分在ARCHIVE) ALL_SSD(所有副本都存储到SSD) ONE_SSD(只存储1个副本到SSD,其余存储到DISK中) LAZY_PERSIST(仅限于单副本块,先存储到RAM_DISK,延迟报错到DISK中) 前三种根据冷热数据区分,后三种根据磁盘性质区分。
7.5 查看和设置存储策略
1.hdfs storagepolicies -listPolicies #查看存储策略 2.hdfs storagepolicies -setStoragePolicy -path <path> -policy <policy> # 设置存储策略,path 引用目录或文件的路径 policy 存储策略名称 3.hdfs storagepolicies -unsetStoragePolicy -path <path> # 取消存储策略,取消后该路径将使用父目录存储策略,如果父目录为/,则策略为HOT 4.hdfs storagepolicies -getStoragePolicy -path <path> # 查看路径存储策略
7.6 示例
1.修改datanode存储类型及路径 vim hdfs-site.xml // 修改前 <property> <name>dfs.datanode.data.dir</name> <value>/Hadoop/data</value> </property> //修改后 <property> <name>dfs.datanode.data.dir</name> <value>[DISK]file:///mnt/data/datanode,[ARCHIVE]file:///mnt/data/archive</value> </property> 同步配置(每个datanode也可以根据实际情况单独配置) 重启服务 stop-dfs.sh start-dfs.sh 访问http://192.168.1.131:50070/dfshealth.html#tab-datanode ,点击任意datanode节点查看StorageType字段 2.创建测试目录 hadoop fs -mkdir -p /data/{hot,warm,cold} 3.分别设置三个目录存储策略 hdfs storagepolicies -setStoragePolicy -path /data/hot -policy HOT hdfs storagepolicies -setStoragePolicy -path /data/warm -policy WARM hdfs storagepolicies -setStoragePolicy -path /data/cold -policy COLD hdfs storagepolicies -getStoragePolicy -path /data/hot 4.上传测试文件(文件任意) hadoop fs -put anaconda-ks.cfg /data/hot hadoop fs -put anaconda-ks.cfg /data/warm hadoop fs -put anaconda-ks.cfg /data/cold 5.验证结果 hdfs fsck /data/hot/anaconda-ks.cfg -files -blocks -locations #查看HOT储存 ...... /data/hot/anaconda-ks.cfg 1290 bytes, replicated: replication=2, 1 block(s): OK #总共两个副本 0. BP-631728325-192.168.1.131-1672044003397:blk_1073741941_1117 len=1290 Live_repl=2 [DatanodeInfoWithStorage[192.168.1.132:9866,DS-9e039269-bed9-42a5-a79a-3a3b1bf2ab0a,DISK], DatanodeInfoWithStorage[192.168.1.131:9866,DS-1be7b9ec-cc5e-406a-bb35-cb0dc56fc5e2,DISK]] #HOT存储两个副本都存储在DISK上 ...... hdfs fsck /data/warm/anaconda-ks.cfg -files -blocks -locations #查看WARM储存 ...... /data/warm/anaconda-ks.cfg 1290 bytes, replicated: replication=2, 1 block(s): OK 0. BP-631728325-192.168.1.131-1672044003397:blk_1073741942_1118 len=1290 Live_repl=2 [DatanodeInfoWithStorage[192.168.1.132:9866,DS-ecfa1d69-9ae6-4bda-862f-593c74b9159e,ARCHIVE], DatanodeInfoWithStorage[192.168.1.131:9866,DS-1be7b9ec-cc5e-406a-bb35-cb0dc56fc5e2,DISK]] #WARM存储两个副本一个在DISK上,一个在ARCHIVE上 hdfs fsck /data/cold/anaconda-ks.cfg -files -blocks -locations #查看COLD储存 ...... /data/cold/anaconda-ks.cfg 1290 bytes, replicated: replication=2, 1 block(s): OK 0. BP-631728325-192.168.1.131-1672044003397:blk_1073741943_1119 len=1290 Live_repl=2 [DatanodeInfoWithStorage[192.168.1.131:9866,DS-499f93c3-61cc-40fb-9c7d-fc81ec773cb3,ARCHIVE], DatanodeInfoWithStorage[192.168.1.133:9866,DS-dc7ea5ce-4dfd-4b4f-a8db-3c465a479670,ARCHIVE]] #COLD存储两个副本都存储在ARCHIVE上 ......
7.7 HDFS内存存储策略支持--LAZY PERSIST介绍
HDFS支持把数据写入由DataNode管理的堆外内存; DataNode异步地将内存中数据刷新到磁盘,从而减少代价较高的磁盘I0操作,这种写入称为 Lazy Persist写入。 1.配置虚拟内存盘(无法直接写入内存,需要借助tmpfs技术) mount -t tmpfs -o size=1g tmpfs /mnt/data/ram_disk 2.创建测试目录 hadoop fs -mkdir -p /data/ram_disk 3.配置目录存储策略 vim hdfs-site.xml <property> <name>dfs.datanode.data.dir</name> <value>[DISK]file:///mnt/data/datanode,[ARCHIVE]file:///mnt/data/archive,[RAM_DISK]file:///mnt/data/ram_disk</value> </property> <!-- 开启异构存储策略 --> <property> <name>dfs.storage.policy.enabled</name> <value>true</value> </property> <property> <!-- 开启缓存,单位字节,配置值根据ulimit -l数值*1024,该值如果过小可能存储回写入到磁盘而不是内存--> <name>dfs.datanode.max.locked.memory</name> <value>65536</value> </property> <!-- 不开启文件权限 --> <property> <name>dfs.permissions</name> <value>false</value> </property> 4.上传目录设置存储策略 hdfs storagepolicies -setStoragePolicy -path /data/ram_disk -policy LAZY_PERSIST #注意此处 path 路径为HDFS路径,配置文件为本地路径 扩展命令: hdfs dfs -mv <src> <dst>
标签:hdfs,存储,fs,HDFS,data,Hadoop,hadoop,数据 From: https://www.cnblogs.com/panwenbin-logs/p/17130603.html