Hadoop

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

官方文档

Hadoop文档 (apache.org)

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("路径不存在");
        }
    }

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值