本文共 19975 字,大约阅读时间需要 66 分钟。
下面是HDFS的具体知识点,
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VfvS5VMh-1615988526507)(assets/image-20200414133443007.png)]
Apache Lucene是一个文本搜索系统库
Apache Nutch作为前者的一部分
Hadoop最早起源于Nutch。Nutch的设计目标是构建一个大型的全网搜索引擎,包括网页抓取、索引、查询等功能,但随着抓取网页数量的增加,遇到了严重的可扩展性问题——如何解决数十亿网页的存储和索引问题。
2003年、2004年谷歌发表的两篇论文为该问题提供了可行的解决方案。
——分布式文件系统(GFS),可用于处理海量网页的存储
——分布式计算框架MAPREDUCE,可用于处理海量网页的索引计算问题。
Nutch的开发人员2004年、2005年分别完成了相应的开源实现HDFS和MAPREDUCE,并从Nutch中剥离成为独立项目HADOOP,到2008年1月,HADOOP成为Apache顶级项目(同年,cloudera公司成立),迎来了它的快速发展期。
Hadoop作者Doug Cutting
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d0AORLij-1615988526516)(assets/clip_image002.jpg)]
狭义上来说,hadoop就是单独指代hadoop这个软件
广义上来说,hadoop指代大数据的一个生态圈,包括很多其他的软件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0SIyb4tl-1615988526518)(assets/clip_image004.gif)]
0.x系列版本:hadoop当中最早的一个开源版本,在此基础上演变而来的1.x以及2.x的版本
1.x版本系列:hadoop版本当中的第二代开源版本,主要修复0.x版本的一些bug等
2.x版本系列:架构产生重大变化,引入了yarn平台等许多新特性,也是现在生产环境当中使用最多的版本
3.x版本系列:在2.x版本的基础上,引入了一些hdfs的新特性等,且已经发型了稳定版本,未来公司的使用趋势
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uozYyhUB-1615988526519)(assets/clip_image002.gif)]
Hadoop三大发行版本:Apache、Cloudera、Hortonworks。
mapr
Apache Hadoop
官网地址:http://hadoop.apache.org/releases.html
下载地址:https://archive.apache.org/dist/hadoop/common/
Cloudera Hadoop
官网地址:https://www.cloudera.com/downloads/cdh/5-10-0.html
下载地址:http://archive.cloudera.com/cdh5/cdh/5/
Hortonworks Hadoop
官网地址:https://hortonworks.com/products/data-center/hdp/
下载地址:https://hortonworks.com/downloads/#data-platform
注意:Hortonworks已经与Cloudera公司合并
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ImjytRjt-1615988526520)(assets/image-20200414134203318.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xmA15R58-1615988526521)(assets/image-20200414134230170.png)]
关键词:
HDFS模块:
namenode:主节点,主要负责HDFS集群的管理以及元数据信息管理
datanode:从节点,主要负责存储用户数据
secondaryNameNode:辅助namenode管理元数据信息,以及元数据信息的冷备份
Yarn模块:
[1、基础环境及hdfs.docx 中的 演示文稿.pptx](assets\1、基础环境及hdfs.docx 中的 演示文稿.pptx)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7ZKEgWyb-1615988526522)(assets/分布式文件系统.gif)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-og7gfcgG-1615988526522)(assets/image-20200414151259379.png)]
最直观的理解便是三个臭皮匠,顶个诸葛亮。
很多的磁盘加一起就可以装下天下所有的avi
类似于你出五毛,我出五毛,我们一起凑一块的效果
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tlLSi0iW-1615988526523)(assets/block 3副本存储.gif)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l8V1Bxwf-1615988526523)(assets/image-20200414151438737.png)]
分块存储
dfs.blocksize 块大小 以字节为单位
参考默认属性
例如:
如果有一个文件大小为1KB,也是要占用一个block块,但是实际占用磁盘空间还是1KB大小
类似于有一个水桶可以装128斤的水,但是我只装了1斤的水,那么我的水桶里面水的重量就是1斤,而不是128斤
block元数据:每个block块的元数据大小大概为150字节
3副本存储
dfs.replication 3
文件可能大于集群中任意一个磁盘
10T*3/128 = xxx块 10T 文件方式存—–>多个block块,这些block块属于一个文件使用块抽象而不是文件可以简化存储子系统
hdfs将所有的文件全部抽象成为block块来进行存储,不管文件大小,全部一视同仁都是以block块的形式进行存储,方便我们的分布式文件系统对文件的管理
块非常适合用于数据备份;进而提供数据容错能力和可用性
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-r8e5NBG8-1615988526524)(assets/image-20200416160250256.png)]
HDFS集群包括,NameNode和DataNode以及Secondary Namenode。
NameNode与Datanode的总结概述
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2PQfPeBB-1615988526524)(assets/image-20200416160339310.png)]
通常DataNode从磁盘中读取块,但对于访问频繁的文件,其对应的块可能被显示的缓存在DataNode的内存中,以堆外块缓存的形式存在。
默认情况下,一个块仅缓存在一个DataNode的内存中,当然可以针对每个文件配置DataNode的数量。作业调度器通过在缓存块的DataNode上运行任务,可以利用块缓存的优势提高读操作的性能。
例如:
连接(join)操作中使用的一个小的查询表就是块缓存的一个很好的候选。 用户或应用通过在缓存池中增加一个cache directive来告诉namenode需要缓存哪些文件及存多久。缓存池(cache pool)是一个拥有管理缓存权限和资源使用的管理性分组hdfs的文件权限机制与linux系统的文件权限机制类似
r:read w:write x:execute 权限x对于文件表示忽略,对于文件夹表示是否有权限访问其内容
如果linux系统用户zhangsan使用hadoop命令创建一个文件,那么这个文件在HDFS当中的owner就是zhangsan
HDFS文件权限的目的,防止好人做错事,而不是阻止坏人做坏事。HDFS相信你告诉我你是谁,你就是谁
hdfs 权限-》kerberos、ranger、sentry来做
hdfs dfs -help lshadoop fs -help ls #两个命令等价
hdfs dfs -ls /hadoop fs -ls /hdfs dfs -ls -R /
hdfs dfs -touchz /edits.txthdfs dfs -ls /
hadoop fs -appendToFile edit1.xml /edits.txt #将本地磁盘当前目录的edit1.xml内容追加到HDFS根目录 的edits.txt文件
hdfs dfs -cat /edits.txthdfs dfs -text /edits.txt
#用法:hdfs dfs -put /本地路径 /hdfs路径hdfs dfs -put /linux本地磁盘文件 /hdfs路径文件hdfs dfs -copyFromLocal /linux本地磁盘文件 /hdfs路径文件 #跟put作用一样hdfs dfs -moveFromLocal /linux本地磁盘文件 /hdfs路径文件 #跟put作用一样,只不过,源文件被拷贝成功后,会被删除
hdfs dfs -get /hdfs路径 /本地路径hdfs dfs -copyToLocal /hdfs路径 /本地路径 #根get作用一样
hdfs dfs -mkdir /shell
hdfs dfs -rm /edits.txt将文件彻底删除(被删除文件不放到hdfs的垃圾桶里)how?hdfs dfs -rm -skipTrash /xcall
hdfs dfs -mv /xcall.sh /call.shhdfs dfs -mv /call.sh /shell
hdfs dfs -cp /xrsync.sh /shell
hdfs dfs -rm -r /shell
hdfs dfs -ls file:///home/hadoop/
# linux find命令find . -name 'edit*'# HDFS find命令hadoop fs -find / -name part-r-00000 # 在HDFS根目录中,查找part-r-00000文件
输入hadoop fs 或hdfs dfs,回车,查看所有的HDFS命令
许多命令与linux命令有很大的相似性,学会举一反三
有用的help,如查看ls命令的使用说明:hadoop fs -help ls
绝大多数的大数据框架的命令,也有类似的help信息
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UxSNLBXL-1615988526525)(assets/image-20200925151612455.png)]
[hadoop@node01 hadoop]$ hdfs dfsadmin -safemode Usage: hdfs dfsadmin [-safemode enter | leave | get | wait]
先设置一下IDEA中的maven
- 指定自己安装的maven
- 指定settings.xml
- 指定本地仓库路径
3.1.4 org.apache.hadoop hadoop-client ${hadoop.version} org.apache.hadoop hadoop-common ${hadoop.version} org.apache.hadoop hadoop-hdfs ${hadoop.version} org.apache.hadoop hadoop-mapreduce-client-core ${hadoop.version} junit junit 4.11 test org.testng testng RELEASE log4j log4j 1.2.17 org.apache.maven.plugins maven-compiler-plugin 3.0 1.8 1.8 UTF-8 org.apache.maven.plugins maven-shade-plugin 2.4.3 package shade true
注意依赖下载:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eagDnc4d-1615988526525)(assets/image-20200925170117276.png)]
编写测试代码
如何熟悉框架api
一、
二、工程关联框架源码
创建文件夹
编程时,注意导入正确的包
小技巧:让IDEA自动导包
//简化版 @Test public void mkDirOnHDFS() throws IOException { //配置项 Configuration configuration = new Configuration(); //设置要连接的hdfs集群 configuration.set("fs.defaultFS", "hdfs://node01:8020"); //获得文件系统 FileSystem fileSystem = FileSystem.get(configuration); //调用方法创建目录;若目录已经存在,则创建失败,返回false boolean mkdirs = fileSystem.mkdirs(new Path("/kaikeba/dir1")); //释放资源 fileSystem.close(); } //指定目录所属用户 @Test public void mkDirOnHDFS2() throws IOException, URISyntaxException, InterruptedException { //配置项 Configuration configuration = new Configuration(); //获得文件系统 FileSystem fileSystem = FileSystem.get(new URI("hdfs://node01:8020"), configuration, "test"); //调用方法创建目录 boolean mkdirs = fileSystem.mkdirs(new Path("/kaikeba/dir2")); //释放资源 fileSystem.close(); } //创建目录时,指定目录权限 @Test public void mkDirOnHDFS3() throws IOException { Configuration configuration = new Configuration(); configuration.set("fs.defaultFS", "hdfs://node01:8020"); FileSystem fileSystem = FileSystem.get(configuration); FsPermission fsPermission = new FsPermission(FsAction.ALL, FsAction.READ, FsAction.READ); boolean mkdirs = fileSystem.mkdirs(new Path("hdfs://node01:8020/kaikeba/dir3"), fsPermission); if (mkdirs) { System.out.println("目录创建成功"); } fileSystem.close(); }
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-btp0Vgf6-1615988526526)(assets/image-20201029205741024.png)]
/** * 说明: * 将文件hello.txt上传到/kaikeba/dir1 * 如果路径/kaikeba/dir1不存在,那么结果是: * 在hdfs上先创建/kaikeba目录 * 然后,将upload.txt上传到/kaikeba中,并将文件upload.txt重命名为dir1 * 如果路径/kaikeba/dir1存在,那么将hello.txt上传到此路径中去 * * @throws IOException */ @Test public void uploadFile2HDFS() throws IOException { Configuration configuration = new Configuration(); configuration.set("fs.defaultFS", "hdfs://node01:8020"); FileSystem fileSystem = FileSystem.get(configuration); fileSystem.copyFromLocalFile(new Path("file://E:\\模块化课程\\hadoop 3.x全解析\\2、HDFS\\3、数据\\hello.txt"), new Path("/kaikeba/dir1"));//hdfs路径 fileSystem.close(); }
@Test public void downloadFileFromHDFS() throws IOException { Configuration configuration = new Configuration(); configuration.set("fs.defaultFS", "hdfs://node01:8020"); FileSystem fileSystem = FileSystem.get(configuration); fileSystem.copyToLocalFile(new Path("hdfs://node01:8020/kaikeba/dir1/hello.txt"), new Path("file:///C:\\mydata\\hello.txt")); //删除文件 //fileSystem.delete() //重命名文件 //fileSystem.rename() fileSystem.close(); }
@Test public void viewFileInfo() throws IOException, InterruptedException, URISyntaxException { // 1获取文件系统 Configuration configuration = new Configuration(); FileSystem fs = FileSystem.get(new URI("hdfs://node01:8020"), configuration); // 2 获取文件详情 RemoteIteratorlistFiles = fs.listFiles(new Path("hdfs://node01:8020/kaikeba/"), true); while (listFiles.hasNext()) { LocatedFileStatus status = listFiles.next(); // 输出详情 // 文件名称 System.out.println(status.getPath().getName()); // 长度 System.out.println(status.getLen()); // 权限 System.out.println(status.getPermission()); // 分组 System.out.println(status.getGroup()); // 获取存储的块信息 BlockLocation[] blockLocations = status.getBlockLocations(); for (BlockLocation blockLocation : blockLocations) { // 获取块存储的主机节点 String[] hosts = blockLocation.getHosts(); for (String host : hosts) { System.out.println(host); } } } // 3 关闭资源 fs.close(); }
@Test public void putFileToHDFS() throws IOException, InterruptedException, URISyntaxException { // 1 获取文件系统 Configuration configuration = new Configuration(); FileSystem fs = FileSystem.get(new URI("hdfs://node01:8020"), configuration); // 2 创建输入流 不需要加file:///,否则报错 FileInputStream fis = new FileInputStream(new File("C:\\mydata\\hello.txt")); // 3 获取输出流 父目录不存在,会自动创建 FSDataOutputStream fos = fs.create(new Path("hdfs://node01:8020/kaikeba/dir3/hello.txt")); // 4 流对拷 org.apache.commons.io.IOUtils IOUtils.copy(fis, fos); // 5 关闭资源 IOUtils.closeQuietly(fos); IOUtils.closeQuietly(fis); fs.close(); }
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5k57h3tp-1615988526526)(assets/image-20200925161954948.png)]
自主实现通过IO流从hdfs上面下载文件
提示:fileSystem.open()
hdfs的小文件合并
/** * 小文件合并:读取所有本地小文件,写入到hdfs的大文件里面去 */ @Test public void mergeFile() throws URISyntaxException, IOException, InterruptedException { //获取分布式文件系统hdfs FileSystem fileSystem = FileSystem.get(new URI("hdfs://node01:8020"), new Configuration(), "hadoop"); FSDataOutputStream fsDataOutputStream = fileSystem.create(new Path("hdfs://node01:8020/kaikeba/bigfile.xml")); //获取本地文件系统 localFileSystem LocalFileSystem localFileSystem = FileSystem.getLocal(new Configuration()); //读取本地的文件 FileStatus[] fileStatuses = localFileSystem.listStatus(new Path("file:///E:\\模块化课程\\hadoop 3.x全解析\\2、HDFS\\3、数据\\smallfile")); for (FileStatus fileStatus : fileStatuses) { //获取每一个本地的文件路径 Path path = fileStatus.getPath(); //读取本地小文件 FSDataInputStream fsDataInputStream = localFileSystem.open(path); IOUtils.copy(fsDataInputStream, fsDataOutputStream); IOUtils.closeQuietly(fsDataInputStream); } IOUtils.closeQuietly(fsDataOutputStream); localFileSystem.close(); fileSystem.close(); }
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DAgA7Esr-1615988526526)(assets/image-20200925164802493.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xDcXF7D1-1615988526527)(assets/checkpoint.gif)]
namenode工作机制
(1)第一次启动namenode格式化后,创建fsimage和edits文件。如果不是第一次启动,直接加载编辑日志和镜像文件到内存。
(2)客户端对元数据进行增删改的请求
(3)namenode记录操作日志,更新滚动日志。
(4)namenode在内存中对数据进行增删改查
Secondary NameNode工作
(1)Secondary NameNode询问namenode是否需要checkpoint。直接带回namenode是否检查结果。
(2)Secondary NameNode请求执行checkpoint。
(3)namenode滚动正在写的edits日志
(4)将滚动前的编辑日志和镜像文件拷贝到Secondary NameNode
(5)Secondary NameNode加载编辑日志和镜像文件到内存,并合并。
(6)生成新的镜像文件fsimage.chkpoint
(7) 拷贝fsimage.chkpoint到namenode
(8)namenode将fsimage.chkpoint重新命名成fsimage
属性 | 值 | 解释 |
---|---|---|
dfs.namenode.checkpoint.period | 3600秒(即1小时) | The number of seconds between two periodic checkpoints. |
dfs.namenode.checkpoint.txns | 1000000 | The Secondary NameNode or CheckpointNode will create a checkpoint of the namespace every ‘dfs.namenode.checkpoint.txns’ transactions, regardless of whether ‘dfs.namenode.checkpoint.period’ has expired. |
dfs.namenode.checkpoint.check.period | 60(1分钟) | The SecondaryNameNode and CheckpointNode will poll the NameNode every ‘dfs.namenode.checkpoint.check.period’ seconds to query the number of uncheckpointed transactions. |
dfs.namenode.name.dir file:///kkb/install/hadoop-3.1.4/hadoopDatas/namenodeDatas dfs.namenode.edits.dir file:///kkb/install/hadoop-3.1.4/hadoopDatas/dfs/nn/edits
客户端对hdfs进行写文件时会首先被记录在edits文件中
edits修改时元数据也会更新。
每次hdfs更新时edits先更新后,客户端才会看到最新信息。
fsimage:是namenode中关于元数据的镜像,一般称为检查点。
一般开始时对namenode的操作都放在edits中,为什么不放在fsimage中呢?
因为fsimage是namenode的完整的镜像,内容很大,如果每次都加载到内存的话生成树状拓扑结构,这是非常耗内存和CPU。
fsimage内容包含了namenode管理下的所有datanode中文件及文件block及block所在的datanode的元数据信息。随着edits内容增大,就需要在一定时间点和fsimage合并。
使用命令 hdfs oiv
cd /kkb/install/hadoop-3.1.4/hadoopDatas/namenodeDatas/currenthdfs oiv #查看帮助信息hdfs oiv -i fsimage_0000000000000000864 -p XML -o /home/hadoop/fsimage1.xml
查看命令 hdfs oev
cd /kkb/install/hadoop-3.1.4/hadoopDatas/dfs/nn/edits/currenthdfs oev #查看帮助信息hdfs oev -i edits_0000000000000000865-0000000000000000866 -o /home/hadoop/myedit.xml -p XML
为了保证元数据的安全性
具体配置如下:
hdfs-site.xml
dfs.namenode.name.dir file:///kkb/install/hadoop-3.1.4/hadoopDatas/namenodeDatas,file:///path/to/another/
打开,简单浏览下官网的目录
dn宕机或重启,block副本数变少或变多,nn会如何响应 -> 副本恢复3个
查看linux目录树
sudo yum -y install treetree path
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b9aCjNp1-1615988526527)(assets/image-20201029212854135.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ehOCcXZX-1615988526528)(assets/image-20200930100340138.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dgy13lB7-1615988526528)(assets/image-20201029213157065.png)]
练习:
转载地址:http://fg.baihongyu.com/