大数据基础(Hadoop)

Hadoop

中文手册:https://hadoop.apache.org/docs/r1.0.4/cn/

从钉钉群里下载模板机:
在这里插入图片描述

Hadoop集群

地址信息:192.168.245.141 hadoop141(master:ResourceManager\ SecondaryNameNode\QuorumPeerMain\HMaster\JobHistoryServer\NameNode)

​ 192.168.245.142 hadoop142(slave)

​ 192.168.245.143 hadoop143(slave)

登录账号和密码:root/hadoop

启动zookeeper的命令:zk-startall.sh

停止zookeepeer的命令:zk-stopall.sh

启动hadoop集群的命令:start-all.sh

停止hadoop集群的命令:stop-all.sh

启动hbase的命令:start-hbase.sh

停止hbase的命令:stop-hbase.sh

在这里插入图片描述

检查集群的信息:
在这里插入图片描述

检查hadoop是否配好环境变量:

在这里插入图片描述

检查相关目录是否齐全:

在这里插入图片描述

检查你的系统盘里是否存放了hadoop.dll文件

在这里插入图片描述

检查hosts文件是否配置了当前集群的信息:

在这里插入图片描述

Hadoop的应用

1.为什么要使用集群(服务器)?

文本、硬盘、磁盘…,随着时代发展,数据越来越珍贵,想办法保存数据,保存的数据的安全性,为了数据的安全所以要将数据备份,备份的要求:1.能够快速的找到;2.要保证你的备份数据要和正在使用的数据保持一致(数据的一致性);3.响应的速度。

2.搭建集群后能做什么?

(1)实现数据的备份,(2)能够保存更多的数据,(3)能够支持瞬时的高并发,(4)提供类似于服务器

3.和现实生活中有什么关系?

购物、聊天、实时更新、…

Hadoop的组成

hadoop1.x和hadoop2.x的区别

hadoop1.x:MapReduce(计算+资源调度)\HDFS(数据存储)

hadoop2.x:MapReduce(计算)\HDFS(数据存储)\Yarn(资源调度)

在hadoop1.x中hadoop的MapReduce同时负责处理业务逻辑运算和资源调度,耦合性大,在hadoop2.x之后,增加了yarn负责资源调度,mapreduce只负责计算,大大提高了计算的速率。

HDFS(数据存储)架构

在这里插入图片描述

namenodes(nn)

​ 存储文件的元数据(meta),如:文件名、文件目录结构、文件的属性,以及每个文件块列表和块所在的datanodes。

datanodes(dn)

​ 在本地文件系统存储文件块数据,以及块数据的校验和

secondary namenodes(2nn)

每隔一段时间对namenode元数据进行备份

YARN的结构(资源调度)

在这里插入图片描述
在这里插入图片描述

ResourceManager

(1)处理客户端发来的请求

(2)检测每个节点的状态

(3)启动监控ApplicationMaster

(4)资源的分配和调度

NodeManager

(1)管理每个节点的资源

(2)处理来自ResourceManger的命令

(3)处理来自ApplicationMaster的命令

ApplicationManager

(1)负责数据的切分

(2)为应用程序申请资源(内存)并分配给内部的任务

(3)任务的监控

Container

是Yarn中的资源抽象(内存、磁盘、网络等)

MapReduce(计算)的架构

分为两个过程:Map、Reduce

Map阶段负责并行处理输入的数据

Reduce阶段负责对Map阶段的结果进行汇总

一个Map/Reduce 作业(job) 通常会把输入的数据集切分为若干独立的数据块,由 map任务(task)以完全并行的方式处理它们。框架会对map的输出先进行排序, 然后把结果输入给reduce任务

在这里插入图片描述

HDFS

HDFS(Hadoop Distributed File System)本身就是一个文件系统,用来存储文件,通过目录树来定位文件;其次,他是分布式的由很多个服务器组成,来实现其功能。

HDFS的使用场景:适合一次性的写入,多次读出的场景,并且不支持文件的修改,使用和来做数据分析

HDFS的优缺点
优点

(1)高容错性

1.数据会保存多个副本(由配置信息和集群个数一起决定),它通过增加副本的形式,来提高容错性

2.当某一个副本丢失,会自动恢复

(2)适合大数据处理

(3)适合搭建在廉价集群上,通过多副本的机制,提高可靠性

缺点

(1)不适合低延时数据访问

(2)无法高效的对大量小文件进行存储(会占用NameNode大量的内存来存储文件目录和快信息、小文件的存储寻址时间会拉长)
(3)仅支持文件的append(追加)

HDFS的组成架构

在这里插入图片描述
在这里插入图片描述

NameNode是Master:管理HDFS的名称空间,配置副本策略,管理块(Block)映射信息,处理客户端的读写请求。

DataNode是Slave:存储实际的数据块,执行数据块的读写操作

