当前位置: 首页 > news >正文

Hadoop学习笔记(包括hadoop3.4.0集群安装)(黑马)

Hadoop学习笔记

0-前置章节-环境准备

0.1 环境介绍

配置环境:hadoop-3.4.0,jdk-8u171-linux-x64

0.2 VMware准备Linux虚拟机

0.2.1主机名、IP、SSH免密登录

1.配置固定IP地址(root权限)

开启master,修改主机名为node1,并修改固定ip为:192.168.247.131

# 1.修改主机名
hostnamectl set-hostname node1# 2.修改IP地址
vim /etc/sysconfig/network-scripts/ifcfg-ens33
#改为:BOOTPROTO="static"IPADDR="192.168.247.121"NETMASK="255.255.255.0"GATEWAY="192.168.247.2"DNS1="192.168.247.2"# 3.重启网卡
systemctl stop network
systemctl start network
# 或者直接
systemctl restart network

同样的操作启动node2和node3,
修改node2主机名为node2,设置ip为192.168.247.122
修改node3主机名为node3,设置ip为192.168.247.123

2.配置主机名映射

  1. 在Windows系统中修改hosts文件,填入如下内容:

    文件路径:C:\Windows\System32\drivers\etc,找到hosts文件并打开(可用VSCode打开,方便保存)

    添加并保存

    192.168.247.121 node1
    192.168.247.122 node2
    192.168.247.123 node3
    
  2. 在3台Linux(root)的vim /etc/hosts文件中,填入如下内容(3台都要添加)

192.168.247.121 node1
192.168.247.122 node2
192.168.247.123 node3

3.配置SSH免密登录

后续安装的集群化软件,多数需要远程登录以及远程执行命令,我们可以简单起见,配置三台Linux服务器之间的免密码互相SSH登陆

  1. 在每一台机器都执行:ssh-keygen -t rsa -b 4096一路回车到底即可

  2. 在每一台机器都执行:

    ssh-copy-id node1     # 注意:yes
    ssh-copy-id node2
    ssh-copy-id node3
    
  3. 执行完毕后,node1、node2、node3之间将完成root用户之间的免密互通

4.创建hadoop用户并配置免密登录

后续大数据的软件,将不会以root用户启动(确保安全,养成良好的习惯)

我们为大数据的软件创建一个单独的用户hadoop,并为三台服务器同样配置hadoop用户的免密互通

  1. 在每一台机器执行:useradd hadoop,创建hadoop用户
  2. 在每一台机器执行:passwd hadoop,设置hadoop用户密码为123456(会显示无效密码,不用管)
  3. 在每一台机器均切换到hadoop用户:su - hadoop,并执行 ssh-keygen -t rsa -b 4096,创建ssh密钥,一路回车到底即可
  4. 在每一台机器均执行
ssh-copy-id node1     # 注意:yes,密码:123456
ssh-copy-id node2
ssh-copy-id node3

在node3登录node2:

在这里插入图片描述

0.2.2JDK环境部署(3台机器都要执行)

JDK:Java Development Kit,是用于Java语言开发的环境。

使用的是jdk-8u171-linux-x64.tar.gz

1.配置JDK环境

  1. 创建文件夹,用来部署JDK,将JDK和Tomcat都安装部署到:/export/server 内

    root@node1 ~]# mkdir -p /export/server

    移动文件夹:[root@node3 export]# mv /home/master/jdk-8u171-linux-x64.tar.gz /export/server

  2. 解压缩JDK安装文件(注意路径,在server下)

    [root@node3 server]# tar -zxvf jdk-8u171-linux-x64.tar.gz -C /export/server

  3. 配置JDK的软链接

    ln -s /export/server/jdk1.8.0_171 /export/server/jdk

  4. 配置JAVA_HOME环境变量,以及将$JAVA_HOME/bin文件夹加入PATH环境变量中

# 编辑 vim /etc/profile文件,在文件最后添加:
export JAVA_HOME=/export/server/jdk
export PATH=$PATH:$JAVA_HOME/bin
  1. 生效环境变量

    source /etc/profile

  2. 配置java执行程序的软链接

    #删除系统自带的java程序
    rm -f /usr/bin/java
    # 软连接我们自己安装的java程序
    ln -s /export/server/jdk/bin/java /usr/bin/java
    
  3. 执行验证

java -version
javac -version

在这里插入图片描述

0.2.3防火墙、SELinux、时间同步

1.关闭防火墙和SELinux

集群化软件之间需要通过端口互相通讯,为了避免出现网络不通的问题,我们可以简单的在集群内部关闭防火墙。

# 在每一台机器都执行
systemctl stop firewalld
systemctl disable firewalld    # 关闭开机自启防火墙

Linux有一个安全模块:SELinux用以限制用户和程序的相关权限,来确保系统的安全稳定。

在当前,我们只需要关闭SELinux功能,避免导致后面的软件运行出现问题即可

# 在每一台机器都执行vim /etc/sysconfig/selinux
# 将第七行,SELINUX=enforcing 改为
SELINUX=disabled
# 保存退出后,重启虚拟机即可,千万要注意disabled单词不要写错,不然无法启动系统

可通过init 0init 6重启虚拟机

2.修改时区并配置自动时间同步

以下操作在三台Linux均执行

注意:系统已自带安装ntp,可以直接systemctl status ntpd来查询ntp服务是否开启

# 1. 安装ntp软件:yum install -y ntp  
# 2. 更新时区rm -f /etc/localtime;sudo ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
# 3. 同步时间ntpdate -u ntp.aliyun.com
# 4. 开启ntp服务并设置开机自启systemctl start ntpdsystemctl enable ntpd

3.设置快照

目前Linux虚拟机的状态基本准备就绪,可以对当前状态进行快照保存,以备后续恢复。

对三台虚拟机均执行拍摄快照。

0.3VMware虚拟机设置(略)

0.4云平台入门

1.什么是云平台

云平台也称云计算平台。

  • 云: 通俗的理解就是远程计算机, 并且是一组 一堆, 这些远程计算机协同工作构建出一个平台,对用户提供服务
  • 计算:这是一个概念很大的名词,小了说可以认为是对业务数据进行计算分析的算力,不过通俗意义上,计算是指构建业务系统的各种需求
  • 平台:将云(远程硬件资源)和计算(远程软件资源)组合在一起,就形成了一个平台,对用户提供各种各样的服务。

我们可以这样理解,云平台是: 一个云上的平台,聚合了一些软硬件资源,为用户提供各种各样的远程服务

2.云平台提供的服务类型

云平台主要提供软硬件等服务,这些服务可以划分为三个类别:

  • IaaS服务(Infrastructure as a Service)基础设施即服务

  • PaaS服务(Platform as a Service)平台即服务

  • SaaS服务(Software as a Service)软件即服务

(1)IaaS 基础设施即服务,各类硬件设施

IaaS见名知意,即将IT基础设施作为服务。IT基础设施是指:

● 公网IP、带宽

VPC(virtual private cloud)私有虚拟局域网

● 云服务器(CPU、内存、磁盘等计算、存储资源)

● 等等

简单来说就是构建一个实体服务器所需的:CPU、内存、磁盘、网络、公网IP、交换机等等一系列物理设备的云上化。这些称之为IaaS服务,IT基础设施作为服务对外提供。

(2)PaaS平台即服务,各类支持平台

Platform as a Service : 平台即服务.是指将平台作为一种服务对外提供.

那么我们要学习的云平台,就是一种PaaS服务,其他还有如

● 腾讯地图开发平台

● 小程序开发平台

● 云上消息中心平台(Kafka等)

● 云上Hadoop大数据计算平台

● 等等

(3)SaaS软件即服务,各类软件应用

Software as a Service: 软件即服务, 是指将软件作为一种服务对外提供.

● 云上数据库服务

● 云上缓存服务

● 云网盘服务

● DNS服务

● 流量高防服务

● 域名托管服务

● 和一切其它非云平台提供的,如:ProcessON、DrawIO、CSDN博客、邮箱服务、135编辑器、在线Office等

SaaS就是现成可用的软件(可认为是解决方案)提供给你,你只需要有网络(浏览器或其它客户端)去连接使用即可(可能付费)。无需关心维护、管理等。

0.5阿里云购买云服务器

0.6阿里云服务器系统设置

0.7UCloud云购买虚拟机

第一章 Hello 大数据分布式

在这里插入图片描述

在这里插入图片描述

第二章

2.1分布式的基础架构分析

分布式系统常见的组织形式?

  • 去中心化模式:没有明确中心,大家协调工作
  • 中心化模式:有明确的中心,基于中心节点分配工作

什么是主从模式?

  • 主从模式(Master-Slaves)就是中心化模式,表示有一个主节点来作为管理者,管理协调下属一批从节点工作。

Hadoop是哪种模式?

  • **主从模式(中心化模式)**的架构

2.2HDFS的基础架构

1.HDFS

