赞
踩
硬盘:
机械硬盘:
固态硬盘:
混合硬盘:
RAID:
RAID技术可以应用于各种数据存储场景,如服务器、网络存储设备、工作站等。RAID技术通过提供更高的数据可靠性和容错能力,保障了数据的安全性和可靠性,提高了数据访问速度和处理能力,提高了数据存储系统的整体性能。
此处推荐大家阅读操作系统导论第38章进行学习:
磁盘是计算机主要的存储介质,可以存储大量的二进制数据,并且断电后也能保持数据不丢失。
早期计算机使用的磁盘是软磁盘(Floppy Disk,简称软盘),如今常用的磁盘是硬磁盘(Hard disk,简称硬盘)
硬盘分为HDD、SSD、SSHD
磁盘阵列(RAID):多块磁盘的组合体,实现不同存储功能
Network-Attached Storage(NAS)是指通过网络连接到计算机或服务器的存储设备,可以在网络上提供文件存储和共享服务。NAS设备通常包括一个或多个硬盘驱动器、固态硬盘或磁带机,它们通过网络连接到本地网络或互联网上的计算机、服务器或其他网络设备。
NAS设备提供了许多优点,例如:
简单易用:NAS设备易于安装、配置和管理,用户只需连接到网络并配置适当的网络设置即可开始使用。
高可靠性:NAS设备通常采用RAID(独立磁盘冗余阵列)技术,提高数据的可靠性和安全性。
资源共享:多个用户可以同时访问NAS设备上的数据和文件,实现资源共享和协作。
可扩展性:通过添加额外的硬盘驱动器或扩展单元,可以轻松扩展存储容量和性能。
远程访问:NAS设备可以通过互联网进行远程访问,用户可以随时随地访问其存储的文件和数据。
尽管NAS设备提供了许多优点,但也存在一些限制。例如,NAS的性能受网络带宽的限制,因此在处理大量数据和高并发访问时可能会出现性能瓶颈。此外,由于NAS设备直接暴露在网络上,安全性也是一个关键问题,因此必须采取适当的安全措施来保护存储设备和数据。
这里重点讲解一下NAS和SAN的区别:
总的来说,SAN和NAS是两种不同的存储方案,它们各有优缺点和适用场景。选择合适的存储方案应该根据企业的实际需求和预算来决定。
文件系统:
文件名:
元数据:
文件系统分类:
如何解决海量数据下存储问题 ?
如何解决海量数据文件查询便捷问题 ?
如何解决大文件传输效率慢的问题 ?
主从架构:
分块存储:
副本机制:
namespace:
元数据管理:
在HDFS中,Namenode管理的元数据具有两种类型:
文件自身属性信息
文件块位置映射信息
数据块存储:
HDFS Shell CLI客户端:
hdfs [OPTIONS] SUBCOMMAND [SUBCOMMAND OPTIONS] SUBCOMMAND:Admin Commands、Client Commands、Daemon Commands。
跟文件系统读写使用相关的命令是 hdfs dfs [generic options]
HDFS Shell CLI客户端–说明:
hdfs dfs -ls file:/// #操作本地文件系统
hdfs dfs -ls hdfs://node1:8020/ #操作HDFS分布式文件系统
hdfs dfs -ls / #直接根目录,没有指定协议 将加载读取fs.defaultFS值
Usage: hadoop fs [generic options]
[-appendToFile <localsrc> ... <dst>]
[-cat [-ignoreCrc] <src> ...]
……
-appendToFile <localsrc> ... <dst> :
Appends the contents of all the given local files to the given dst file. The dst
file will be created if it does not exist. If <localSrc> is -, then the input is
read from stdin.
-cat [-ignoreCrc] <src> ... :
Fetch all files that match the file pattern <src> and display their content on
stdout.
hadoop fs -mkdir [-p] <path> ...
path为待创建的目录
-p选项的行为与Unix mkdir -p非常相似,它会沿着路径创建父目录
hadoop fs -mkdir -p /xpy/dhy/test
hadoop fs -ls [-h] [-R] [<path> ...]
path 指定目录路径
-h 人性化显示文件size
-R 递归查看指定目录及其子目录
hadoop fs -ls -h -R /xpy
hadoop fs -put [-f] [-p] <localsrc> ... <dst>
-f 覆盖目标文件(已存在下)
-p 保留访问和修改时间,所有权和权限。
localsrc 本地文件系统(客户端所在机器)
dst 目标文件系统(HDFS)
hadoop fs -put hadoop-root-datanode-iZ0jl31cusuwz95ltn0gzfZ.log /xpy/dhy/test
hadoop fs -moveFromLocal <localsrc> ... <dst>
和-put功能意义,只不过上传结束,源数据会被删除
hadoop fs -moveFromLocal test.txt /xpy/dhy/test
hadoop fs -cat <src> ...
读取指定文件全部内容,显示在标准输出控制台。
注意:对于大文件内容读取,慎重。
hadoop fs -cat /xpy/dhy/test/test.txt
hadoop fs -head <file>
hadoop fs -head /xpy/dhy/test/hadoop-root-datanode-iZ0jl31cusuwz95ltn0gzfZ.log
hadoop fs -tail [-f] <file>
-f选择可以动态显示文件中追加的内容
hadoop fs -tail /xpy/dhy/test/hadoop-root-datanode-iZ0jl31cusuwz95ltn0gzfZ.log
hadoop fs -get [-f] [-p] <src> ... <localdst>
下载文件到本地文件系统指定目录,localdst必须是目录
-f 覆盖目标文件(已存在下)
-p 保留访问和修改时间,所有权和权限。
hadoop fs -get /xpy/dhy/test/hadoop-root-datanode-iZ0jl31cusuwz95ltn0gzfZ.log ./
hadoop fs -getmerge [-nl] [-skip-empty-file] <src> <localdst>
下载多个文件合并到本地文件系统的一个文件中。
-nl选项表示在每个文件末尾添加换行符
hadoop fs -getmerge -nl -skip-empty-file /xpy/dhy/test/hadoop-root-datanode-iZ0jl31cusuwz95ltn0gzfZ.log /xpy/dhy/test/test.txt ./merge.txt
hadoop fs -cp [-f] <src> ... <dst>
-f 覆盖目标文件(已存在下)
本地文件复制到HDFS中 --> hadoop fs -cp file:///home/user/file.txt hdfs://namenode:9000/path/to/destination
在HDFS中复制文件 --> hadoop fs -cp hdfs://namenode:9000/path/to/source hdfs://namenode:9000/path/to/destination
(不加hdfs://,默认采用hdfs文件传输协议)
hadoop fs -appendToFile <localsrc> ... <dst>
将所有给定本地文件的内容追加到给定dst文件。
dst如果文件不存在,将创建该文件。
如果<localSrc>为-,则输入为从标准输入中读取。
hadoop fs -appendToFile - /xpy/dhy/test/test1.txt
hadoop fs -df [-h] [<path> ...]
显示文件系统的容量,可用空间和已用空间
hadoop fs -df -h /
hadoop fs -du [-s] [-h] <path> ...
-s:表示显示指定路径文件长度的汇总摘要,而不是单个文件的摘要。
-h:选项将以“人类可读”的方式格式化文件大小
hadoop fs -du -s -h -v /xpy/dhy/test/hadoop-root-datanode-iZ0jl31cusuwz95ltn0gzfZ.log
hadoop fs -mv <src> ... <dst>
移动文件到指定文件夹下
可以使用该命令移动数据,重命名文件的名称
hadoop fs -setrep [-R] [-w] <rep> <path> ...
修改指定文件的副本个数。
-R表示递归 修改文件夹下及其所有
-w 客户端是否等待副本修改完毕。
HDFS在生产应用中主要是Java客户端的开发,其核心步骤是从HDFS提供的API中构造一个HDFS的访问客户端对象,然后通过该客户端对象操作(增删改查)HDFS上的文件。
客户端核心类:
引入依赖:
<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-hdfs</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>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>
创建测试用例:
/** * hdfs客户端测试类 */ public class HDFSClientTest { private Configuration conf = null; private FileSystem fs = null; @Before public void connect2HDFS() throws IOException { //创建配置对象实例 conf = new Configuration(); //设置操作的文件系统是HDFS conf.set("fs.defaultFS", "hdfs://主机名或者外网ip地址:8020"); //创建FileSystem实例 此处通过conf设置 代表的是分布式文件系统 fs = FileSystem.get(conf); } @After public void closeConnect() { //如果文件系统连接没有关闭 关闭连接 if (fs != null) { try { fs.close(); } catch (IOException e) { e.printStackTrace(); } } } }
我的HDFS集群部署在三台云服务器上,并且处于不同的局域网中,两台阿里云,一台华为云,此时我们的客户端如果按照上面配置的方式尝试通过外网访问nameNode节点监听的8020端口,可能会抛出Connection Refused异常。
解决这个问题的思路如下:
netstat -nltp|grep 8020
命令查看8020端口是否处于监听状态,特别注意观察: 8020端口是只在127.0.0.1地址上进行监听,还是0.0.0.0监听全部ip地址。
hdfs-site.xml
中添加以下属性配置, 这样,NameNode 就会绑定到所有可用的IP地址上,包括外网IP,从而可以通过外网IP访问了。记得重启 NameNode 服务使配置生效。<property>
<name>dfs.namenode.rpc-bind-host</name>
<value>0.0.0.0</value>
</property>
<property>
<name>dfs.namenode.servicerpc-bind-host</name>
<value>0.0.0.0</value>
</property>
再次使用netstat命令验证是否在8020端口上监听所有ip地址:
如果想要验证此时能否通过外网访问nameNode的8020端口,可以在外网的一台主机上使用telnet nameNode的ip地址 8020
命令验证验证能否正常访问:
如果还是不行,记得检查防火墙是否开放了8020端口哦!
dfs.client.use.datanode.hostname
是Hadoop
配置文件中的一个属性,配置该参数为true
后,客户端向NameNode
请求数据块的时候,NameNode
会将DataNode
的主机名(hostname
)信息返回给客户端,而不是返回DataNode
的IP
地址。这样可以确保客户端始终能够正确地访问到DataNode
,避免了由于IP
地址变更导致的连接错误。
该参数默认值为false
我们可以在服务端的hdfs-site.xml
配置文件中配置该参数:
<property>
<name>dfs.client.use.datanode.hostname</name>
<value>true</value>
</property>
也可以在客户端中通过代码指定:
@Before
public void connect2HDFS() throws IOException {
conf = new Configuration();
conf.set("dfs.client.use.datanode.hostname", "true");
conf.set("fs.defaultFS", "hdfs://node1:8020");
fs = FileSystem.get(conf);
}
那么大家思考这两种方式有什么区别呢?
dfs.client.use.datanode.hostname
参数值取true,忽略默认值原因:以Windows登录用户访问HDFS,而该用户不具备在HDFS操作权限
解决:
展示第二种方法对应的代码:
@Before
public void connect2HDFS() throws IOException {
conf = new Configuration();
//设置客户端身份
System.setProperty("HADOOP_USER_NAME","root");
conf.set("dfs.client.use.datanode.hostname", "true");
conf.set("fs.defaultFS", "hdfs://node1:8020");
fs = FileSystem.get(conf);
}
@Test
public void mkdir() throws IOException {
if (!fs.exists(new Path("/hdfsClientTest"))) {
fs.mkdirs(new Path("/hdfsClientTest"));
}
}
@Test
public void putFile2HDFS() throws IOException {
//本地文件路径
Path src = new Path("a.txt");
//hdfs目标路径
Path dst = new Path("/hdfsClientTest");
//上传文件
fs.copyFromLocalFile(src, dst);
}
相对路径运行时完整路径是什么,取决于当前程序的工作目录在哪里,大家可以查看一下:
如果出现:
java.io.IOException: java.nio.channels.UnresolvedAddressException
异常,说明nameNode返回给客户端的dataNode的ip地址或者主机名不正确。
使用下面这段代码可以查看nameNode返回给客户端的dataNode列表,可以打印出来,查看dataNode的ip地址和hostName是不是期望值:
DistributedFileSystem dfs = (DistributedFileSystem) fs;
DatanodeInfo[] datanodes = dfs.getDataNodeStats();
for (DatanodeInfo datanode : datanodes) {
System.out.println("DataNode Hostname: " + datanode.getHostName());
System.out.println("DataNode IP Address: " + datanode.getIpAddr());
}
如果是主机名不正确,确认一下是否已经配置好相关映射,如果配置了,查看/etc/hosts文件中是否存在多个本地127.0.0.1地址的映射,如果存在,将多余的去掉。
@Test
public void getFile2Local() throws IOException {
//hdfs文件路径
Path src = new Path("/hdfsClientTest/a.txt");
//本地文件路径
Path dst = new Path("abc.txt");
//下载文件
fs.copyToLocalFile(src, dst);
}
这里可能会抛出找不到winutils.exe、HADOOP_HOME没有设置的异常。
hadoop报错:ExitCodeException exitCode=-1073741515
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。