Client是客户端:与NameNode的交互,获取文件的位置信息,与DataNode交互,读取或者写入数据。还会提供一些命令来操作HDFS,比如说NameNode的格式化。通过一些命令来访问HDFS,就比如HDFS的增删查改的操作

HDFS的文件块大小(面试重点)

HDFS中的文件在物理上是分块存储的(Block),块的大小通过配置参数(dfs.application)来规定。默认老版本64M,新版本上是128MB。

在这里插入图片描述

思考:为什么块的大小不能设置的太大,也不能设置太小?

(1)HDFS的块设置太小,会增加寻址时间

在这里插入图片描述

(2)如果块的的大小太大,从磁盘传输数据的时间会明显的大于定位块的时间,导致程序在处理块数据时,非常的慢。

HDFS块的大小取决于电脑的磁盘传输速率

HDFS的Shell操作
基本语法

hadoop fs具体的命令 or hdfs dfs 具体的命令

在这里插入图片描述

准备工作

启动集群

-help:输出这个命令的参数

上传

(1)从本地上传到HDFS(-moveFromLocal)剪切(从本地剪切到HDFS上)

[root@hadoop141 hadoop]# hadoop fs -moveFromLocal ./xiaozhuang.txt /shixun/File
moveFromLocal: `/shixun/File': No such file or directory: `hdfs://hadoop141:9000/shixun/File'
[root@hadoop141 hadoop]# hadoop fs -moveFromLocal ./xiaozhuang.txt /shixun/File
[root@hadoop141 hadoop]# ls -l

(2)从本地文件系统中拷贝到HDFS中(-copyFromLocal)复制(会保留本地文件)

[root@hadoop141 hadoop]# hadoop fs -copyFromLocal ./BigData.txt /shixun/File

(3)等同与copyFromLocal(put)(HDFS的路径后面必须加/,如果不加会认为路径最后一个为文件的名字,创建该文件)

[root@hadoop141 hadoop]# hadoop fs -put ./BigData.txt /shixun/File
[root@hadoop141 hadoop]# hadoop fs -put ./BigData.txt /shixun/File/

(4)追加一个文件到已经存在的文件末尾(-appenToFile)

[root@hadoop141 hadoop]# touch Java.txt
[root@hadoop141 hadoop]# vi Java.txt 
[root@hadoop141 hadoop]# cat Java.txt 
Java
Hadoop
HDFS
[root@hadoop141 hadoop]# hadoop fs -appendToFile ./Java.txt /shixun/File/BigData.txt
[root@hadoop141 hadoop]# vi HDFS.txt
[root@hadoop141 hadoop]# hadoop fs -appendToFile ./HDFS.txt /shixun/File/BigData.txt
下载

(1)从HDFS拷贝到本地(-copyToLocal)

[root@hadoop141 hadoop]# hadoop fs -help copyToLocal
-copyToLocal [-f] [-p] [-ignoreCrc] [-crc] <src> ... <localdst> :
  Identical to the -get command.
[root@hadoop141 hadoop]# hadoop fs -copyToLocal /shixun/File/BigData.txt ./
copyToLocal: `./BigData.txt': File exists
[root@hadoop141 hadoop]# hadoop fs -copyToLocal /shixun/File/BigData.txt ./

(2)等同于copyToLocal(get)

[root@hadoop141 hadoop]# hadoop fs -get /shixun/File/BigData.txt ./

(3)合并下载多个文件(-getmerge),例如/shixun/File下有多个文件,最终将每个文件中的内容合并到hebing.txt,并下载

[root@hadoop141 hadoop]# hadoop fs -getmerge /shixun/File/* ./hebing.txt
HDFS直接操作

(1)显示目录信息(-ls)

[root@hadoop141 hadoop]# hadoop fs -ls /

(2)新建目录(-mkdir)

[root@hadoop141 hadoop]# hadoop fs -mkdir /sanguo
[root@hadoop141 hadoop]# hadoop fs -mkdir /sanguo/shuguo

(3)显示文件内容(-cat)

[root@hadoop141 hadoop]# hadoop fs -cat /shixun/File/BigData.txt
Java
Hadoop
HDFS
我是末尾的文件信息HDFS

(4)Linux文件写系统中的一个修改文件的所属权限(-chgrp/-chmod/-chown)

[root@hadoop141 hadoop]# hadoop fs -chmod 666 /shixun/File/BigData.txt
[root@hadoop141 hadoop]# hadoop fs -chown neuedu:neuedu /shixun/File/BigData.txt

(5)从HDFS的一个路径拷贝到另一个路径(-cp)

[root@hadoop141 hadoop]# hadoop fs -cp /shixun/BigData.txt /sanguo/shuguo/

(6)从HDFS的一个路径移动到另一个路径(-mv)

[root@hadoop141 hadoop]# hadoop fs -mv /shixun/BigData.txt /sanguo/

(7) 显示一个文件的末尾1kb的数据

[root@hadoop141 hadoop]# hadoop fs -tail /shixun/File/BigData.txt
Java
Hadoop
HDFS
我是末尾的文件信息HDFS

(8)删除文件或者文件夹(-rm)

[root@hadoop141 hadoop]# hadoop fs -rm /sanguo/BigData.txt
Deleted /sanguo/BigData.txt

(9)删除空目录(-rmdir)

[root@hadoop141 hadoop]# hadoop fs -rmdir /sanguo/shuguo
rmdir: `/sanguo/shuguo': Directory is not empty