HDFS是Hadoop三大组件(HDFS、MapReduce、YARN)之一

  • 全称是:Hadoop Distributed File System(Hadoop分布式文件系统
  • 是Hadoop技术栈内提供的分布式数据存储解决方案
  • 可以在多台服务器上构建存储集群,存储海量的数据

HDFS是一个典型的主从模式架构

2.HDFS的基础架构

在这里插入图片描述

  • NameNode

HDFS系统的主角色,是一个独立的进程

负责管理HDFS整个文件系统

负责管理DataNode

  • DataNode

HDFS系统的从角色,是一个独立进程

主要负责数据的存储,即存入数据和取出数据

  • SecondaryNameNode

NameNode的辅助,是一个独立进程

主要帮助NameNode完成元数据整理工作(打杂)

一个典型的HDFS集群,就是由1个DataNode加若干(至少一个)DataNode组成

2.3HDFS集群环境部署,VMware虚拟机中部署

1.集群规划

我们准备了基于VMware的三台虚拟机,其硬件配置如下。

节点CPU内存
node11核心4GB
node21核心2GB
node31核心2GB

Hadoop HDFS的角色包含:

  • NameNode,主节点管理者
  • DataNode,从节点工作者
  • SecondaryNameNode,主节点辅助

服务规划

节点服务
node1NameNode、DataNode、SecondaryNameNode
node2DataNode
node3DataNode

2.上传 & 解压

注意:请确认已经完成前置准备中的服务器创建、固定IP、防火墙关闭、Hadoop用户创建、SSH免密、JDK部署等操作。

# 以下操作,node1节点执行,以root身份登录# 1.上传Hadoop安装包到node1节点中
# 2.解压缩安装包到/export/server/中
tar -zxvf hadoop-3.4.0.tar.gz -C /export/server
# 3.构建软链接
cd /export/server
ln -s /export/server/hadoop-3.4.0 hadoop
# 4.进入hadoop安装包内
cd hadoop

cd 进入Hadoop安装包内,通过ls -l命令查看文件夹内部结构

在这里插入图片描述

各个文件夹含义如下

  • bin,存放Hadoop的各类程序(命令)
  • etc,存放Hadoop的配置文件
  • include,C语言的一些头文件
  • lib,存放Linux系统的动态链接库(.so文件)
  • libexec,存放配置Hadoop系统的脚本文件(.sh和.cmd)licenses-binary,存放许可证文件
  • sbin,管理员程序(super bin)
  • share,存放二进制源码(Java jar包)

3.修改配置文件,应用自定义设置

[root@node1 hadoop]# pwd
/export/server/hadoop/etc/hadoop
[root@node1 hadoop]# ll
总用量 180
-rw-r--r-- 1 root root   774 34 2024 core-site.xml
-rw-r--r-- 1 root root  3999 34 2024 hadoop-env.cmd
-rw-r--r-- 1 root root 16786 34 2024 hadoop-env.sh
...
-rw-r--r-- 1 root root    28 1018 22:02 workers
-rw-r--r-- 1 root root  2250 34 2024 yarn-env.cmd
-rw-r--r-- 1 root root  7095 34 2024 yarn-env.sh
-rw-r--r-- 1 root root   690 34 2024 yarn-site.xml

配置HDFS集群,我们主要涉及到如下文件的修改:

  • workers: 配置从节点(DataNode)有哪些
  • hadoop-env.sh: 配置Hadoop的相关环境变量
  • core-site.xml: Hadoop核心配置文件
  • hdfs-site.xml: HDFS核心配置文件

这些文件均存在与$HADOOP_HOME/etc/hadoop文件夹中。

ps:$HADOOP_HOME是后续我们要设置的环境变量,其指代Hadoop安装文件夹即/export/server/hadoop

  • 配置workers文件
# 进入配置文件目录
cd etc/hadoop
# 编辑workers文件
vim workers
# 填入如下内容
node1
node2
node3

填入的node1、node2、node3,表明集群记录了三个从节点(DataNode)

注:data文件夹,新建文件夹namenode、datanode

  • 配置hadoop-env.sh文件
vim hadoop-env.sh
# 填入如下内容
export JAVA_HOME=/export/server/jdk
export HADOOP_HOME=/export/server/hadoop
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export HADOOP_LOG_DIR=$HADOOP_HOME/logs
  • JAVA_HOME,指明JDK环境的位置在哪
  • HADOOP_HOME,指明Hadoop安装位置
  • HADOOP_CONF_DIR,指明Hadoop配置文件目录位置
  • HADOOP_LOG_DIR,指明Hadoop运行日志目录位置

通过记录这些环境变量, 来指明上述运行时的重要信息

  • 配置core-site.xml文件
在文件内部填入如下内容
<configuration><property><name>fs.defaultFS</name><value>hdfs://node1:8020</value></property><property><name>io.file.buffer.size</name><value>131072</value></property>
</configuration>

key:fs.defaultFS

含义:HDFS文件系统的网络通讯路径

值:hdfs://node1:8020

  • 协议为hdfs://
  • namenode为node1
  • namenode通讯端口为8020

key:io.file.buffer.size

含义:io操作文件缓冲区大小

值:131072 bit

  • hdfs://node1:8020为整个HDFS内部的通讯地址,应用协议为hdfs://(Hadoop内置协议)

  • 表明DataNode将和node1的8020端口通讯,node1是NameNode所在机器

  • 此配置固定了node1必须启动NameNode进程

  • 配置hdfs-site.xml文件

# 在文件内部填入如下内容
<configuration><property><name>dfs.datanode.data.dir.perm</name><value>700</value></property><property><name>dfs.namenode.name.dir</name><value>/data/namenode</value></property><property><name>dfs.namenode.hosts</name><value>node1,node2,node3</value></property><property><name>dfs.blocksize</name><value>268435456</value></property><property><name>dfs.namenode.handler.count</name><value>100</value></property><property><name>dfs.datanode.data.dir</name><value>/data/datanode</value></property>
</configuration>
  • key:dfs.datanode.data.dir.perm

  • 含义:hdfs文件系统,默认创建的文件权限设置

  • 值:700,即:rwx------

  • key:dfs.namenode.name.dir

  • 含义:NameNode元数据的存储位置

  • 值:/data/nn,在node1节点的/data/nn目录下

  • key:dfs.namenode.hosts

  • 含义:NameNode允许哪几个节点的DataNode连接(即允许加入集群)

  • 值:node1、node2、node3,这三台服务器被授权

  • key:dfs.blocksize

  • 含义:hdfs默认块大小

  • 值:268435456(256MB)

  • key:dfs.namenode.handler.count

  • 含义:namenode处理的并发线程数

  • 值:100,以100个并行度处理文件系统的管理任务

  • key:dfs.datanode.data.datanode

  • 含义:从节点DataNode的数据存储目录

  • 值:/data/datanode,即数据存放在node1、node2、node3,三台机器的/data/datanode内

4.准备数据目录

根据下述2个配置项:

<property><name>dfs.namenode.name.dir</name><value>/data/namenode</value>
</property>
<property><name>dfs.datanode.data.dir</name><value>/data/datanode</value>
</property>
  • namenode数据存放node1的/data/namenode
  • datanode数据存放node1、node2、node3的/data/datanode

所以应该

  • 在node1节点
    • mkdir -p /data/namenode
    • mkdir -p /data/datanode
  • 在node2和node3节点
    • mkdir -p /data/datanode

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

5.分发Hadoop文件夹

目前,已经基本完成Hadoop的配置操作,可以从node1将hadoop安装文件夹远程复制到node2、node3

  • 分发
# 在node1执行如下命令
cd /export/server
scp -r hadoop-3.4.0 node2:`pwd`/
scp -r hadoop-3.4.0 node3:`pwd`/
  • 在node2执行,为hadoop配置软链接
# 在node2执行如下命令
ln -s /export/server/hadoop-3.4.0 /export/server/hadoop
  • 在node3执行,为hadoop配置软链接
# 在node3执行如下命令
ln -s /export/server/hadoop-3.4.0 /export/server/hadoop

在这里插入图片描述

6.配置环境变量

为了方便我们操作Hadoop,可以将Hadoop的一些脚本、程序配置到PATH中,方便后续使用。

在这里插入图片描述

在Hadoop文件夹中的bin、sbin两个文件夹内有许多的脚本和程序,现在来配置一下环境变量

  1. vim /etc/profile

    # 在/etc/profile文件底部追加如下内容
    export HADOOP_HOME=/export/server/hadoop
    export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
    
  2. 在node2和node3配置同样的环境变量

  3. 最后都要:source /etc/profile

7.授权为hadoop用户

hadoop部署的准备工作基本完成

为了确保安全,hadoop系统不以root用户启动,我们以普通用户hadoop来启动整个Hadoop服务

所以,现在需要对文件权限进行授权。

在这里插入图片描述

ps:请确保已经提前创建好了hadoop用户(前置准备章节中有讲述),并配置好了hadoop用户之间的免密登录

  • root身份,在node1、node2、node3三台服务器上均执行如下命令
# 以root身份,在三台服务器上均执行
chown -R hadoop:hadoop /data
chown -R hadoop:hadoop /export

在这里插入图片描述

8.格式化整个文件系统(只在node1上)

前期准备全部完成,现在对整个文件系统执行初始化

  • 在node1上,格式化namenode
# 确保以hadoop用户执行
su - hadoop
# 格式化namenode
hadoop namenode -format

在这里插入图片描述

  • 在node1上,启动
# 一键启动hdfs集群
start-dfs.sh
# 查看jps
jps# 启动完后,可以直接在node2、node3上输入jps(无需进行与node1同样的格式化和启动)# 一键关闭hdfs集群
stop-dfs.sh# 如果遇到命令未找到的错误,表明环境变量未配置好,可以以绝对路径执行
/export/server/hadoop/sbin/start-dfs.sh
/export/server/hadoop/sbin/stop-dfs.sh

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

9.查看HDFS WEBUI

启动完成后,可以在浏览器打开:(可以直接在本机Windows系统浏览器上打开)

http://node1:9870,即可查看到hdfs文件系统的管理网页。

在这里插入图片描述

在这里插入图片描述

2.4HDFS的Shell操作

注意:三台电脑都要,启动HDFS前,切换到用户hadoop下,即:su - hadoop密码是:123456[hadoop@node1 ~]$ start-dfs.sh
Starting namenodes on [node1]
Starting datanodes
localhost: mv: cannot stat ‘/export/server/hadoop/logs/hadoop-hadoop-datanode-node1.out’: No such file or directory
Starting secondary namenodes [node1]
[hadoop@node1 ~]$ jps
5792 Jps
5114 NameNode
5293 DataNode
5518 SecondaryNameNode

1.进程启停管理

一键启停脚本

Hadoop HDFS组件内置了HDFS集群的一键启停脚本。

  • $HADOOP_HOME/sbin/start-dfs.sh一键启动HDFS集群

    执行原理:

    • 在执行此脚本的机器上,启动SecondaryNameNode
    • 读取core-site.xml内容(fs.defaultFS项),确认NameNode所在机器,启动NameNode
    • 读取workers内容,确认DataNode所在机器,启动全部DataNode
  • $HADOOP_HOME/sbin/stop-dfs.sh一键关闭HDFS集群

    执行原理:

    • 在执行此脚本的机器上,关闭SecondaryNameNode
    • 读取core-site.xml内容(fs.defaultFS项),确认NameNode所在机器,关闭NameNode
    • 读取workers内容,确认DataNode所在机器,关闭全部NameNode

单进程启停

除了一键启停外,也可以单独控制进程的启停。

1.$HADOOP_HOME/sbin/hadoop-daemon.sh,此脚本可以单独控制所在机器的进程的启停

用法:

hadoop-daemon.sh (start|status|stop) (namenode|secondarynamenode|datanode)

2.$HADOOP_HOME/bin/hdfs,此程序也可以用以单独控制所在机器的进程的启停

用法:

hdfs --daemon (start|status|stop) (namenode|secondarynamenode|datanode)

node1:
[hadoop@node1 ~]$ jps
5845 Jps
5114 NameNode
5293 DataNode
5518 SecondaryNameNode
[hadoop@node1 ~]$ hadoop-daemon.sh stop datanode  # 没有成功,停不了
WARNING: Use of this script to stop HDFS daemons is deprecated.
WARNING: Attempting to execute replacement "hdfs --daemon stop" instead.
# [hadoop@node1 ~]$ hdfs --daemon stop datanode
[hadoop@node1 ~]$ hdfs --daemon stop namenode
[hadoop@node1 ~]$ jps
5293 DataNode
6269 Jps
5518 SecondaryNameNode# node3:
[hadoop@node3 ~]$ jps
5034 Jps
4619 DataNode
[hadoop@node3 ~]$ hdfs --daemon stop datanode
[hadoop@node3 ~]$ jps
5098 Jps

2.文件系统操作命令

HDFS文件系统基本信息

HDFS作为分布式存储的文件系统,有其对数据的路径表达方式。

  • HDFS同Linux系统一样,均是以/作为根目录的组织形式

在这里插入图片描述

  • Linux: /usr/local/hello.txt

  • HDFS: /usr/local/hello.txt

如何区分呢?

  • Linux:file:///
  • HDFS:hdfs://namenode:port**/**
  • 注: namenode(的主机名或IP):port(namenode的端口)

如上路径:

  • Linux:file:///usr/local/hello.txt
  • HDFS:hdfs://node1:8020**/usr/local/hello.txt**

协议头file:/// 或 hdfs://node1:8020/可以省略

  • 需要提供Linux路径的参数,会自动识别为file://
  • 需要提供HDFS路径的参数,会自动识别为hdfs://

除非你明确需要写或不写会有BUG,否则一般不用写协议头

介绍

关于HDFS文件系统的操作命令,Hadoop提供了2套命令体系

  • hadoop命令(老版本用法),用法:hadoop fs [generic options]

  • hdfs命令(新版本用法),用法:hdfs dfs [generic options]

两者在文件系统操作上,用法完全一致用哪个都可以

某些特殊操作需要选择hadoop命令或hdfs命令讲到的时候具体分析

# 1.创建文件夹
[hadoop@node1 ~]$ hadoop fs -mkdir -p file:///home/hadoop/test  # 在Linux里面创建文件夹
[hadoop@node1 ~]$ ls
test
[hadoop@node1 ~]$ hadoop fs -mkdir -p hdfs://node1:8020/xp_hadoop/bigdata # 在HDFS里面创建文件夹
[hadoop@node1 ~]$ hdfs dfs -mkdir -p /home/hadoop/itcast   # 没有用协议头,默认创建在hdfs文件系统上(因为是在hadoop用户上),而非本地Linux系统
[hadoop@node1 ~]$ ls
test# 2.查看指定目录下内容
[hadoop@node1 ~]$ hadoop fs -ls /
Found 2 items
drwxr-xr-x   - hadoop supergroup          0 2024-10-20 11:29 /home
drwxr-xr-x   - hadoop supergroup          0 2024-10-20 11:26 /xp_hadoop
[hadoop@node1 ~]$ hadoop fs -ls /home
Found 1 items
drwxr-xr-x   - hadoop supergroup          0 2024-10-20 11:29 /home/hadoop
[hadoop@node1 ~]$ hdfs dfs -ls /home/hadoop
Found 1 items
drwxr-xr-x   - hadoop supergroup          0 2024-10-20 11:29 /home/hadoop/itcast

1)、创建文件夹

  • hadoop fs -mkdir [-p]

  • hdfs dfs -mkdir [-p]

