河北软件开发网站建设,o2o网站系统建设,河南省住房和建设厅安监站网站,怎么进网站Hadoop是一个开源的分布式系统架构#xff0c;旨在解决海量数据的存储和计算问题#xff0c;Hadoop的核心组件包括Hadoop分布式文件系统#xff08;HDFS#xff09;、MapReduce编程模型和YARN资源管理器,最近需求需要用到HDFS和YARN。 文章目录 HDFS优缺点HDFS的读写原理 常… Hadoop是一个开源的分布式系统架构旨在解决海量数据的存储和计算问题Hadoop的核心组件包括Hadoop分布式文件系统HDFS、MapReduce编程模型和YARN资源管理器,最近需求需要用到HDFS和YARN。 文章目录 HDFS优缺点HDFS的读写原理 常用命令HDFS 的 API 操作 HDFS
HDFS在Hadoop中负责数据的存储是一个分布式文件系统。HDFS的主要角色包括以下几种
NameNode(nn)负责存储文件的元数据包括文件名、目录结构、文件属性此外还记录了每个文件的块列表以及这些块分别存储在哪些DataNode上。DataNode (dn)在本地文件系统中保存文件的实际数据块客户端通过dn对数据块进行读/写操作同时还存储这些数据块的校验和以确保数据的完整性。Secondary NameNode (2nn)定期对NameNode的元数据进行备份操作以防数据丢失。Client客户端负责先与NameNode交互获取文件的位置信息后再与DataNode交互进行数据的读写操作。
优缺点
优点
高容错性数据会进行多个备份当其中一个备份丢失时系统能够自动进行恢复。 处理大规模数据无论是大规模数据还是大量的文件都能够有效地进行处理。
缺点
延迟较高不适用于快速响应的场景例如毫秒级别的数据访问无法实现。 小文件存储效率低下当存储大量小文件时会大量占用NameNode的内存来记录文件目录和块信息而NameNode的内存资源是有限的并且小文件的寻址时间可能会超过实际的读取时间。 写入和修改的限制不支持多个线程同时对同一个文件进行写入操作且只能对文件进行追加操作不能对文件内容进行随机修改。
文件块大小
在Hadoop 1.x版本里默认的文件块大小为64MB在2.x和3.x版本中为128MB当寻址时间为传输时间的百分之一是最佳状态如果单个文件块过小那么大文件会被切割为很多块从而增加寻址时间反之若文件块过大那么传输时间会远大于寻址时间。
HDFS的读写原理
(1)文件写入原理
(2) 网络拓扑-节点距离计算 在HDFS进行数据写入时NameNode会选择与待上传数据距离最近的DataNode来接收并存储这些数据。 节点距离的计算方式两个节点到达最近的共同祖先的距离总和。
3机架感知原理-副本存储节点选择 副本节点选择
第一个副本在Client所处的节点上如果客户端在集群外随机选一个。第二个副本在另一个机架的随机一个节点。第三个副本在第二个副本所在机架的随机节点 4读文件原理
5NN 和 2NN 工作原理 NameNode 中的元数据存放在内存中当对元数据进行更新或者添加操作时会修改内存中的元数据并追加到 edits log 中为了防止edits log过大导致查询效率低的问题SecondaryNameNode会定时触发checkpoint操作将NameNode的edits log和fs image合并生成一个新的fs image以减少edits log的大小并将新的fs image传回给NameNode以提高元数据的查询效率。
6DataNode工作原理
常用命令
1查看命令帮助
hadoop fs -help rm2启动Hadoop集群
sbin/start-dfs.shsbin/start-yarn.sh3创建文件夹
hadoop fs -mkdir /learn4上传文件
-put和copyFromLocal一样生产环境更多用 put
vim a.txt
aaa
bbb
hadoop fs -put a.txt /learn-moveFromLocal从本地移动到 HDFS
hadoop fs -moveFromLocal b.txt /learn-copyFromLocal从本地文件拷贝文件到 HDFS
hadoop fs -copyFromLocal c.txt /learn-appendToFile追加一个文件到HDFS已经存在的文件末尾
hadoop fs -appendToFile d.txt /learn/c.txt(5)下载文件
-get和copyToLocal一样生产环境更习惯用 get
hadoop fs -get /learn ./-copyToLocal从 HDFS 拷贝到本地
hadoop fs -copyToLocal /data ./6其他操作
-mkdir创建目录
hadoop fs -mkdir /file-ls: 显示目录信息
hadoop fs -ls /learn-cat显示文件内容 -chgrp、-chmod、-chown修改文件所属权限
hadoop fs -chmod 777 /learn/a.txt-cp从 HDFS 的一个路径拷贝到 HDFS 的另一个路径
hadoop fs -cp /learn/a.txt /file-mv在 HDFS 目录中移动文件
hadoop fs -mv /learn/b.txt /file2-tail显示一个文件的末尾 1kb 的数据
hadoop fs -tail /learn/a.txt-rm删除文件或文件夹
hadoop fs -rm /learn/a.txt-rm -r递归删除目录及目录里面内容
hadoop fs -rm -r /learn-du 统计文件夹的大小信息
hadoop fs -du /file27 表示文件大小21 表示 3个副本的总大小
-setrep设置 HDFS 中文件的副本数量
hadoop fs -setrep 10 /file2目前只有3台节点最多也就3个副本当节点数增加到10时副本数才能到10。
HDFS 的 API 操作
1创建目录
public class HdfsLearn {Testpublic void testCreate() throws IOException, URISyntaxException, InterruptedException {Configuration configuration new Configuration();FileSystem fs FileSystem.get(new URI(hdfs://192.168.235.130:8020), configuration, liang);fs.mkdirs(new Path(/learn/file.txt));fs.close();}
}(2)上传文件
Test
public void testCopyFromLocalFile() throws IOException, InterruptedException, URISyntaxException {Configuration configuration new Configuration();configuration.set(dfs.replication, 3);FileSystem fs FileSystem.get(new URI(hdfs://192.168.235.130:8020), configuration, liang);fs.copyFromLocalFile(new Path(D:\\hadoop\\learn.txt), new Path(/test/file4));fs.close();
}3下载文件
Test
public void testCopyToLocalFile() throws IOException,InterruptedException, URISyntaxException{Configuration configuration new Configuration();FileSystem fs FileSystem.get(new URI(hdfs://192.168.235.130:8020), configuration, liang);// boolean delSrc 指是否将原文件删除// Path src 指要下载的文件路径// Path dst 指将文件下载到的路径// boolean useRawLocalFileSystem 是否开启文件校验fs.copyToLocalFile(false, new Path(/learn/a.txt), new Path(D:\\hadoop\\b.txt), true);fs.close();
}4文件移动或者更名
Test
public void testRename() throws IOException, InterruptedException, URISyntaxException {Configuration configuration new Configuration();FileSystem fs FileSystem.get(new URI(hdfs://192.168.235.130:8020), configuration, liang);fs.rename(new Path(/learn/a.txt), new Path(/learn/b.txt));fs.close();
}(5)删除文件
Test
public void testDelete() throws IOException, InterruptedException, URISyntaxException{Configuration configuration new Configuration();FileSystem fs FileSystem.get(new URI(hdfs://192.168.235.130:8020), configuration, liang);fs.delete(new Path(/file2), true);fs.close();
}6文件详情查看
Test
public void testListFiles() throws IOException, InterruptedException, URISyntaxException {Configuration configuration new Configuration();FileSystem fs FileSystem.get(new URI(hdfs://192.168.235.130:8020), configuration, liang);// 获取文件详情RemoteIteratorLocatedFileStatus listFiles fs.listFiles(new Path(/), true);while (listFiles.hasNext()) {LocatedFileStatus fileStatus listFiles.next();System.out.println(fileStatus.getPath());System.out.println(fileStatus.getPermission());System.out.println(fileStatus.getOwner());System.out.println(fileStatus.getGroup());System.out.println(fileStatus.getLen());System.out.println(fileStatus.getModificationTime());System.out.println(fileStatus.getReplication());System.out.println(fileStatus.getBlockSize());System.out.println(fileStatus.getPath().getName());// 获取块信息BlockLocation[] blockLocations fileStatus.getBlockLocations();System.out.println(Arrays.toString(blockLocations));}fs.close();
}7文件判断
Test
public void testListStatus() throws IOException, InterruptedException, URISyntaxException {Configuration configuration new Configuration();FileSystem fs FileSystem.get(new URI(hdfs://192.168.235.130:8020), configuration, liang);// 判断是文件还是文件夹FileStatus[] listStatus fs.listStatus(new Path(/));for (FileStatus fileStatus : listStatus) {// 如果是文件if (fileStatus.isFile()) {System.out.println(f: fileStatus.getPath().getName());} else {System.out.println(d: fileStatus.getPath().getName());}}fs.close();
}