(10)统计文件夹的大小(-du)

[root@hadoop141 hadoop]# hadoop fs -du /shixun/File/
49  98  /shixun/File/BigData.txt
25  50  /shixun/File/xiaozhuang.txt

(11)设置副本数(-setrep)

[root@hadoop141 hadoop]# hadoop fs -setrep 10 /shixun/File/BigData.txt
Replication 10 set: /shixun/File/BigData.txt
[root@hadoop141 hadoop]# hadoop fs -du /shixun/File/
49  490  /shixun/File/BigData.txt
25  50   /shixun/File/xiaozhuang.txt

注意:这里设置的副本数只是记录在NameNode的元数据中,是否真的有这么多副本数,取决于DataNode 的数量,目前我们的集群中只有2个DataNode,所以也只有2个副本,只有当DataNode增加到10个的时候,副本数才能达到10个。

HDFS的API操作

创建一个maven工程

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.导入jar包

<!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-client -->
<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-client</artifactId>
    <version>3.1.3</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-slf4j-impl -->
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-slf4j-impl</artifactId>
    <version>2.20.0</version>
    <scope>test</scope>
</dependency>

在这里插入图片描述

2.创建项目目录及上传文件的类

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.上传文件
package com.neuedu;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.apache.hadoop.fs.permission.FsPermission;
import org.apache.hadoop.util.Progressable;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;

/**
 * @Author:sng
 * @Time:2023/8/14 9:17
 * @File:HDFS_CopyFormLocal
 * @Project_Name:HDFS_API
 * @Product_Name:IntelliJ IDEA
 **/
public class HDFS_CopyFormLocal {
   
    public void test_CopyFromLocal() throws IOException, URISyntaxException, InterruptedException {
   
        // 1.获取文件系统
        Configuration conf = new Configuration();
        // 2.配置在集群上运行
        /**
         * 指定运行当前程序的用户为root的第二种方法
         * 编辑配置--->虚拟机参数(VM options)-->  -DHADOOP_USER_NAME=root
         */
        conf.set("fs.defaultFS", "hdfs://hadoop141:9000");
        FileSystem fs = FileSystem.get(conf);
        /**
         * 指定运行当前程序的用户为root的第一种方法
         * @param uri of the filesystem :连接HDFS的地址
         * @param conf the configuration to use :HDFS的一些配置信息
         * @param user to perform the get as :指定运行当前程序的用户
         */
//        FileSystem fs = FileSystem.get(new URI("hdfs://hadoop141:9000"),conf,"root");


        // 将文件上传到HDFS里
        /**
         * @param delSrc whether to delete the src:上传到hdfs后,本地的这个文件是否删除,默认值为false
         * @param src path :本地文件文件的路径
         * @param dst path :HDFS目标的路径
         */
        fs.copyFromLocalFile(false,new Path("D:\\桌面\\HDFS_API.txt"),new Path("/shixun/File/"));

        // 3.资源关闭
        fs.close();
    }

    public static void main(String[] args) throws IOException, URISyntaxException, InterruptedException {
   
        HDFS_CopyFormLocal hdfs_copyFormLocal = new HDFS_CopyFormLocal();
        hdfs_copyFormLocal.test_CopyFromLocal();
    }
}

配置运行程序用户为root的第二种方式:

在这里插入图片描述

3.创建文件夹

package com.neuedu.mkdirs;


import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

import java.io.IOException;


/**
 * @Author:sng
 * @Time:2023/8/14 10:35
 * @File:HDFS_Mkdirs
 * @Project_Name:HDFS_API
 * @Product_Name:IntelliJ IDEA
 **/
public class HDFS_Mkdirs {
   
    public void test_Mkdirs(){
   
        Configuration configuration = new Configuration();
        try {
   
            FileSystem fs = FileSystem.get(configuration);
            // 创建目录
            fs.mkdirs(new Path("/shixun/HDFS_API"));
            // 关闭资源
            fs.close();
        } catch (IOException e) {
   
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
   
        HDFS_Mkdirs hdfs_mkdirs = new HDFS_Mkdirs();
        hdfs_mkdirs.test_Mkdirs();
    }
}

4.下载文件
package com.neuedu.CopyToLocal;


import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem
  • 16
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值