path 为待创建的目录

-p选项的行为与Linux mkdir -p一致,它会沿着路径创建父目录

2)、查看指定目录下内容

  • hadoop fs -ls [-h] [-R] [ …]
  • hdfs dfs -ls [-h] [-R] [ …]

path 指定目录路径

-h 人性化显示文件size

-R 递归查看指定目录及其子目录

3)、上传文件到HDFS指定目录下

  • hadoop fs -put [-f] [-p] …
  • hdfs dfs -put [-f] [-p] …

-f 强制覆盖目标文件(已存在下)

-p 保留访问和修改时间,所有权和权限。

localsrc 本地文件系统(客户端所在机器,即Linux)

dst 目标文件系统(HDFS)

# 3.将文件从Linux系统上传文件到HDFS指定目录下
[hadoop@node1 ~]$ vim test1.txt
[hadoop@node1 ~]$ ll
总用量 4
drwxr-xr-x 2 hadoop hadoop  6 1020 11:25 test
-rw-rw-r-- 1 hadoop hadoop 36 1020 11:37 test1.txt
[hadoop@node1 ~]$ hadoop fs -put file:///home/hadoop/test1.txt hdfs://node1:8020/
[hadoop@node1 ~]$ hadoop fs -ls /
Found 3 items
drwxr-xr-x   - hadoop supergroup          0 2024-10-20 11:29 /home
-rw-r--r--   3 hadoop supergroup         36 2024-10-20 11:39 /test1.txt
drwxr-xr-x   - hadoop supergroup          0 2024-10-20 11:26 /xp_hadoop[hadoop@node1 ~]$ vim test2.txt
[hadoop@node1 ~]$ hdfs dfs -put ./test2.txt /
[hadoop@node1 ~]$ hdfs dfs -ls /
Found 4 items
drwxr-xr-x   - hadoop supergroup          0 2024-10-20 11:29 /home
-rw-r--r--   3 hadoop supergroup         36 2024-10-20 11:39 /test1.txt
-rw-r--r--   3 hadoop supergroup         36 2024-10-20 11:42 /test2.txt
drwxr-xr-x   - hadoop supergroup          0 2024-10-20 11:26 /xp_hadoop

4)、查看HDFS文件内容

  • hadoop fs -cat …
  • hdfs dfs -cat …

读取指定文件全部内容,显示在标准输出控制台。

[hadoop@node1 ~]$ ls -ll
总用量 8
drwxr-xr-x 2 hadoop hadoop  6 1020 11:25 test
-rw-rw-r-- 1 hadoop hadoop 36 1020 11:37 test1.txt
-rw-rw-r-- 1 hadoop hadoop 36 1020 11:41 test2.txt
[hadoop@node1 ~]$ hdfs dfs -cat /test1.txt
hello,hadoop!
hahahhha
bigdata 6666

读取大文件可以使用管道符配合more(more:对内容进行翻页查看)

  • hadoop fs -cat | more
  • hdfs dfs -cat | more

5)、下载HDFS文件

  • hadoop fs -get [-f] [-p] … (前面是HDFS文件路径,后面是Linux路径)
  • hdfs dfs -get [-f] [-p] …

下载文件到本地文件系统指定目录,localdst必须是目录

-f 覆盖目标文件(已存在下)

-p 保留访问和修改时间,所有权和权限。

[hadoop@node1 ~]$ ll
总用量 8
drwxr-xr-x 2 hadoop hadoop  6 1020 11:25 test
-rw-rw-r-- 1 hadoop hadoop 36 1020 11:37 test1.txt
-rw-rw-r-- 1 hadoop hadoop 36 1020 11:41 test2.txt
[hadoop@node1 ~]$ rm -rf *      # 将Linux上的文件(夹)都删除
[hadoop@node1 ~]$ ll
总用量 0
[hadoop@node1 ~]$ hadoop fs -ls /
Found 4 items
drwxr-xr-x   - hadoop supergroup          0 2024-10-20 11:29 /home
-rw-r--r--   3 hadoop supergroup         36 2024-10-20 11:39 /test1.txt
-rw-r--r--   3 hadoop supergroup         36 2024-10-20 11:42 /test2.txt
drwxr-xr-x   - hadoop supergroup          0 2024-10-20 11:26 /xp_hadoop
[hadoop@node1 ~]$ hdfs dfs -get /test1.txt .   # 将hdfs上的文件test1.txt下载到Linux的home目录下(用.表示home目录)
[hadoop@node1 ~]$ ll
总用量 4
-rw-r--r-- 1 hadoop hadoop 36 1020 11:54 test1.txt
[hadoop@node1 ~]$ cat test1.txt
hello,hadoop!
hahahhha
bigdata 6666

6)、拷贝HDFS文件

  • hadoop fs -cp [-f] …
  • hdfs dfs -cp [-f] …

-f 覆盖目标文件(已存在下)

7)、追加数据到HDFS文件中

  • hadoop fs -appendToFile …
  • hdfs dfs -appendToFile …

将所有给定本地文件的内容追加到给定dst文件。

dst如果文件不存在,将创建该文件。

如果为-,则输入为从标准输入中读取。

8)、HDFS数据移动操作

  • hadoop fs -mv …
  • hdfs dfs -mv …

移动文件到指定文件夹下

可以使用该命令移动数据,重命名文件的名称

9)、HDFS数据删除操作

  • hadoop fs -rm -r [-skipTrash] URI [URI …]
  • hdfs dfs -rm -r [-skipTrash] URI [URI …]

删除指定路径的文件或文件夹

-skipTrash 跳过回收站,直接删除

[hadoop@node1 ~]$ vim /export/server/hadoop/etc/hadoop/core-site.xml
回收站功能默认关闭,如果要开启需要在core-site.xml内配置:(需要三台机器分别执行)
<property>
<name>fs.trash.interval</name>
<value>1440</value>     # 1440:整个回收站的保留时间,1440分钟,即1天
</property><property>
<name>fs.trash.checkpoint.interval</name>
<value>120</value>   # 120表示当前回收站检查的间隔,120分钟
</property>无需重启集群,在哪个机器配置的,在哪个机器执行命令就生效。
回收站默认位置在:/user/用户名(hadoop)/.Trash
[hadoop@node1 ~]$ hdfs dfs -ls /
Found 4 items
drwxr-xr-x   - hadoop supergroup          0 2024-10-20 11:29 /home
-rw-r--r--   3 hadoop supergroup         36 2024-10-20 11:39 /test1.txt
-rw-r--r--   3 hadoop supergroup         36 2024-10-20 11:42 /test2.txt
drwxr-xr-x   - hadoop supergroup          0 2024-10-20 11:26 /xp_hadoop
[hadoop@node1 ~]$ hdfs dfs -ls /xp_hadoop
Found 1 items
drwxr-xr-x   - hadoop supergroup          0 2024-10-20 11:26 /xp_hadoop/bigdata
[hadoop@node1 ~]$ hdfs dfs -rm -r /xp_hadoop   # 删除文件夹
Deleted /xp_hadoop# 开启回收站功能后
[hadoop@node1 ~]$ hdfs dfs -ls /
Found 3 items
drwxr-xr-x   - hadoop supergroup          0 2024-10-20 11:29 /home
-rw-r--r--   3 hadoop supergroup         36 2024-10-20 11:39 /test1.txt
-rw-r--r--   3 hadoop supergroup         36 2024-10-20 11:42 /test2.txt
[hadoop@node1 ~]$ hdfs dfs -rm /test2.txt
2024-10-20 12:10:49,575 INFO fs.TrashPolicyDefault: Moved: 'hdfs://node1:8020/test2.txt' to trash at: hdfs://node1:8020/user/hadoop/.Trash/Current/test2.txt
# 即将test2.txt在hdfs里面删除,移动到回收站里面,回收站的默认路径:/user/hadoop/.Trash
[hadoop@node1 ~]$ hdfs dfs -ls /
Found 3 items
drwxr-xr-x   - hadoop supergroup          0 2024-10-20 11:29 /home
-rw-r--r--   3 hadoop supergroup         36 2024-10-20 11:39 /test1.txt
drwx------   - hadoop supergroup          0 2024-10-20 12:10 /user

HDFS shell其它命令

  • 命令官方指导文档https://hadoop.apache.org/docs/r3.3.4/hadoop-project-dist/hadoop-common/FileSystemShell.html

  • 提示

    常见的操作自己最好能够记住,其他操作可以根据需要查询文档使用。

    命令属于多用多会,孰能生巧,不用就忘

HDFS WEB浏览

node1:9870

除了使用命令操作HDFS文件系统外,在HDFS的WEB UI上也可以查看HDFS文件系统的内容。

在这里插入图片描述

使用WEB浏览操作文件系统,一般会遇到权限问题

在这里插入图片描述

这是因为WEB浏览器中是以匿名用户(dr.who)登陆的,其只有只读权限,多数操作是做不了的。

如果需要以特权用户在浏览器中进行操作,需要配置如下内容到core-site.xml重启集群

  <property><name>hadoop.http.staticuser.user</name><value>hadoop</value></property>

但是,不推荐这样做

  • HDFS WEBUI,只读权限挺好的,简单浏览即可
  • 如果给与高权限,会有很大的安全问题,造成数据泄露或丢失

3.HDFS客户端 - Jetbrians产品插件

Big Data Tools插件

在Jetbrains的产品中,均可以安装插件,其中:Big Data Tools插件可以帮助我们方便的操作HDFS,比如

  • IntelliJ IDEA(Java IDE)
  • PyCharm(Python IDE)
  • DataGrip(SQL IDE)

