下面是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
类似于你出五毛,我出五毛,我们一起凑一块的效果
block块保存数据.pptx
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tlLSi0iW-1615988526523)(assets/block 3副本存储.gif)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l8V1Bxwf-1615988526523)(assets/image-20200414151438737.png)]
分块存储
<property>
<name>dfs.blocksizename>
<value>块大小 以字节为单位value>
property>
hdfs-default.xml参考默认属性
例如:
如果有一个文件大小为1KB,也是要占用一个block块,但是实际占用磁盘空间还是1KB大小
类似于有一个水桶可以装128斤的水,但是我只装了1斤的水,那么我的水桶里面水的重量就是1斤,而不是128斤
block元数据:每个block块的元数据大小大概为150字节
3副本存储
<property>
<name>dfs.replicationname>
<value>3value>
property>
文件可能大于集群中任意一个磁盘
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 ls
hadoop fs -help ls #两个命令等价
hdfs dfs -ls /
hadoop fs -ls /
hdfs dfs -ls -R /
hdfs dfs -touchz /edits.txt
hdfs dfs -ls /
hadoop fs -appendToFile edit1.xml /edits.txt #将本地磁盘当前目录的edit1.xml内容追加到HDFS根目录 的edits.txt文件
hdfs dfs -cat /edits.txt
hdfs 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.sh
hdfs 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
- 指定本地仓库路径
<properties>
<hadoop.version>3.1.4hadoop.version>
properties>
<dependencies>
<dependency>
<groupId>org.apache.hadoopgroupId>
<artifactId>hadoop-clientartifactId>
<version>${hadoop.version}version>
dependency>
<dependency>
<groupId>org.apache.hadoopgroupId>
<artifactId>hadoop-commonartifactId>
<version>${hadoop.version}version>
dependency>
<dependency>
<groupId>org.apache.hadoopgroupId>
<artifactId>hadoop-hdfsartifactId>
<version>${hadoop.version}version>
dependency>
<dependency>
<groupId>org.apache.hadoopgroupId>
<artifactId>hadoop-mapreduce-client-coreartifactId>
<version>${hadoop.version}version>
dependency>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.11version>
<scope>testscope>
dependency>
<dependency>
<groupId>org.testnggroupId>
<artifactId>testngartifactId>
<version>RELEASEversion>
dependency>
<dependency>
<groupId>log4jgroupId>
<artifactId>log4jartifactId>
<version>1.2.17version>
dependency>
dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-compiler-pluginartifactId>
<version>3.0version>
<configuration>
<source>1.8source>
<target>1.8target>
<encoding>UTF-8encoding>
configuration>
plugin>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-shade-pluginartifactId>
<version>2.4.3version>
<executions>
<execution>
<phase>packagephase>
<goals>
<goal>shadegoal>
goals>
<configuration>
<minimizeJar>trueminimizeJar>
configuration>
execution>
executions>
plugin>
plugins>
build>
注意依赖下载:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eagDnc4d-1615988526525)(assets/image-20200925170117276.png)]
编写测试代码
如何熟悉框架api
一、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 获取文件详情
RemoteIterator<LocatedFileStatus> listFiles = 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. |
<property>
<name>dfs.namenode.name.dirname>
<value>file:///kkb/install/hadoop-3.1.4/hadoopDatas/namenodeDatasvalue>
property>
<property>
<name>dfs.namenode.edits.dirname>
<value>file:///kkb/install/hadoop-3.1.4/hadoopDatas/dfs/nn/editsvalue>
property>
客户端对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/current
hdfs 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/current
hdfs oev #查看帮助信息
hdfs oev -i edits_0000000000000000865-0000000000000000866 -o /home/hadoop/myedit.xml -p XML
为了保证元数据的安全性
具体配置如下:
hdfs-site.xml
<property>
<name>dfs.namenode.name.dirname>
<value>file:///kkb/install/hadoop-3.1.4/hadoopDatas/namenodeDatas,file:///path/to/another/value>
property>
打开hadoop的官网,简单浏览下官网的目录
机架感知
dn宕机或重启,block副本数变少或变多,nn会如何响应 -> 副本恢复3个
参考
查看linux目录树
sudo yum -y install tree
tree path
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b9aCjNp1-1615988526527)(assets/image-20201029212854135.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ehOCcXZX-1615988526528)(assets/image-20200930100340138.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dgy13lB7-1615988526528)(assets/image-20201029213157065.png)]
练习: