Hadoop
官网地址;https://hadoop.apache.org/
1, 学习路线
1, hadoop的基本概念和框架
2, Hadoop安装和配置
3, Hadoop的HDFS文件系统
4, Hadoop的MapReduce计算框架
5, Hadoop的YARN资源管理器
6, hadoop的高级特性,如HBase, Hive,pig等
7, hadoop的优化和调优
8, hadoop的应用和场景,如日志分析,数据挖掘等
简介
hadoop是由Apache基金会所发布的开源分布式计算框架,由Java语言编写,主要用于处理大规模数据集的处理和分析。
它基于Google的MapReduce算法和Google文件系统(GFS)的思想,提供一个可靠,高效,可扩展的分布计算方式。
hadoop可以运行在廉价的硬件上,而且提供了高吞吐量,可以通过横向扩展的方式来提高计算能力,因此被广泛应用在大数据处理领域。
三大核心
HDFS(存储系统)
用于存储数据的系统,包含文件系统,数据库系统等。
hadoop,HDFS是hadoop分布式文件系统,他是hadoop中的核心组件之一。
HDFS采用了主从(master/slave)架构,
- Master节点负责管理和调度。
NameNode作为Master节点,负责管理文件系统和命名空间文件块的映射关系。
-
slave节点负责执行具体任务。
DataNode作为slave节点,负责存储文件块和实际数据。
Ø HDFS的特点:具有高可靠性,扩展性,高吞吐量等特点,适合大规模的数据库。
MapReduce(计算环节)
Ø 对存储在存储系统中的数据进行计算的环节,包含数据的读取,处理和输出等。
在hadoop中,MapReduce是hadoop的计算框架
它采用了(map和Reduce)两个阶段:
map阶段:负责将输入的数据切分为若干个小块并对每个小块进行处理,输出中间结果。
Reduce阶段:负责将中间结果合并,得到最终的数据结果。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2NFQZL9z-1688549870320)(file:///C:\Users\锐\AppData\Local\Temp\ksohtml60296\wps2.jpg)]
Ø MapReduce的特点是具有高可靠性,高扩展性,高并发性等特点适合处理大规模数据。
YARN(资源分配)
Ø 将计算任务分配给集群中的各个节点进行处理的过程,包含任务调度,资源管理等。
在Hadoop中,YARN,是hadoop的资源管理系统,它负责集群中各个节点的资源任务管理和任务调度。
YARN采用主从(Master/Slave)架构,
l ResourceManager作为master节点,负责集群中的资源
l NodeManager作为Slave节点,负责管理单个节点资源
Ø YARN的特点具有高可靠性,高可扩展性,高灵活性等特点,适合管理大规模集群的资源。
总结
2.Hadoop的基础操作
- HDFS是Hadoop的分布式文件框架,它的实际目标是能够在普通的硬件上运行,并且能够处理大量的数据。
- HDFS采用主从架构,其中由一个NameNode和多个DataNode
- NameNode负责管理文件系统的命名空间和客户端的访问
- DataNode负责存储实际的数据块
HDFS的基本操作包括文件的上传,下载,删除,重命名等
文件操作
手动创建文件夹:
语法:
hadoop fs -mkdir <HDFS文件路径>
示例:
# 创建文件夹(根目录创建名为input的文件夹)
[root@master ~]# hadoop fs -mkdir /input
# 创建文件夹(根目录创建名为user的文件夹)
[root@master ~]# hdfs dfs -mkdir /user
# 创建多级目录
[root@master ~]# hdfs dfs -mkdir -p /user/resource/example
————————————————
手动上传文件:
语法:
hadoop fs -put <本地文件路径> <HDFS文件路径>
示例:
# 将本地/usr/text.txt 文件上传到input文件下
[root@master ~]# hadoop fs -put /usr/text.txt /input
# 将本地/usr/text.txt 文件上传到input文件下。-copyFromLocal:本地复制
[root@master ~]# hdfs dfs -copyFromLocal /usr/text.txt /user
# 将本地/usr/text.txt 文件上传到input文件下
[root@master ~]# hdfs dfs -put /usr/text.txt /input
# 将本地/usr/text.txt 文件上传到input文件下。-moveFromLocal:本地迁移
[root@master ~]# hdfs dfs -moveFromLocal /usr/text.txt /user
查看文件:
[root@master ~]# hadoop fs -ls /
[root@master ~]# hdfs dfs -ls /
下载文件:
语法:
hadoop fs -get <HDFS文件路径> <本地路径>
hadoop fs -copyToLocal <HDFS文件路径> <本地路径>
示例:
# 将user/text.txt文件下载到本地/usr/local/下 -copyToLocal:复制到本地
[root@master ~]# hadoop fs -copyToLocal /user/text.txt /usr/local/
[root@master ~]# cd /usr/local/
[root@master local]# ll
-rw-r--r--. 1 root root 0 5月 22 09:51 text.txt
[root@master ~]# hdfs dfs -copyToLocal /user/text.txt /usr/local/
[root@master ~]# cd /usr/local/
[root@master local]# ll
-rw-r--r--. 1 root root 0 5月 22 09:51 text.txt
# 将user/text.txt文件下载到本地/usr/local/下
[root@master local]# hadoop fs -get /user/resource/text.txt /usr/local
[root@master local]# ll
-rw-r--r--. 1 root root 0 5月 22 09:54 text.txt
# 将user/text.txt文件下载到本地/usr/local/下
[root@master local]# hdfs dfs -get /user/resource/text.txt /usr/local
[root@master local]# ll
-rw-r--r--. 1 root root 0 5月 22 09:54 text.txt
查看文件内容:
语法:
hdfs dfs -cat <HDFS文件路径>
示例:
[root@master local]# hdfs dfs -cat /input/text.txt
hello ,hadoop
[root@master local]# hdfs dfs -tail /input/text.txt
hello ,hadoop
删除文件:
语法:
hadoop fs -rm <HDFS文件路径>
示例:
# 删除文件夹
[root@master ~]# hdfs dfs -mkdir /user/resource
[root@master ~]# hdfs dfs -rmdir /user/resource
[root@master ~]# hadoop fs -rm -f /user/resource
# 删除文件
[root@master ~]# hdfs dfs -rm /user/resoure/text.txt
[root@master ~]# hadoop fs -rm -r /user/resource/text.txt
文件重命名:
语法:
hadoop fs -mv <HDFS文件路径> <HDFS文件路径>
示例:
[root@master ~]# hadoop fs -mv /input/test.txt /input/demo.txt
查看集群的基本信息
[root@master ~]# hdfs fsck /
Connecting to namenode via http://192.168.184.130:50070/fsck?ugi=root&path=%2F
FSCK started by root (auth:SIMPLE) from /192.168.184.130 for path / at Tue May 23 10:42:27 CST 2023
/input/text.txt: Under replicated BP-399935676-192.168.184.130-1684307575827:blk_1073741825_1001. Target Replicas is 3 but found 1 live replica(s), 0 decommissioned replica(s), 0 decommissioning replica(s).
Status: HEALTHY
Number of data-nodes: 1
Number of racks: 1
Total dirs: 6
Total symlinks: 0
Replicated Blocks:
Total size: 13 B
Total files: 3
Total blocks (validated): 1 (avg. block size 13 B)
Minimally replicated blocks: 1 (100.0 %)
Over-replicated blocks: 0 (0.0 %)
Under-replicated blocks: 1 (100.0 %)
Mis-replicated blocks: 0 (0.0 %)
Default replication factor: 3
Average block replication: 1.0
Missing blocks: 0
Corrupt blocks: 0
Missing replicas: 2 (66.666664 %)
Blocks queued for replication: 0
Erasure Coded Block Groups:
Total size: 0 B
Total files: 0
Total block groups (validated): 0
Minimally erasure-coded block groups: 0
Over-erasure-coded block groups: 0
Under-erasure-coded block groups: 0
Unsatisfactory placement block groups: 0
Average block group size: 0.0
Missing block groups: 0
Corrupt block groups: 0
Missing internal blocks: 0
Blocks queued for replication: 0
FSCK ended at Tue May 23 10:42:27 CST 2023 in 18 milliseconds
The filesystem under path '/' is HEALTHY
在Hadoop的集群的基本信息主要包含分布式文件系统HDFS和分布式资源管理YARN
分布式文件系统HDFS主要包含文件系统的状态,是否有块丢失,备份丢失等,同时包含集群节点状态等。
分布式资源管理YARN主要包含集群节点状态,节点资源(内存,CPU等),队列状态等
Hadoop安全模式
安全模式是保证系统保密性,完整性及可使用性的一种机制,一定程度上可以防止系统里的资源遭到破坏,更改和泄露,使得整个系统持续,可靠的正常运行。
Hadoop集群也有安全模式,在安全模式下可保证Hadoop集群中数据块的安全性。对Hadoop集群可以进行查看安全模式,解除和开启安全模式的操作,
查看namenode是否处于安全模式:
[root@master ~]# hdfs dfsadmin -safemode get
Safe mode is OFF
进入安装模式:
[root@master ~]# hdfs dfsadmin -safemode enter
Safe mode is ON
解除安全模式:
[root@master ~]# hdfs dfsadmin -safemode leave
Safe mode is OFF
执行MapReduce任务:
语法:
hadoop jar <jar包名称> <MapReduce程序类名> <输入路径> <输出路径>
示例:
[root@master ~]# hadoop jar wordcount.jar WordCount /user/hadoop/input /user/hadoop/output
启动集群
启动hadoop集群需要先启动NameNode和DataNode
start-dfs.sh
start-yarn.sh
http://192.168.106.130:8088/cluster
http://192.168.106.130:50070/dfshealth.html#tab-datanode-volume-failures
停止集群
停止hadoop集群需要先停止YARN和HDFS
stop-dfs.sh
start-yarn.sh
官方文档
3.Hadoop之HDFS文件系统入门编程
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.sin</groupId>
<artifactId>hadoop</artifactId>
<version>1.0-SNAPSHOT</version>
<!--依赖版本管理 -->
<properties>
<java.version>1.8</java.version>
<hadoop.version>2.7.7</hadoop.version>
<log4j.version>1.2.14</log4j.version>
<junit.version>4.8.2</junit.version>
</properties>
<dependencies>
<!-- Hadoop Common依赖 -->
<!-- Hadoop Common是Hadoop框架的核心组件,提供了分布式文件系统、分布式计算框架等基础功能 -->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>${hadoop.version}</version>
</dependency>
<!-- Hadoop HDFS依赖 -->
<!-- 它是Hadoop生态系统中的一个核心组件,用于存储和管理大规模数据集 -->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>${hadoop.version}</version>
</dependency>
<!-- Hadoop MapReduce Client Core依赖 -->
<!--
Hadoop的MapReduce客户端核心库
MapReduce是Hadoop的核心计算框架之一,用于处理大规模数据集。MapReduce框架由两个主要组件组成:Map和Reduce。
Map任务将输入数据分解成键值对,然后将这些键值对传递给Reduce任务进行处理。
Reduce任务将相同键的所有值组合在一起,并将它们转换为输出键值对。
-->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-mapreduce-client-core</artifactId>
<version>${hadoop.version}</version>
</dependency>
<!-- hadoop core依赖 -->
<!-- Hadoop -core库是Hadoop框架的核心组件,Hadoop框架是用于处理大型数据集的分布式计算平台 -->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-core</artifactId>
<version>1.2.1</version>
</dependency>
<!-- hadoop client依赖 -->
<!-- 可以在Java项目中使用Hadoop客户端库,从而方便地与Hadoop集群进行交互,例如执行MapReduce任务,操作HDFS文件系统 -->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>${hadoop.version}</version>
</dependency>
<!-- log4j日志 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<!-- junit测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
</dependency>
</dependencies>
</project>
properties
# Add the log4j.properties file content between PRECEDING_CODE and SUFFIX_CODE
# 设置根日志记录器的级别为INFO,并将日志输出到名为stdout的Appender。
log4j.rootLogger=INFO, stdout
# 定义名为stdout的Appender,类型为org.apache.log4j.ConsoleAppender,用于将日志输出到控制台。
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
# 设置stdout Appender的目标输出流为System.out,即标准输出。
log4j.appender.stdout.Target=System.out
# 设置stdout Appender的布局为org.apache.log4j.PatternLayout,用于格式化日志输出。
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
# 设置PatternLayout的转换模式,用于控制日志输出的格式。这里的格式为:日期(年-月-日 时:分:秒)、日志级别、类名(简化)、行号、日志消息和换行符
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
向hdfs中创建目录
private static final Configuration configuration = new Configuration();
//创建URI对象
private static final URI uri = URI.create("hdfs://192.168.106.130:8020/");
@Test
public void testCreate() throws IOException {
FileSystem fileSystem = FileSystem.get(uri, configuration);
//创建目录
fileSystem.mkdirs(new Path("/zll"));
//创建输出完成信息
System.out.println("创建完成" + fileSystem);
}
向hdfs中创建文件,及内容
//创建文件
public void testCreatFile() throws IOException{
FileSystem fileSystem = FileSystem.get(uri, configuration);
//创建文件
Path filePath=new Path("/zll/ac.txt");
//使用FSDataOutputStream,将数据写入到/zl/test.txt
FSDataOutputStream out=fileSystem.create(filePath);
// out.writeUTF("Hello HDFS");
// //关闭流资源
// out.close();
System.out.println("创建成功"+fileSystem+"文件地址"+filePath);
}
从hdfs中下载文件
//下载文件
public void testDownloadFile() throws IOException{
FileSystem fileSystem = FileSystem.get(uri, configuration);
//创建文件
Path filePath=new Path("/gp/ac.txt");
//判断当前文件是否存在
if (fileSystem.exists(filePath)){
fileSystem.copyToLocalFile(filePath,new Path("E:\\hadoop"));
System.out.println("文件下载完成");
}
}
删除文件
//删除文件
public void testDeleteFile() throws IOException{
FileSystem fileSystem = FileSystem.get(uri, configuration);
//定义要删除的文件路径
Path filePath = new Path("/zll");
//如果文件存在
if (fileSystem.exists(filePath)) {
//删除文件
fileSystem.delete(filePath, false);
System.out.println("文件删除成功");
}
}
重命名文件
//重命名文件
public void testRenameFile()throws IOException{
FileSystem fileSystem = FileSystem.get(uri, configuration);
//旧路径(所需修改的文件)
Path oldPath=new Path("/gp");
//新路径(修改后的文件名称)
Path newPath=new Path("/sy");
//判断旧路径是否存在
if (fileSystem.exists(oldPath)){
//重命名文件
fileSystem.rename(oldPath,newPath);
System.out.println("修改成功");
}
}
判断是文件还是文件夹
//判断是文件还是文件夹
@Test
public void testFileAndDirectory() throws IOException{
FileSystem fileSystem = FileSystem.get(uri, configuration);
//定义文件地址
Path path=new Path("/gp/abc.txt");
//判断地址是否存在
if (fileSystem.exists(path)){
//获取文件信息状态
FileStatus fileStatus=fileSystem.getFileStatus(path);
// 判断/demo路径是否是一个文件
if (fileStatus.isFile()){
// 输出"这是一个文件"
System.out.println("这是一个文件");
// 判断/demo路径是否是一个目录
}else if (fileStatus.isDirectory()){
// 输出"这是一个文件夹"
System.out.println("这是一个文件夹");
// 如果/demo路径既不是文件也不是目录
}else {
System.out.println("未知");
}
}else {
// 输出"路径不存在"
System.out.println("路径不存在");
}
}