均可以支持Bigdata Tool插件。同学们如果有使用以上几款IDE,就可以安装此插件进行HDFS操作。

配置Windows未成功!!

需要对Windows系统做一些基础设置,配合插件使用

  • 解压Hadoop安装包到Windows系统,如解压到:D:\LXP\SoftApp\Hadoop\hadoop_VMware\hadoop-3.4.0
  • 设置$HADOOP_HOME环境变量指向:D:\LXP\SoftApp\Hadoop\hadoop_VMware\hadoop-3.4.0
  • 下载winutils-master,我选的是hadoop-3.3.6\bin中的
    • hadoop.dll
    • winutils.exe
    • 可以自行下载,或从课程资料中获取
  • 将hadoop.dll和winutils.exe放入D:\LXP\SoftApp\Hadoop\hadoop_VMware\hadoop-3.4.0\bin中

在这里插入图片描述

4.HDFS客户端 - NFS(未开始)

HDFS NFS Gateway

HDFS提供了基于NFS(Network File System)的插件,可以对外提供NFS网关,供其它系统挂载使用。NFS 网关支持 NFSv3,并允许将 HDFS 作为客户机本地文件系统的一部分挂载,现在支持:

  • 上传、下载、删除、追加内容

如下图,将HDFS挂载为Windows文件管理器的网络位置

配置NFS

配置HDFS需要配置如下内容:

  • core-site.xml,新增配置项 以及 hdfs-site.xml,新增配置项
  • 开启portmap、nfs3两个新进程

在node1进行如下操作

1)、在core-site.xml 内新增如下两项

  <property><name>hadoop.proxyuser.hadoop.groups</name><value>*</value></property><property><name>hadoop.proxyuser.hadoop.hosts</name><value>*</value></property>
  • 项目: hadoop.proxyuser.hadoop.groups 值:允许hadoop用户代理任何其它用户组
  • 项目:hadoop.proxyuser.hadoop.hosts 值:允许代理任意服务器的请求

2)、在hdfs-site.xml中新增如下项

  <property><name>nfs.superuser</name><value>hadoop</value></property><property><name>nfs.dump.dir</name><value>/tmp/.hdfs-nfs</value></property><property><name>nfs.exports.allowed.hosts</name><value>192.168.88.1 rw</value></property>
  • nfs.suerpser:NFS操作HDFS系统,所使用的超级用户(hdfs的启动用户为超级用户)
  • nfs.dump.dir:NFS接收数据上传时使用的临时目录
  • nfs.exports.allowed.hosts:NFS允许连接的客户端IP和权限,rw表示读写,IP整体或部分可以以*代替

课程设置的允许192.168.88.1以rw连接(这个IP是电脑虚拟网卡VMnet8的IP,连接虚拟机就走这个网卡)

启动NFS功能

  1. 将配置好的core-site.xml和hdfs-site.xml分发到node2和node3

  2. 重启Hadoop HDFS集群(先stop-dfs.sh,后start-dfs.sh)

  3. 停止系统的NFS相关进程

    a. systemctl stop nfs; systemctl disable nfs 关闭系统nfs并关闭其开机自启

    b. yum remove -y rpcbind 卸载系统自带rpcbind

  4. 启动portmap(HDFS自带的rpcbind功能)(必须以root执行):hdfs --daemon start portmap

  5. 启动nfs(HDFS自带的nfs功能)(必须以hadoop用户执行):hdfs --daemon start nfs3

检查NFS是否正常

以下操作在node2或node3执行(因为node1卸载了rpcbind,缺少了必要的2个命令)

  • 执行:rpcinfo -p node1,正常输出如下

有mountd和nfs出现

  • 执行:showmount -e node1

    可以看到 / 192.168.88.1

在Windows挂载HDFS文件系统

  1. 开启Windows的NFS功能

此功能需要专业版,如果是家庭版Windows需要升级为专业版

  1. 在Windows命令提示符(CMD)内输入:net use X: \\192.168.88.101\!

  2. 完成后即可在文件管理器中看到盘符为X的网络位置

  3. 点击右键客户断开连接

至此,就将HDFS挂载到Windows文件管理器内了可以进行上传、下载、改名、删除、追加文本等操作。

2.5HDFS的存储原理

2.5.1 存储原理

  • 数据存入HDFS是分布式存储,即每一个服务器节点,负责数据的一部分。
  • 数据在HDFS上是划分为一个个Block块进行存储。
  • 在HDFS上,数据Block块可以有多个副本,提高数据安全性,每个Block块都有2个(可修改)备份,每个副本都复制到其它服务器一份

2.5.2 fsck命令

HDFS副本块数量的配置

在前面我们了解了HDFS文件系统的数据安全,是依靠多个副本来确保的。

如何设置默认文件上传到HDFS中拥有的副本数量呢?可以在hdfs-site.xml中配置如下属性:

<property>    <name>dfs.replication</name>    <value>3</value>
</property>

这个属性默认是3,一般情况下,我们无需主动配置(除非需要设置非3的数值)如果需要自定义这个属性,请修改每一台服务器的hdfs-site.xml文件,并设置此属性。

  • 除了配置文件外,我们还可以在上传文件的时候,临时决定被上传文件以多少个副本存储

hadoop fs -D dfs.replication=2 -put test.txt /tmp/

如上命令,就可以在上传test.txt的时候,临时设置其副本数为2,-D表示覆盖

  • 对于已经存在HDFS的文件,修改dfs.replication属性不会生效,如果要修改已存在文件可以通过命令

hadoop fs -setrep [-R] 2 path

如上命令,指定path的内容将会被修改为2个副本存储。

-R选项可选,使用-R表示对子目录也生效。

fsck命令检查文件的副本数

同时,我们可以使用hdfs提供的fsck命令来检查文件的副本数

hdfs fsck path [-files [-blocks [-locations]]]

fsck可以检查指定路径是否正常

  • -files可以列出路径内的文件状态
  • -files -blocks 输出文件块报告(有几个块,多少副本)
  • -files -blocks -locations 输出每一个block的详情

在这里插入图片描述

block配置

可以看到通过fsck命令我们验证了:

  • 文件有多个副本
  • 文件被分成多个块存储在hdfs

对于块(block),hdfs默认设置为256MB一个,也就是1GB文件会被划分为4个block存储。块大小可以通过参数:

 <property>    <name>dfs.blocksize</name>    <value>268435456</value>    <description>设置HDFS块大小,单位是b</description>  
</property>

如上,设置为256MB

2.5.3 NameNode元数据

1.NameNode基于

  • edits:记录每次操作
  • fsimage:记录某一个时间节点前的当前文件系统全部文件的状态和信息维护整个文件系统元数据
  1. edits文件会被合并到fsimage中,这个合并由:SecondaryNameNode来操作
  2. fsimage记录的内容

1.edits文件

在hdfs中,文件是被划分了一堆堆的block块,那如果文件很大、以及文件很多,Hadoop是如何记录和整理文件和block块的关系呢?

答案就在于NameNode

在这里插入图片描述

NameNode基于一批edits和一个fsimage文件的配合完成整个文件系统的管理和维护

edits文件,是一个流水账文件,记录了hdfs中的每一次操作,以及本次操作影响的文件其对应的block

在这里插入图片描述

在这里插入图片描述

所以,会存在多个edits文件确保不会有超大edits的存在保证检索性能

问题在于,当用户想要查看某文件内容如:/tmp/data/test.txt就需要在全部的edits中搜索(还需要按顺序从头到尾,避免后期改名或删除)效率非常低

需要合并edits文件,得到最终的结果

2.fsimage文件

全部的edits文件合并为最终结果,即可得到一个FSImage文件

fsimage,记录某一个时间节点前的当前文件系统全部文件的状态和信息维护整个文件系统元数据

在这里插入图片描述

3.NameNode元数据管理维护

NameNode基于edits和FSImage的配合,完成整个文件系统文件的管理。

  1. 每次对HDFS的操作,均被edits文件记录

  2. edits达到大小上线后,开启新的edits记录

  3. 定期进行edits的合并操作

    • 如当前没有fsimage文件, 将全部edits合并为第一个fsimage

    • 如当前已存在fsimage文件,将全部edits和已存在的fsimage进行合并,形成新的fsimage

  4. 重复123流程

4.元数据合并控制参数

对于元数据的合并,是一个定时过程,基于:

  • dfs.namenode.checkpoint.period,默认3600(秒)即1小时
  • dfs.namenode.checkpoint.txns,默认1000000,即100W次事务

只要有一个达到条件就执行。检查是否达到条件,默认60秒检查一次,基于:-

  • dfs.namenode.checkpoint.check.period,默认60(秒),来决定

5.SecondaryNameNode的作用

SecondaryNameNode会通过httpNameNode拉取数据(edits和fsimage),然后合并完成后提供给NameNode使用。

2.5.4 HDFS数据的读写流程

1、对于客户端读取HDFS数据的流程中,一定要知道

​ 不论读、还是写,NameNode都不经手数据,均是客户端和DataNode直接通讯,不然对NameNode压力太大

2、写入和读取的流程,简单来说就是:

  • NameNode做授权判断(是否能写、是否能读)
  • 客户端直连DataNode进行写入(由DataNode自己完成副本复制)、客户端直连DataNode进行block读取
  • 写入,客户端会被分配找离自己最近的DataNode写数据
  • 读取,客户端拿到的block列表,会是网络距离最近的一份

3、网络距离

  • 最近的距离就是在同一台机器s

  • 其次就是同一个局域网(交换机)

  • 再其次就是跨越交换机

  • 再其次就是跨越数据中心

    HDFS内置网络距离计算算法,可以通过IP地址、路由表来推断网络距离

1.数据写入流程

在这里插入图片描述

  1. 客户端向NameNode发起请求
  2. NameNode审核权限、剩余空间后,满足条件允许写入,并告知客户端写入的DataNode地址
  3. 客户端向指定的DataNode发送数据包
  4. 被写入数据的DataNode同时完成数据副本的复制工作,将其接收的数据分发给其它DataNode
  5. 如上图,DataNode1复制给DataNode2,
  6. 然后基于DataNode2复制给Datanode3和DataNode4
  7. 写入完成客户端通知NameNode,NameNode做元数据记录工作

关键信息点:

  • NameNode不负责数据写入,只负责元数据记录和权限审批
  • 客户端直接向1台DataNode写数据,这个DataNode一般是**离客户端最近(网络距离)**的那一个
  • 数据块副本的复制工作,由DataNode之间自行完成(构建一个PipLine,按顺序复制分发,如图1给2, 2给3和4)

2.数据读取流程

在这里插入图片描述

1、客户端向NameNode申请读取某文件

2、 NameNode判断客户端权限等细节后,允许读取,并返回此文件的block列表

3、客户端拿到block列表后自行寻找DataNode读取即可

关键点:

1、数据同样不通过NameNode提供

2、NameNode提供的block列表,会基于网络距离计算尽量提供离客户端最近的

这是因为1个block有3份,会尽量找离客户端最近的那一份让其读取

第三章 Hadoop Map Reduce & Hadoop Yarn 分布式计算和资源调度

3.1分布式计算概述

分布式计算常见的2种工作模式:

  • 分散->汇总 (MapReduce就是这种模式)
  • 中心调度->步骤执行 (大数据体系的Spark、Flink等是这种模式)

分散->汇总模式:

  1. 将数据分片,多台服务器各自负责一部分数据处理
  2. 然后将各自的结果,进行汇总处理
  3. 最终得到想要的计算结果

中心调度->步骤执行模式:(分散—具体步骤—汇总,较为复杂)

  1. 由一个节点作为中心调度管理者
  2. 将任务划分为几个具体步骤
  3. 管理者安排每个机器执行任务
  4. 最终得到结果数据

3.2MapReduce概述

MapReduce执行原理

在这里插入图片描述

什么是MapReduce

  • MapReduce是Hadoop中的分布式计算组件
  • MapReduce可以以**分散->汇总(聚合)**模式执行分布式计算任务

MapReduce的主要编程接口

  • map接口,主要提供“分散”功能,由服务器分布式处理数据
  • reduce接口,主要提供“汇总”功能,进行数据汇总统计得到结果
  • MapReduce可供Java、Python等语言开发计算程序

注:MapReduce尽管可以通过Java、Python等语言进行程序开发,但当下年代基本没人会写它的代码了,因为太过时了。 尽管MapReduce很老了,但现在仍旧活跃在一线,主要是Apache Hive框架非常火,而Hive底层就是使用的MapReduce。 所以对于MapReduce的代码开发,课程会简单扩展一下,但不会深入讲解,对MapReduce的底层原理会放在Hive之后,基于Hive做深入分析。

MapReduce的运行机制

  • 将要执行的需求,分解为多个Map Task和Reduce Task
  • 将Map Task 和 Reduce Task分配到对应的服务器去执行

3.3YARN概述

MapReduce是基于YARN运行的,即没有YARN”无法”运行MapReduce程序

在这里插入图片描述

YARN是做什么的?

  • YARN是Hadoop的一个组件用以做集群的资源(内存、CPU等)调度

为什么需要资源调度

  • 将资源统一管控进行分配可以提高资源利用率

程序如何在YARN内运行

  • 程序向YARN 申请所需资源
  • YARN为程序分配所需资源供程序使用

MapReduce和YARN的关系

  • YARN用来调度资源给MapReduce分配和管理运行资源
  • 所以,MapReduce需要YARN才能执行(普遍情况)

3.4YARN架构

1.核心架构

YARN的架构有哪2个角色?

  • 主(Master):ResourceManager
  • 从(Slave):NodeManager

两个角色各自的功能是什么?

  • ResourceManager: 管理、统筹并分配整个集群的资源
  • NodeManager:管理、分配单个服务器的资源,即创建管理容器,由容器提供资源供程序使用

什么是YARN的容器?

  • 容器(Container)是YARN的NodeManager在所属服务器上分配资源的手段
  • NodeManager 预先占用一部分资源
  • 然后将这一部分资源提供给程序使用
  • 应用程序运行在容器(集装箱)内,无法突破容器的资源限制
  • ps:容器是**虚拟化(虚拟化存储docker)**的相关机制,后续我们会详细讲解

2.辅助架构

  • 代理服务器(ProxyServer):Web Application Proxy Web应用程序代理,提高YARN在开放网络中的安全性
  • 历史服务器(JobHistoryServer): 应用程序历史信息记录服务,记录历史运行的程序的信息以及产生的日志并提供WEB UI站点供用户使用浏览器查看。

2.1Web应用代理(Web Application Proxy)

代理服务器,即Web应用代理是 YARN 的一部分。默认情况下,它将作为资源管理器(RM)的一部分运行,但是可以配置为在独立模式下运行。使用代理的原因是为了减少通过 YARN 进行基于网络的攻击的可能性

这是因为, YARN在运行时会提供一个WEB UI站点(同HDFS的WEB UI站点一样)可供用户在浏览器内查看YARN的运行信息

对外提供WEB 站点会有安全性问题, 而代理服务器的功能就是最大限度保障对WEB UI的访问是安全的。 比如:

  • 警告用户正在访问一个不受信任的站点
  • 剥离用户访问的Cookie等

开启代理服务器,可以提高YARN在开放网络中的安全性 (但不是绝对安全只能是辅助提高一些)

代理服务器默认集成在了ResourceManager中

也可以将其分离出来单独启动,如果要分离代理服务器

在yarn-site.xml中配置 yarn.web-proxy.address 参数即可 (部署环节会使用到)

(注:文件在:cd /export/server/hadoop/etc/hadoop)

<property><name>yarn.web-proxy.address</name><value>node1:8089</value><description>代理服务器主机和端口</description>
</property>

并通过命令启动它即可 $HADOOP_YARN_HOME/sbin/yarn-daemon.sh start proxyserver(部署环节会使用到)

[hadoop@node1 hadoop]$ start-dfs.sh
Starting namenodes on [node1]
Starting datanodes
node2: ssh: connect to host node2 port 22: No route to host
Starting secondary namenodes [node1]
[hadoop@node1 hadoop]$ jps
3480 DataNode
3289 NameNode
3995 Jps
3694 SecondaryNameNode
[hadoop@node1 hadoop]$ yarn-daemon.sh start proxyserver
WARNING: Use of this script to start YARN daemons is deprecated.
WARNING: Attempting to execute replacement "yarn --daemon start" instead.
[hadoop@node1 hadoop]$ jps
4065 WebAppProxyServer
3480 DataNode
4104 Jps
3289 NameNode
3694 SecondaryNameNode

2.2JobHistoryServer历史服务器

JobHistoryServer历史服务器功能

  • 提供WEB UI站点,供用户在浏览器上查看程序日志
  • 可以保留历史数据,随时查看历史运行程序信息

JobHistoryServer需要配置

  • 开启日志聚合,即从容器中抓取日志到HDFS集中存储
<property><name>yarn.log-aggregation-enable</name><value>true</value><description>开启日志聚合</description>
</property>
<property><name>yarn.nodemaneger.remote-app-log-dir</name><value>/tmp/logs</value><description>程序日志HDFS的存储路径</description>
</property>
  • 配置历史服务器端口和主机
<property><name>mapreduce.jobhistory.webapp.address</name><value>node1:19888</value><description>历史服务器web端口为node1的19888</description>
</property>

详细历史服务器配置和启动,在部署YARN集群环节讲解

3.5MapReduce & YARN 的部署

关于MapReduce和YARN的部署,其实就是2件事情:

  • 关于MapReduce: 修改相关配置文件,但是没有进程可以启动
  • 关于YARN: 修改相关配置文件, 并启动ResourceManager、NodeManager进程以及辅助进程(代理服务器、历史服务器)

在这里插入图片描述

集群规划

有3台服务器,其中node1配置较高,集群规划如下:

主机角色
node1ResourceManager、NodeManager、ProxyServer、JobHistoryServer
node2NodeManager
node3NodeManager

MapReduce配置文件

在 $HADOOP_HOME/etc/hadoop 文件夹内,修改:

  • mapred-env.sh文件,添加如下环境变量
# 设置JDK路径
export JAVA_HOME=/export/server/jdk
# 设置JobHistoryServer进程内存为1G
export HADOOP_JOB_HISTORYSERVER_HEAPSIZE=1000
# 设置日志级别为INFO
export HADOOP_MAPRED_ROOT_LOGGER=INFO,RFA
  • mapred-site.xml文件,添加如下配置信息
<configuration><property><name>mapreduce.framework.name</name><value>yarn</value><description>MapReduce的运行框架设置为YARN</description></property><property><name>mapreduce.jobhistory.address</name><value>node1:10020</value><description>历史服务器通讯端口为node1:10020</description></property><property><name>mapreduce.jobhistory.webapp.address</name><value>node1:19888</value><description>历史服务器web端口为node1的19888</description></property><property><name>mapreduce.jobhistory.intermediate-done-dir</name><value>/data/mr-history/tmp</value><description>历史信息在HDFS的记录临时路径</description></property><property><name>mapreduce.jobhistory.done-dir</name><value>/data/mr-history/done</value><description>历史信息在HDFS的记录路径</description></property><property><name>yarn.app.mapreduce.am.env</name><value>HADOOP_MAPRED_HOME=$HADOOP_HOME</value><description>MapReduce HOME设置为HADOOP_HOME</description></property><property><name>mapreduce.map.env</name><value>HADOOP_MAPRED_HOME=$HADOOP_HOME</value><description>MapReduce HOME设置为HADOOP_HOME</description></property><property><name>mapreduce.reduce.env</name><value>HADOOP_MAPRED_HOME=$HADOOP_HOME</value><description>MapReduce HOME设置为HADOOP_HOME</description></property>
</configuration>

YARN配置文件

在 $HADOOP_HOME/etc/hadoop 文件夹内,修改:

  • yarn-env.sh文件,添加如下4行环境变量内容:
# 设置JDK路径的环境变量
export JAVA_HOME=/export/server/jdk
# 设置HADOOP_HOME的环境变量
export HADOOP_HOME=/export/server/hadoop
# 设置配置文件路径的环境变量
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
# 设置日志文件路径的环境变量
export HADOOP_LOG_DIR=$HADOOP_HOME/logs
  • yarn-site.xml文件,配置如图属性
<configuration><!-- Site specific YARN configuration properties -->
<property><name>yarn.log.server.url</name><value>http://node1:19888/jobhistory/logs</value><description></description>
</property><property><name>yarn.web-proxy.address</name><value>node1:8089</value><description>proxy server hostname and port</description></property><property><name>yarn.log-aggregation-enable</name><value>true</value><description>Configuration to enable or disable log aggregation</description></property><property><name>yarn.nodemanager.remote-app-log-dir</name><value>/tmp/logs</value><description>Configuration to enable or disable log aggregation</description></property><!-- Site specific YARN configuration properties --><property><name>yarn.resourcemanager.hostname</name><value>node1</value><description></description></property><property><name>yarn.resourcemanager.scheduler.class</name><value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value><description></description></property><property><name>yarn.nodemanager.local-dirs</name><value>/data/nm-local</value><description>Comma-separated list of paths on the local filesystem where intermediate data is written.</description></property><property><name>yarn.nodemanager.log-dirs</name><value>/data/nm-log</value><description>Comma-separated list of paths on the local filesystem where logs are written.</description></property><property><name>yarn.nodemanager.log.retain-seconds</name><value>10800</value><description>Default time (in seconds) to retain log files on the NodeManager Only applicable if log-aggregation is disabled.</description></property><property><name>yarn.nodemanager.aux-services</name><value>mapreduce_shuffle</value><description>Shuffle service that needs to be set for Map Reduce applications.</description></property>
</configuration>

分发配置文件

MapReduce和YARN的配置文件修改好后,需要分发到其它的服务器节点中。

scp mapred-env.sh mapred-site.xml yarn-env.sh yarn-site.xml node2:`pwd`/
scp mapred-env.sh mapred-site.xml yarn-env.sh yarn-site.xml node3:`pwd`/

分发完成配置文件,就可以启动YARN的相关进程啦。

集群启动命令介绍

常用的进程启动命令如下:

  • 一键启动YARN集群: $HADOOP_HOME/sbin/start-yarn.sh

    • 会基于yarn-site.xml中配置的yarn.resourcemanager.hostname来决定在哪台机器上启动resourcemanager
    • 会基于workers文件配置的主机启动NodeManager
  • 一键停止YARN集群: $HADOOP_HOME/sbin/stop-yarn.sh

  • 在当前机器,单独启动或停止进程

    • $HADOOP_HOME/bin/yarn --daemon start|stop resourcemanager|nodemanager|proxyserver
    • start和stop决定启动和停止
    • 可控制resourcemanager、nodemanager、proxyserver三种进程
  • 历史服务器启动和停止

    • $HADOOP_HOME/bin/mapred --daemon start|stop historyserver

开始启动YARN集群

node1服务器,以hadoop用户执行

  • 首先执行:$HADOOP_HOME/sbin/start-yarn.sh,一键启动所需的:

    • ResourceManager、NodeManager、ProxyServer(代理服务器)
  • 其次执行:$HADOOP_HOME/bin/mapred --daemon start historyserver 启动:

    • HistoryServer(历史服务器)

查看YARN的WEB UI页面

打开http://node1:8088即可看到YARN集群的监控页面(ResourceManager的WEB UI)

在这里插入图片描述

在最后,可以给虚拟机打上快照,保存安装状态

3.6MapReduce & YARN 初体验

3.6.1 集群启停命令

一键启动脚本

启动:

$HADOOP_HOME/sbin/start-yarn.sh

  • 从yarn-site.xml中读取配置,确定ResourceManager所在机器,并启动它
  • 读取workers文件,确定机器,启动全部的NodeManager
  • 在当前机器启动ProxyServer(代理服务器)

关闭

$HADOOP_HOME/sbin/stop-yarn.sh

单进程启停

除了一键启停外,也可以单独控制进程的启停。

  • $HADOOP_HOME/bin/yarn,此程序也可以用以单独控制所在机器的进程的启停

用法:yarn --daemon (start|stop) (resourcemanager|nodemanager|proxyserver)

  • $HADOOP_HOME/bin/mapred,此程序也可以用以单独控制所在机器的历史服务器的启停

用法:mapred --daemon (start|stop) historyserver

[hadoop@node1 hadoop]$ mapred --daemon start historyserver
WARNING: HADOOP_MAPRED_ROOT_LOGGER has been replaced by HADOOP_ROOT_LOGGER. Using value of HADOOP_MAPRED_ROOT_LOGGER.
[hadoop@node1 hadoop]$ jps
4065 WebAppProxyServer
6178 NameNode
6563 SecondaryNameNode
7155 NodeManager
3480 DataNode
6984 ResourceManager
8185 JobHistoryServer
8204 Jps
3.6.2 提交MapReduce任务到YARN执行

在部署并成功启动YARN集群后,我们就可以在YARN上运行各类应用程序了。

YARN作为资源调度管控框架,其本身提供资源供许多程序运行,常见的有:

  • MapReduce程序
  • Spark程序
  • Flink程序

Spark和Flink是大数据后续的学习内容,我们目前先来体验一下在YARN上执行MapReduce程序的过程。

Hadoop官方内置了一些预置的MapReduce程序代码,我们无需编程,只需要通过命令即可使用。

常用的有2个MapReduce内置程序:

  • wordcount:单词计数程序。

统计指定文件内各个单词出现的次数

  • pi:求圆周率

通过蒙特卡罗算法(统计模拟法)求圆周率

  • 这些内置的示例MapReduce程序代码,都在:

$HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.1.jar 这个文件内。

  • 可以通过 hadoop jar 命令来运行它,提交MapReduce程序到YARN中。

语法: hadoop jar 程序文件 java类名 [程序参数] ... [程序参数]

提交wordcount示例程序

单词计数示例程序的功能很简单:

  • 给定数据输入的路径(HDFS)、给定结果输出的路径(HDFS)
  • 将输入路径内的数据中的单词进行计数,将结果写到输出路径

我们可以准备一份数据文件,并上传到HDFS中。

itheima itcast itheima itcast
hadoop hdfs hadoop hdfs
hadoop mapreduce hadoop yarn
itheima hadoop itcast hadoop
itheima itcast hadoop yarn mapreduce

将上面内容保存到Linux中为words.txt文件,并上传到HDFS hadoop fs -mkdir -p /input/wordcount

hadoop fs -mkdir /output

hadoop fs -put words.txt /input/wordcount/

  • 执行如下命令,提交示例MapReduce程序WordCount到YARN中执行

    $HADOOP_HOME = /export/server/hadoop

hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.4.0.jar wordcount hdfs://node1:8020/input/wordcount/ hdfs://node1:8020/output/wc1

注意:

  • 参数wordcount,表示运行jar包中的单词计数程序(Java Class)
  • 参数1是数据输入路径(hdfs://node1:8020/input/wordcount/)
  • 参数2是结果输出路径(hdfs://node1:8020/output/wc1), 需要确保输出的文件夹wc1不存在

提交程序后,可以在YARN的WEB UI页面看到运行中的程序(http://node1:8088/cluster/apps)

在这里插入图片描述

执行完成后,可以查看HDFS上的输出结果

在这里插入图片描述

  • _SUCCESS文件是标记文件,表示运行成功,本身是空文件
  • part-r-00000,是结果文件,结果存储在以part开头的文件中
 cd /export/server/hadoop/etc/hadoop
[hadoop@node1 hadoop]$ vim words.txt
[hadoop@node1 hadoop]$ hdfs dfs -mkdir -p /input/wordcount
[hadoop@node1 hadoop]$ hdfs dfs -mkdir /output
[hadoop@node1 hadoop]$ hdfs dfs -put words.txt /input/wordcount/[hadoop@node1 hadoop]$ hadoop jar /export/server/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.4.0.jar wordcount hdfs://node1:8020/input/wordcount/ hdfs://node1:8020/output/wc1
# hadoop jar 程序文件 java类名 [程序参数1(输入的文件夹)] ... [程序参数(输出的文件夹)][hadoop@node1 hadoop]$ hadoop fs -ls /output/wc1
Found 2 items
-rw-r--r--   3 hadoop supergroup          0 2024-10-21 14:40 /output/wc1/_SUCCESS
-rw-r--r--   3 hadoop supergroup         54 2024-10-21 14:40 /output/wc1/part-r-00000[hadoop@node1 hadoop]$ hadoop fs -cat /output/wc1/*
hadoop	7
hdfs	2
itcast	4
itheima	4
mapreduce	2
yarn	2

查看运行日志

在这里插入图片描述

在这里插入图片描述

提交求圆周率示例程序

可以执行如下命令,使用蒙特卡罗算法模拟计算求PI(圆周率)

hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.1.jar pi 3 1000

  • 参数pi表示要运行的Java类,这里表示运行jar包中的求pi程序
  • 参数3,表示设置几个map任务
  • 参数1000,表示模拟求PI的样本数(越大求的PI越准确,但是速度越慢)
[hadoop@node1 hadoop]$ hadoop jar /export/server/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.4.0.jar pi 3 1000
Number of Maps  = 3
Samples per Map = 1000
Wrote input for Map #0
Wrote input for Map #1
Wrote input for Map #2
Starting Job
....
Job Finished in 127.654 seconds
Estimated value of Pi is 3.14133333333333333333

如上,运行完成,求得PI值(样本1000太小,不够精准,仅演示)

第四章 Apache Hive

4.1Apache Hive 概述

分布式SQL计算 — Hive

MapReduce支持程序开发(Java、Python等)但不支持SQL开发

什么是分布式SQL计算?

  • 以分布式的形式,执行SQL语句,进行数据统计分析。

Apache Hive是一款分布式SQL计算的工具, 其主要功能是:

  • SQL语句 翻译成MapReduce程序运行

在这里插入图片描述

使用Hive处理数据的好处

  • 操作接口采用类SQL语法,提供快速开发的能力(简单、容易上手
  • 底层执行MapReduce,可以完成分布式海量数据的SQL处理

传统MapReduce开发:写MR代码->得到结果

使用Hive开发:写SQL->得到结果

底层都是MR在运行,但是使用层面上更加简单了。

4.2模拟实现Hive功能

基于MapReduce构建分布式SQL执行引擎,主要需要有哪些功能组件?

  • 元数据管理:帮助记录各类元数据
    • 数据位置
    • 数据结构
    • 等对数据进行描述
  • SQL解析器:帮助记录各类元数据

Apache Hive其2大主要组件就是:元数据存储以及SQL解析器, 如下图。

在这里插入图片描述

4.3Hive基础架构

1.Hive架构图

Hive的核心架构包含哪些?

  • 元数据管理,称之为Metastore服务
  • SQL解析器(Driver驱动程序),完成SQL解析、执行优化、代码提交等功能
  • 用户接口:提供用户和Hive交互的功能

在这里插入图片描述

2.Hive组件

  • 元数据存储

通常是存储在关系数据库如 mysql/derby中。Hive 中的元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等。

– Hive提供了 Metastore 服务进程提供元数据管理功能

  • Driver驱动程序,包括语法解析器、计划编译器、优化器、执行器

完成 HQL 查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。生成的查询计划存储在 HDFS 中,并在随后有执行引擎调用执行。

这部分内容不是具体的服务进程,而是封装在Hive所依赖的Jar文件即Java代码中。

  • 用户接口

包括 CLI、JDBC/ODBC、WebGUI。其中,CLI(command line interface)为shell命令行;Hive中的Thrift服务器允许外部客户端通过网络与Hive进行交互,类似于JDBC或ODBC协议。WebGUI是通过浏览器访问Hive。

– Hive提供了 Hive Shell、 ThriftServer等服务进程向用户提供操作接口

4.4Hive部署(详细另见)

CentOS7下,hive4.0.0安装部署

4.4.1VMware虚拟机部署

Hive是分布式运行的框架还是单机运行的?

Hive是单机工具,只需要部署在一台服务器即可。

Hive虽然是单机的,但是它可以提交分布式运行的MapReduce程序运行。

规划

我们知道Hive是单机工具后,就需要准备一台服务器供Hive使用即可。

同时Hive需要使用元数据服务,即需要提供一个关系型数据库,我们也选择一台服务器安装关系型数据库即可

所以:

服务机器
Hive本体部署在node1
元数据服务所需的关系型数据库(课程选择最为流行的MySQL部署在node1

为了简单起见,都安装到node1服务器上

。。。

4.4.2 阿里云部署略
4.4.3 UCloud云部署略

4.5 Hive初体验

  • Hive中可以使用类MySQL的SQL语法完成基本的库、表、插入、查询等操作
  • 通过YARN控制台可以看到,Hive是将SQL翻译成MapReduce程序运行在YARN中
  • Hive中创建的库和表的数据,存储在HDFS中,默认存放在:hdfs://node1:8020/user/hive/warehouse中。

首先,确保启动了Metastore服务。

可以执行:bin/hive,进入到Hive Shell环境中,可以直接执行SQL语句。

  • 创建表

CREATE TABLE test(id INT, name STRING, gender STRING);

  • 插入数据

INSERT INTO test VALUES(1, ‘王力红’, ‘男’), (2, ‘周杰轮’, ‘男’), (3, ‘林志灵’, ‘女’);

  • 查询数据

SELECT gender, COUNT(*) AS cnt FROM test GROUP BY gender;

  • 验证Hive的数据存储

Hive的数据存储在HDFS的:/user/hive/warehouse

  • 验证SQL语句启动的MapReduce程序

打开YARN的WEB UI页面查看任务情况:http://node1:8088

4.6 Hive客户端

4.6.1 HiveServer2 & Beeline

HiveServer2服务

在启动Hive的时候,除了必备的Metastore服务外,我们前面提过有2种方式使用Hive:

  • 方式1: bin/hive 即Hive的Shell客户端,可以直接写SQL

方式2: bin/hive --service hiveserver2

后台执行脚本:nohup bin/hive --service hiveserver2 >> logs/hiveserver2.log 2>&1 &

bin/hive --service metastore,启动的是元数据管理服务

bin/hive --service hiveserver2,启动的是HiveServer2服务

HiveServer2是Hive内置的一个ThriftServer服务,提供Thrift端口供其它客户端链接

可以连接ThriftServer的客户端有:

  • Hive内置的 beeline客户端工具(命令行工具)
  • 第三方的图形化SQL工具,如DataGrip、DBeaver、Navicat等

启动

在hive安装的服务器上,首先启动metastore服务,然后启动hiveserver2服务

#先启动metastore服务 然后启动hiveserver2服务
nohup bin/hive --service metastore >> logs/metastore.log 2>&1 &
nohup bin/hive --service hiveserver2 >> logs/hiveserver2.log 2>&1 &

beeline

  • 在node1上使用beeline客户端进行连接访问。需要注意hiveserver2服务启动之后需要稍等一会才可以对外提供服务
  • Beeline是JDBC的客户端,通过JDBC协议和Hiveserver2服务进行通信,协议的地址是:jdbc:hive2://node1:10000
[root@node1 ~]# /export/server/hive/bin/beeline 
Beeline version 3.1.2 by Apache Hive
beeline> ! connect jdbc:hive2://node1:10000
Connecting to jdbc:hive2://node1:10000
Enter username for jdbc:hive2://node1:10000: root
Enter password for jdbc:hive2://node1:10000: 
Connected to: Apache Hive (version 3.1.2)
Driver: Hive JDBC (version 3.1.2)
Transaction isolation: TRANSACTION_REPEATABLE_READ0: jdbc:hive2://node1:10000> 
4.6.2 DataGrip & DBeaver

在这里插入图片描述

1.Hive第三方客户端

DataGrip、Dbeaver、SQuirrel SQL Client等

可以在Windows、MAC平台中通过JDBC连接HiveServer2的图形界面工具

这类工具往往专门针对SQL类软件进行开发优化、页面美观大方,操作简洁,更重要的是SQL编辑环境优雅

SQL语法智能提示补全、关键字高亮、查询结果智能显示、按钮操作大于命令操作;

2.Hive可视化工具客户端

DataGrip

DataGrip是由JetBrains公司推出的数据库管理软件,DataGrip支持几乎所有主流的关系数据库产品,如DB2、Derby、MySQL、Oracle、SQL Server等,也支持几乎所有主流的大数据生态圈SQL软件,并且提供了简单易用的界面,开发者上手几乎不会遇到任何困难。

相关文章:

Hadoop学习笔记(包括hadoop3.4.0集群安装)(黑马)

Hadoop学习笔记 0-前置章节-环境准备 0.1 环境介绍 配置环境&#xff1a;hadoop-3.4.0&#xff0c;jdk-8u171-linux-x64 0.2 VMware准备Linux虚拟机 0.2.1主机名、IP、SSH免密登录 1.配置固定IP地址&#xff08;root权限&#xff09; 开启master&#xff0c;修改主机名为…...

thinkphp:try-catch捕获异常

使用简单的例子&#xff0c;实现了一个简单的try-catch捕获异常的实例 //开始事务Db::startTrans(); try{ //有异常抛出异常 if(存在错误){ throw new \Exception("异常信息"); } // 提交事务 Db::commit(); // 返回成功信息 ... } catch (\…...

如何使用 uni-app 构建直播应用程序?

使用uni-app构建直播应用程序涉及前端和后端的开发&#xff0c;以及音视频处理技术的选择。下面我将概述一个典型的直播应用架构&#xff0c;并详细说明如何在uni-app中实现关键功能。 直播应用架构 前端&#xff08;uni-app&#xff09;&#xff1a;负责用户界面展示、互动逻…...

正则表达式入门教程

正则表达式入门教程 1. 引言 正则表达式(Regular Expression,简称Regex)是一种用于处理字符串的强大工具,它允许用户通过特定的模式(pattern)来搜索、匹配、查找和替换文本中的数据。正则表达式在文本处理、数据验证、数据提取等领域有着广泛的应用。本教程将带你了解正…...

uniapp 常用的指令语句

uniapp 是一个使用 Vue.js 开发的跨平台应用框架&#xff0c;因此&#xff0c;它继承了 Vue.js 的大部分指令。以下是一些在 uniapp 中常用的 Vue 指令语句及其用途&#xff1a; v-if / v-else-if / v-else 条件渲染。v-if 有条件地渲染元素&#xff0c;v-else-if 和 v-else 用…...

【Figma_01】Figma软件初始与使用

Figma初识与学习准备 背景介绍软件使用1.1 切换主题1.2 官方社区 设计界面2.1 创建一个项目2.2 修改文件名2.3 四种模式2.4 新增界面2.5 图层2.6 工具栏2.7 属性栏section透明度和圆角改变多边形的边数渐变效果描边设置阴影等特效拖拽相同的图形 背景介绍 Ul设计:User Interfa…...

AI工具如何深刻改变我们的工作与生活

在当今这个科技日新月异的时代&#xff0c;人工智能&#xff08;AI&#xff09;已经从科幻小说中的概念变成了我们日常生活中不可或缺的一部分。从智能家居到自动驾驶汽车&#xff0c;从医疗诊断到金融服务&#xff0c;AI正以惊人的速度重塑着我们的世界。 一、工作方式的革新…...

信息安全实训室网络攻防靶场实战核心平台解决方案

一、引言 网络安全靶场&#xff0c;作为一种融合了虚拟与现实环境的综合性平台&#xff0c;专为基础设施、应用程序及物理系统等目标设计&#xff0c;旨在向系统用户提供全方位的安全服务&#xff0c;涵盖教学、研究、训练及测试等多个维度。随着网络空间对抗态势的日益复杂化…...

平方根无迹卡尔曼滤波(SR-UKF)的MATLAB例程,使用三维非线性的系统

本MATLAB 代码实现了平方根无迹卡尔曼滤波&#xff08;SR-UKF&#xff09;算法&#xff0c;用于处理三维非线性状态估计问题 文章目录 运行结果代码概述代码 运行结果 三轴状态曲线对比&#xff1a; 三轴误差曲线对比&#xff1a; 误差统计特性输出&#xff08;命令行截图&…...

【从零开始入门unity游戏开发之——C#篇04】栈(Stack)和堆(Heap),值类型和引用类型,以及特殊的引用类型string,垃圾回收( GC)

文章目录 知识回顾一、栈&#xff08;Stack&#xff09;和堆&#xff08;Heap&#xff09;1、什么是栈和堆2、为什么要分栈和堆3、栈和堆的区别栈堆 4、总结 二、值类型和引用类型1、那么值类型和引用类型到底有什么区别呢&#xff1f;值类型引用类型 2、总结 三、特殊的引用类…...

人员离岗监测摄像机智能人员睡岗、逃岗监测 Python 语言结合 OpenCV

在安全生产领域&#xff0c;人员的在岗状态直接关系到生产流程的顺利进行和工作环境的安全稳定。人员离岗监测摄像机的出现&#xff0c;为智能人员睡岗、逃岗监测提供了高效精准的解决方案&#xff0c;而其中的核心技术如AI识别睡岗脱岗以及相关的算法盒子和常见的安全生产AI算…...

Linux-ubuntu点LED灯C语言版

​ 一&#xff0c;C语言点灯 1.寄存器配置 设置为SVC模式&#xff0c;复用寄存器设置GPIO1-IO003,设置电气属性&#xff0c;设置为输出模式。 2.软件 汇编语言对模式设置&#xff0c;并且将堆栈指针指向主程序&#xff1a; .global _start_start: /*设置为svr模式 */mrs …...

第P3周:Pytorch实现天气识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 目标 读取天气图片&#xff0c;按文件夹分类搭建CNN网络&#xff0c;保存网络模型并加载模型使用保存的模型预测真实天气 具体实现 &#xff08;一&#xf…...

代理IP与生成式AI:携手共创未来

目录 代理IP&#xff1a;网络世界的“隐形斗篷” 1. 隐藏真实IP&#xff0c;保护隐私 2. 突破网络限制&#xff0c;访问更多资源 生成式AI&#xff1a;创意与效率的“超级大脑” 1. 提高创作效率 2. 个性化定制 代理IP与生成式AI的协同作用 1. 网络安全 2. 内容创作与…...

函数式编程

Lambda表达式 1、什么时候可以使用Lambda表达式呢? 一般都是在简化匿名内部类,当这个函数是一个接口,并且接口中只要一个方法时,就可以使用Lambda表达式 2、格式 (参数列表)->{方法体} 其中形参也不需要传,只需要传实参 只关注参数列表和方法体不关注方法啥的东西…...

抖音SEO短视频矩阵源码系统开发分享

在数字营销的前沿阵地&#xff0c;抖音短视频平台凭借其独特的魅力和庞大的用户基础&#xff0c;已成为社交媒体领域一股不可小觑的力量。随着平台影响力的持续扩大&#xff0c;如何有效提升视频内容的可见度与流量成为了内容创作者关注的焦点。在此背景下&#xff0c;一套专为…...

常见的锁与线程安全

目录 一、STL,智能指针和线程安全 STL中的容器是否是线程安全的? 智能指针是否是线程安全的? 二、其他常见的各种锁 三、自旋锁 四、读者写者问题 读写锁接口 读者优先伪代码 一、STL,智能指针和线程安全 STL中的容器是否是线程安全的? 不是 . 原因是 , STL 的设…...

java中的List、数组和set

在Java中&#xff0c;List、数组&#xff08;Array&#xff09;和Set 是三种常用的数据结构&#xff0c;它们各自有不同的特性、用途和实现方式。下面我们将深入探讨这三者的特点、区别以及它们在 Java 中的常见使用场景。 1. 数组&#xff08;Array&#xff09; 特性&#x…...

NLP-Huggingface基本使用方法

NLP的网络结构大同小异&#xff0c;只不过训练策略可能会不同。因为与图像cv不同&#xff0c;文本训练数据非常的多&#xff0c;cv可以使用10几张就可以获得特征向量&#xff0c;而文本做不到学几句话就能让计算机听得懂话。因此&#xff0c;我们都需要使用预训练模型&#xff…...

Liquibase结合SpringBoot使用实现数据库管理

Liquibase概述 Liquibase 是一个开源的数据库变更管理工具&#xff0c;用于跟踪、版本化、和管理数据库结构&#xff08;如表、字段、索引等&#xff09;的变更。它的目的是使数据库变更的过程更加透明、可控制、自动化&#xff0c;避免开发团队在多个环境中手动执行相同的数据…...

高防CDN 如何防止DDoS和CC攻击?

在数字化时代&#xff0c;网络安全威胁日益严重&#xff0c;尤其是DDoS&#xff08;分布式拒绝服务&#xff09;攻击和CC&#xff08;Challenge Collapsar&#xff09;攻击&#xff0c;已成为企业网站和网络服务最常见且最具破坏力的攻击手段。为了有效抵御这些攻击&#xff0c…...

15.初始接口1.0 C#

这是一个用于实验接口的代码 适合初认识接口的人 【CSDN开头介绍】&#xff08;文心一言AI生成&#xff09; 在C#编程世界中&#xff0c;接口&#xff08;Interface&#xff09;扮演着至关重要的角色&#xff0c;它定义了一组方法&#xff0c;但不提供这些方法的实现。接口作为…...

数据结构day5:单向循环链表 代码作业

一、loopLink.h #ifndef __LOOPLINK_H__ #define __LOOPLINK_H__#include <stdio.h> #include <stdlib.h>typedef int DataType;typedef struct node {union{int len;DataType data;};struct node* next; }loopLink, *loopLinkPtr;//创建 loopLinkPtr create();//…...

利用CNN与多尺度特征、注意力机制的融合实现低分辨率人脸表情识别,并给出模型介绍与代码实现

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下利用CNN与多尺度特征、注意力机制的融合实现低分辨率人脸表情识别&#xff0c;并给出模型介绍与代码实现。在当今社会&#xff0c;人脸识别技术已广泛应用&#xff0c;但特定场景下的低质量图像仍是一大挑战。 低分…...

spring RestTemplate使用说明

rest-template是spring对httpclient的逻辑封装&#xff0c;它底层还是基于httpclient&#xff0c;所以一些配置其实跟httpclient是强相关的。 基本配置 rest-template可以不带参数&#xff0c;使用默认配置&#xff0c;也可以指定ClientHttpRequestFactory参数&#xff0c;Cl…...

设置HP条UI

概述 设置常见的生命值条&#xff0c; 实现过程 设置UI/image作为形状 设置UI/Image作为背景 设置UI/image&#xff08;healthfill&#xff09;作为填充图片&#xff0c;层数低于背景 设置heathfill的imagetype为filled fillmethod为horizontal [SerializeField] private Im…...

常见排序算法总结 (五) - 堆排序与堆操作

堆排序&#xff08;借助 API&#xff09; 算法思想 利用堆能够维护数组中最大值的性质&#xff0c;根据数组元素建立最大堆&#xff0c;依次弹出元素并维护堆结构&#xff0c;直到堆为空。 稳定性分析 堆排序是不稳定的&#xff0c;因为堆本质上是完全二叉树&#xff0c;排…...

Linux 本地编译安装 gcc9

这里演示非sudo权限的本地linux 用户安装 gcc9 下载源代码&#xff1a; 可以从GCC官方网站或其镜像站点下载GCC 9的源代码压缩包。使用wget或curl命令&#xff0c;这通常不需要额外权限 wget https://ftp.gnu.org/gnu/gcc/gcc-9.5.0/gcc-9.5.0.tar.gz tar -xf gcc-9.5.0.tar…...

开源FreeSWITCH大模型智能客服系统的最佳实践

开源 FreeSWITCH 大模型智能客服系统的最佳实践 原作者&#xff1a;开源呼叫中心FreeIPCC&#xff0c;其Github&#xff1a;https://github.com/lihaiya/freeipcc 引言 开源 FreeSWITCH 大模型智能客服系统因其灵活性、成本效益和技术先进性&#xff0c;成为众多企业提升客户…...

大数据技术与应用——数据可视化(山东省大数据职称考试)

大数据分析应用-初级 第一部分 基础知识 一、大数据法律法规、政策文件、相关标准 二、计算机基础知识 三、信息化基础知识 四、密码学 五、大数据安全 六、数据库系统 七、数据仓库. 第二部分 专业知识 一、大数据技术与应用 二、大数据分析模型 三、数据科学 数据可视化 大…...

大数据之Hbase环境安装

Hbase软件版本下载地址&#xff1a; http://mirror.bit.edu.cn/apache/hbase/ 1. 集群环境 Master 172.16.11.97 Slave1 172.16.11.98 Slave2 172.16.11.99 2. 下载软件包 #Master wget http://archive.apache.org/dist/hbase/0.98.24/hbase-0.98.24-hadoop1-bin.tar.gz…...

Node.js day-01

01.Node.js 讲解 什么是 Node.js&#xff0c;有什么用&#xff0c;为何能独立执行 JS 代码&#xff0c;演示安装和执行 JS 文件内代码 Node.js 是一个独立的 JavaScript 运行环境&#xff0c;能独立执行 JS 代码&#xff0c;因为这个特点&#xff0c;它可以用来编写服务器后端…...

OpenCV相机标定与3D重建(25)计算两个三维点集之间的最优仿射变换矩阵(3x4)函数estimateAffine3D()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 计算两个3D点集之间的最优仿射变换。 它计算 [ x y z ] [ a 11 a 12 a 13 a 21 a 22 a 23 a 31 a 32 a 33 ] [ X Y Z ] [ b 1 b 2 b 3 ] \beg…...

SQL 中 INNER JOIN 和 LEFT JOIN 的区别和用法

在数据库语言 SQL 中&#xff0c;连接 (也称进行表结合操作)是一种常见的操作&#xff0c;用于将多个数据表格核实关联进行查询。常见的连接类型中&#xff0c; INNER JOIN 和 LEFT JOIN 是最基本且最常用的。下面将给出完整的区别和用法说明。 1. 基本概念 INNER JOIN (内连…...

【计算机网络】lab2 Ethernet(链路层Ethernet frame结构细节)

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;各种软件安装与配置_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 1. …...

2024 年 MySQL 8.0.40 安装配置、Workbench汉化教程最简易(保姆级)

首先到官网上下载安装包&#xff1a;http://www.mysql.com 点击下载&#xff0c;拉到最下面&#xff0c;点击社区版下载 windows用户点击下面适用于windows的安装程序 点击下载&#xff0c;网络条件好可以点第一个&#xff0c;怕下着下着断了点第二个离线下载 双击下载好的安装…...

提升PHP技能:18个实用高级特性

掌握PHP基础知识只是第一步。 深入了解这18个强大的PHP特性&#xff0c;将显著提升您的开发效率和代码质量。 1、超越 __construct() 的魔法方法 虽然 __construct() 为大多数开发者所熟知&#xff0c;PHP 却提供了更多强大的魔术方法&#xff0c;例如&#xff1a; class Da…...

QT数据库(三):QSqlQuery使用

QSqlQuery 简介 QSqlQuery 是能运行任何 SQL 语句的类&#xff0c;如 SELECT、INSERT、UPDATE、DELETE 等 SQL 语句。所以使用 QSqlQuery 几乎能进行任何操作&#xff0c;例如创建数据表、修改数据表的字段定义、进行数据统计等。如果运行的是 SELECT 语句&#xff0c;它查询…...

【机器学习】在向量的流光中,揽数理星河为衣,以线性代数为钥,轻启机器学习黎明的瑰丽诗章

文章目录 线性代数入门&#xff1a;机器学习零基础小白指南前言一、向量&#xff1a;数据的基本单元1.1 什么是向量&#xff1f;1.1.1 举个例子&#xff1a; 1.2 向量的表示与维度1.2.1 向量的维度1.2.2 向量的表示方法 1.3 向量的基本运算1.3.1 向量加法1.3.2 向量的数乘1.3.3…...

设计模式详解(十一):模板方法——Template Method

Template Method 设计模式 1. 概述 Template Method 是一种行为设计模式&#xff0c;它定义了一个算法的框架&#xff0c;并允许子类在不改变算法结构的前提下重新定义算法中的某些步骤。 在 Template Method 模式中&#xff1a; 父类&#xff08;抽象类&#xff09;定义了…...

使用 DeepSpeed 微调 OPT 基础语言模型

文章目录 OPT 基础语言模型Using OPT with DeepSpeedmain.py 解析1、导入库和模块2、解析命令行参数3、main 函数3.1 设备与分布式初始化3.2 模型与数据准备3.3 定义评估函数3.4 优化器与学习率调度器设置3.5 使用 deepspeed 进行模型等初始化3.6 训练循环3.7 模型保存 4、dsch…...

DPDK用户态协议栈-TCP Posix API 2

tcp posix api send发送 ssize_t nsend(int sockfd, const void *buf, size_t len, __attribute__((unused))int flags) {ssize_t length 0;void* hostinfo get_host_fromfd(sockfd);if (hostinfo NULL) {return -1;}struct ln_tcp_stream* stream (struct ln_tcp_stream…...

打造微信小程序中的视频播放交互体验:videoUI组件库实战

本文还有配套的精品资源&#xff0c;点击获取 简介&#xff1a;本项目介绍如何利用 videoUI 组件库在微信小程序中实现视频切换播放和全屏播放功能。涵盖微信小程序开发基础、 <video> 组件使用、视频切换逻辑、全屏播放实现以及 videoUI 库的应用。为开发者提供…...

Django REST framework(DRF)在处理不同请求方法时的完整流程

文章目录 一、POST 请求创建对象的流程二、GET 请求获取对象列表的流程三、GET 请求获取单个对象的流程四、PUT/PATCH 请求更新对象的流程五、自定义方法的流程自定义 GET 方法自定义 POST 方法 一、POST 请求创建对象的流程 请求到达视图层 方法调用&#xff1a; dispatch说明…...

【Hive】-- hive 3.1.3 伪分布式部署(单节点)

1、环境准备 1.1、版本选择 apache hive 3.1.3 apache hadoop 3.1.0 oracle jdk 1.8 mysql 8.0.15 操作系统:Mac os 10.151.2、软件下载 https://archive.apache.org/dist/hive/ https://archive.apache.org/dist/hadoop/ 1.3、解压 tar -zxvf apache-hive-4.0.0-bin.tar…...

unity 雷达

unity 雷达 首先去商店下载TouchScript插件 导入的时候勾选Enable TUIO 然后把预制体Cursors和TouchManager拖上 最后把TuioInput这个脚本挂上 脚本上的端口号尽量不改...

Visual Studio 2022 安装和管理 GitHub Copilot

&#x1f380;&#x1f380;&#x1f380;【AI辅助编程系列】&#x1f380;&#x1f380;&#x1f380; Visual Studio 使用 GitHub Copilot 与 IntelliCode 辅助编码Visual Studio 安装和管理 GitHub CopilotVisual Studio 使用 GitHub Copilot 扩展Visual Studio 使用 GitHu…...

Python从0到100(七十三):Python OpenCV-OpenCV实现手势虚拟拖拽

前言: 零基础学Python:Python从0到100最新最全教程。 想做这件事情很久了,这次我更新了自己所写过的所有博客,汇集成了Python从0到100,共一百节课,帮助大家一个月时间里从零基础到学习Python基础语法、Python爬虫、Web开发、 计算机视觉、机器学习、神经网络以及人工智能…...

利用notepad++删除特定关键字所在的行

1、按组合键Ctrl H&#xff0c;查找模式选择 ‘正则表达式’&#xff0c;不选 ‘.匹配新行’ 2、查找目标输入 &#xff1a; ^.*关键字.*\r\n (不保留空行) ^.*关键字.*$ (保留空行)3、替换为&#xff1a;&#xff08;空&#xff09; 配置界面参考下图&#xff1a; ​​…...

Alan Chhabra:MongoDB AI应用程序计划(MAAP) 为客户提供价值

MongoDB全球合作伙伴执行副总裁 Alan Chhabra 每当有人向我问询MongoDB&#xff0c;我都会说他们很可能在不觉之间已经与MongoDB有过交集。事实上&#xff0c;包括70%财富百强在内的许多世界领先企业公司都在使用MongoDB。我们在MongoDB所做的一切都是为了服务客户&#xff0c…...