东北大学2023分布式操作系统实验

news2024/11/18 11:45:03

1.实验目的

建立伪分布式(有条件的可以建立分布式环境)的Hadoop环境,并成功运行示例程序。

2.Hadoop简介

2.1 Hadoop项目基础结构

在这里插入图片描述

在其核心,Hadoop主要有两个层次,即:

  • 加工/计算层(MapReduce)
  • 存储层(Hadoop分布式文件系统)

除了上面提到的两个核心组件,Hadoop的框架还包括以下两个模块:

  • Hadoop通用:这是Java库和其他Hadoop组件所需的实用工具
  • Hadoop YARN :这是作业调度和集群资源管理的框架

注:本实验主要涉及到:HDFS(分布式文件系统)、YARN(资源管理和调度框架)、以及MapReduce(离线计算)。

2.2 Hadoop组成架构

(1)HDFS架构简述

在这里插入图片描述

注:上述的masterslave1slave2均是主机名(结点名)。

  • NameNode :NameNode是HDFS部分的核心;NameNode又称为Master,储存着HDFS的元数据(即分布式文件系统中所有文件的目录树,并且跟踪追查整个Hadoop集群中的文件);NameNode本身不储存实际的数据或者是数据集,数据本身是储存在DataNode中;注意当NameNode这个节点关闭之后整个Hadoop集群将无法访问
  • DataNode:DataNode负责将实际的数据储存在HDFS中,DataNode也称作Slave,并且NameNode和DataNode会保持通信不断;如果某个DataNode关闭了之后并不会影响数据和整个集群的可用性,NameNode会将后续的任务交给其他启动着的DataNode;DataNode 会定期(dfs.heartbeat.interval 配置项配置,默认是 3 秒)向 NameNode 发送心跳,如果 NameNode 长时间没有接受到 DataNode 发送的心跳, NameNode 就会认为该 DataNode 失效;block 汇报时间间隔取参数 dfs.blockreport.intervalMsec,参数未配置的话默认为 6 小时。
  • Secondary NameNode:Secondary NameNode主要是用于定期合并并且命名空间镜像的编辑日志;Secondary NameNode中保存了一份和NameNode一致的镜像文件(fsimage)和编辑日志(edits);如果NameNode发生故障是则可以从Secondary NameNode恢复数据。

保存作业的数据、配置信息等等,最后的结果也是保存在HDFS上面

  • Map阶段:映射或映射器的工作是处理输入数据。一般输入数据以存储在HDFS的文件或目录的形式,输入文件被传递到映射器功能线路,映射器处理该数据,并创建数据的若干小块。
  • Reduce阶段:这个阶段是Shuffle阶段和Reduce阶段的组合。减速器的工作是处理该来自映射器中的数据。处理之后,它产生一组新的输出,这将被存储在HDFS。

在这里插入图片描述

(2)YARN架构简述

在这里插入图片描述

  • ResourceManager: ResourceManager主要是负责与客户端交互,处理来自客户端的请求;启动和管理ApplicationMaster,并且在其运行失败的时候再重新启动它;管理NodeManager,接收来自NodeManager的资源汇报信息,并向NodeManager下达管理指令;资源管理与调度,接收来自ApplicationMaster的资源申请请求,并为之分配资源。
  • NodeManager: NodeManager主要负责启动后向ResourceManager注册,然后与之保持通信,通过心跳汇报自己的状态以及接受来自RM的指令;监控节点的健康状态,并与ResourceManager同步;管理节点上所有的Container的生命周期,监控Container的资源使用情况,以及Container运行产生的日志,NodeManager会向ResourceManager汇报Container的状态信息;管理分布式缓存,以及不同应用程序的其他附属要求。

(3)MapReduce架构简述

MapReduce计划分三个阶段执行,即映射阶段,shuffle阶段,并减少阶段。

在这里插入图片描述

  • Client客户端:用户可以通过Client客户端将自己编写的一些MapReduce程序给提交到JobTracker;也可以通过其提供的一些API查看一些作业的运行状态。
  • JobTracker:JobTracker主要是负责作业调度和资源的监控;JobTracker如果发现有一些作业失败的情况,就会将对应任务给转移到其他的结点;JobTracker同时也会追踪任务的执行进度和资源的使用情况,并将这些情况转发给Task Scheduler(任务调度器),Task Scheduler调度器在资源出现空闲的时候会将这些资源分配给合适的作业。
  • TaskTracker:TaskTracker会周期性的通过心跳(Heartbeat)将自己结点的资源使用情况以及作业的运行进度发送给JobTracker,同时也会接收JobTracker发送回来的指令并执行;TaskTracker使用“slot”等量划分本节点上的资源量。“slot”代表计算资源(CPU、内存等),一个Task获取到一个slot后才有机会运行,而Hadoop调度器的作用就是将各个TaskTracker上的空闲slot分配给Task使用;slot分为Map slot和Reduce slot两种,分别供Map Task和Reduce Task使用。TaskTracker通过slot数目(可配置参数)限定Task的并发度。
  • Map Task:Map Task会将对应的数据解析成一个键值对(key/value),最后调用用户的map()函数处理,将临时的结果储存在本地的磁盘上,其中一个临时的结果会被划分成若干块,每一块会被一个Reduce Task处理。
  • Reduce Task:将排序好了的键值对一次读取,再调用用户的reduce()函数进行处理,最后将处理结果储存在HDFS上面。

在一个MapReduce工作过程中:

  • 由Hadoop发送Map和Reduce任务到集群的相应服务器;
  • 框架管理数据传递,例如发出任务的所有节点之间的集群周围的详细信息,验证任务完成,和复制数据;
  • 大部分的计算发生在与在本地磁盘上,可以减少网络通信量数据的节点;
  • 给定的任务完成后,将收集并减少了数据,以一个合适的结果发送回Hadoop服务器。

2.3 HDFS常用命令

  • 运行jar包:hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.4.jar wordcount /input /output
  • 文件系统操作:hadoop fs -cat | ls|mkdir
  • 上传文件:hadoop dfs -put ./testdata.txt /testdata
  • 递归删除目录及文件:hadoop fs -rmr /testdata
  • 删除文件:hadoop fs -rm /testdata.txt

3.实验准备

3.1 平台选择

  • VMware Workstation 16 Pro
  • Ubuntu20.04 LTS
  • Java 1.8.0_351
  • Hadoop 3.3.4

3.2 VMware 16 安装

安装比较简单,可参考如下链接: VMware Workstation Pro 16 安装教程

3.3 Ubuntu20.04 LTS安装

安装比较简单,可参考如下链接:VMware16.0上安装ubuntu20.04

安装Ubuntu后,需要换源,换为国内源,方面下载软件,环境比较简单,可参考如下链接:Ubuntu20.04换源

注意:安装Ubuntu时,建议断网安装。在安装时,如果联网,会自动更新软件,因为源为国外的,下载速度很慢,需花较多时间安装。

3.4 java安装

(1)下载安装包

进入官网下载安装包(现在需要登录Oracle才能下载,没有的话先去注册)

Java SE Development Kit 8 Downloads

在这里插入图片描述

(2)解压文件

# 新建目录
sudo mkdir /usr/local/java
# 解压java安装包至 /usr/local/java
sudo tar jdk-8u351-linux-x64.tar.gz -C /usr/local/java

(3)添加环境变量

将java环境变量添加至Ubuntu全局环境变量中

dd@wdn:~/wdn_hdfs$ sudo vim /etc/profile
# 在profile文件最后追加以下内容

# java
export JAVA_HOME=/usr/local/java/jdk1.8.0_351
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib:$CLASSPATH
export JAVA_PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin
export PATH=$PATH:${JAVA_PATH}

# 保存,退出
:wq

# source命令更新环境变量
dd@wdn:~/wdn_hdfs$ source /etc/profile

(4)验证是否安装成功

然后查看java版本,结果是1.8版本,说明安装成功

dd@wdn:~/wdn_hdfs$ java -version
java version "1.8.0_351"
Java(TM) SE Runtime Environment (build 1.8.0_351-b10)
Java HotSpot(TM) 64-Bit Server VM (build 25.351-b10, mixed mode)

3.5 SSH安装

如果要使用可选的启动和停止脚本,则必须安装ssh并运行sshd才能使用管理远程Hadoop守护进程的Hadoop脚本。此外,建议还安装pdsh以更好地管理ssh资源

dd@wdn:~/wdn_hdfs$ sudo apt install ssh
dd@wdn:~/wdn_hdfs$ sudo apt install pdsh

3.6 Hadoop下载安装

请从[Apache镜像](Apache Downloads)下载Hadoop软件,版本为 hadoop 3.3.4 。

解压Hadoop安装包文件

# 解压
dd@wdn:~/wdn_hdfs$  sudo tar -zxvf hadoop-3.3.4.tar.gz
# 查看解压文件
dd@wdn:~/wdn_hdfs$ cd hadoop-3.3.4/
dd@wdn:~/wdn_hdfs/hadoop-3.3.4$ ls
bin  include  libexec         licenses-binary  NOTICE-binary  README.txt  share
etc  lib      LICENSE-binary  LICENSE.txt      NOTICE.txt     sbin

然后查看hadoop版本,检查是否安装成功

dd@wdn:~/wdn_hdfs/hadoop-3.3.4$ bin/hadoop version
Hadoop 3.3.4
Source code repository https://github.com/apache/hadoop.git -r a585a73c3e02ac62350c136643a5e7f6095a3dbb
Compiled by stevel on 2022-07-29T12:32Z
Compiled with protoc 3.7.1
From source with checksum fb9dd8918a7b8a5b430d61af858f6ec
This command was run using /home/dd/wdn_hdfs/hadoop-3.3.4/share/hadoop/common/hadoop-common-3.3.4.jar

编辑etc/hadoop/hadoop-env.sh文件,设置java环境变量

# vim 打开 etc/hadoop/hadoop-env.sh 文件
dd@wdn:~/wdn_hdfs/hadoop-3.3.4$ vim etc/hadoop/hadoop-env.sh

# 编辑 etc/hadoop/hadoop-env.sh 文件,增加java环境变量
export JAVA_HOME=/usr/local/java/jdk1.8.0_351

# 退出,保存

使用hadoop命令验证是否配置成功,若显示命令使用文档,则配置成功

dd@wdn:~/wdn_hdfs/hadoop-3.3.4$ bin/hadoop
Usage: hadoop [OPTIONS] SUBCOMMAND [SUBCOMMAND OPTIONS]
 or    hadoop [OPTIONS] CLASSNAME [CLASSNAME OPTIONS]
  where CLASSNAME is a user-provided Java class
....
SUBCOMMAND may print help when invoked w/o parameters or with -h.

4.Hadoop伪分布式

Hadoop也可以在单个节点上以伪分布式模式运行,其中每个Hadoop守护进程在单独的Java进程中运行。

4.1 配置

(1)etc/hadoop/core-site.xml 文件配置

在每个结点中都要配置本文件。该配置表示,HDFS的主节点访问地址为localhost:9000。在伪分布式模式下,结点只有一个,主结点和从结点都为本节点,所以可以通过localhost找到主结点。如果在分布式模式下,此处loaclhost应当使用主结点的实际 IP 地址。

<configuration>
	<property>
		<name>fs.defaultFS</name>
		<value>hdfs://localhost:9000</value>
	</property>
</configuration>

(2)etc/hadoop/hdfs-site.xml 文件配置

该文件表示HDFS中每个文件有1个备份,如果在分布式模式下,最好设置为3

<configuration>
	<property>
		<name>dfs.replication</name>
		<value>1</value>
	</property>
</configuration>

4.2 设置无密码SSH

该步骤的目的是为了在启动Hadoop的过程中,免去输入Linux登录密码。在分布式模式下,如果省略该步骤,就会要求主结点为每个从结点输入密码

现在检查是否可以通过ssh连接到本地主机,而无需密码:

dd@wdn:~/wdn_hdfs/hadoop-3.3.4$ ssh localhost
The authenticity of host 'localhost (127.0.0.1)' can't be established.

无法在没有密码短语的情况下ssh到localhost,请执行以下命令:

dd@wdn:~/wdn_hdfs/hadoop-3.3.4$ ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
dd@wdn:~/wdn_hdfs/hadoop-3.3.4$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
dd@wdn:~/wdn_hdfs/hadoop-3.3.4$ chmod 0600 ~/.ssh/authorized_keys

4.3 运行

(1)格式化文件系统

namenode即为HDFS主结点,该命令为格式化,在后续实验中,如果出现未知错误无法解决,可以重新格式化。

dd@wdn:~/wdn_hdfs/hadoop-3.3.4$ bin/hdfs namenode -format
2022-12-17 22:28:54,654 INFO namenode.NameNode: STARTUP_MSG:
/************************************************************
STARTUP_MSG: Starting NameNode
STARTUP_MSG:   host = wdn/127.0.1.1
STARTUP_MSG:   args = [-format]
STARTUP_MSG:   version = 3.3.4
STARTUP_MSG:   classpath = /home/dd/wdn_hdfs/hadoop-3.3.4/etc/hadoop:/home/dd/wdn_hdfs/hadoop-applicationhistoryservice-3.3.4.jar:/home/dd/wdn_hdfs/hadoop-3.3.4/share/hadoop/yarn/hadoop-yarn-applications-distributedshell-3.3.4.jar
...
STARTUP_MSG:   build = https://github.com/apache/hadoop.git -r a585a73c3e02ac62350c136643a5e7f6095a3dbb; compiled by 'stevel' on 2022-07-29T12:32Z
STARTUP_MSG:   java = 1.8.0_351
************************************************************/
2022-12-17 22:28:54,662 INFO namenode.NameNode: registered UNIX signal handlers for [TERM, HUP, INT]
...
2022-12-17 22:28:55,544 INFO namenode.FSImage: FSImageSaver clean checkpoint: txid=0 when meet shutdown.
2022-12-17 22:28:55,550 INFO namenode.NameNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at wdn/127.0.1.1
************************************************************/

(2)启动NameNode和DataNode

namenode为主结点,datanode为从结点,该命令启动所有。

dd@wdn:~/wdn_hdfs/hadoop-3.3.4$ sbin/start-dfs.sh
Starting namenodes on [localhost]
Starting datanodes
Starting secondary namenodes [wdn]

Hadoop守护程序日志输出被写入$HADOOP_LOG_DIR目录(默认为$HADOOP_HOME/logs)。

(3)浏览NameNode的web界面

默认情况下,它位于:http://localhost:9870/

在这里插入图片描述

(4)制作执行MapReduce作业所需的HDFS目录

建立一个文件,名字可以自己起

dd@wdn:~/wdn_hdfs/hadoop-3.3.4$ bin/hdfs dfs -mkdir /user
dd@wdn:~/wdn_hdfs/hadoop-3.3.4$ bin/hdfs dfs -mkdir /user/wdn

(5)将输入文件复制到分布式文件系统

其中:

  • input文件夹用来放MapReduce作业的输入文件
  • put后的第一个参数就是输入文件,这里使用的是hadoop所有xml配置文件,也可以自行选择任意文件
dd@wdn:~/wdn_hdfs/hadoop-3.3.4$ bin/hdfs dfs -mkdir -p input
dd@wdn:~/wdn_hdfs/hadoop-3.3.4$ bin/hdfs dfs -put etc/hadoop/*.xml input

(6)运行提供的一些示例

运行hadoop example当中的grep程序,该程序的具体作用可以自行查阅资料

dd@wdn:~/wdn_hdfs/hadoop-3.3.4$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.4.jar grep input output 'dfs[a-z.]+'
2022-12-17 22:44:11,757 INFO impl.MetricsConfig: Loaded properties from hadoop-metrics2.properties
....
        File System Counters
                FILE: Number of bytes read=282303
                FILE: Number of bytes written=918208
                FILE: Number of read operations=0
                FILE: Number of large read operations=0
                FILE: Number of write operations=0
                HDFS: Number of bytes read=11765
                HDFS: Number of bytes written=0
                HDFS: Number of read operations=5
                HDFS: Number of large read operations=0
                HDFS: Number of write operations=1
                HDFS: Number of bytes read erasure-coded=0
        Map-Reduce Framework
                Map input records=275
                Map output records=1
                Map output bytes=17
                Map output materialized bytes=25
                Input split bytes=118
                Combine input records=1
                Combine output records=1
                Spilled Records=1
                Failed Shuffles=0
                Merged Map outputs=0
                GC time elapsed (ms)=60
                Total committed heap usage (bytes)=388497408
        File Input Format Counters
                Bytes Read=11765
...
2022-12-17 22:44:15,567 INFO mapreduce.Job: Counters: 36
        File System Counters
                FILE: Number of bytes read=1143072
                FILE: Number of bytes written=3661477
                FILE: Number of read operations=0
                FILE: Number of large read operations=0
                FILE: Number of write operations=0
                HDFS: Number of bytes read=59544
                HDFS: Number of bytes written=233
                HDFS: Number of read operations=73
                HDFS: Number of large read operations=0
                HDFS: Number of write operations=14
                HDFS: Number of bytes read erasure-coded=0
        Map-Reduce Framework
                Map input records=1
                Map output records=1
                Map output bytes=17
                Map output materialized bytes=25
                Input split bytes=128
                Combine input records=0
                Combine output records=0
                Reduce input groups=1
                Reduce shuffle bytes=25
                Reduce input records=1
                Reduce output records=1
                Spilled Records=2
                Shuffled Maps =1
                Failed Shuffles=0
                Merged Map outputs=1
                GC time elapsed (ms)=0
                Total committed heap usage (bytes)=1460666368
        Shuffle Errors
                BAD_ID=0
                CONNECTION=0
                IO_ERROR=0
                WRONG_LENGTH=0
                WRONG_MAP=0
                WRONG_REDUCE=0
        File Input Format Counters
                Bytes Read=111
        File Output Format Counters
                Bytes Written=11

(7)检查输出文件

将输出文件从分布式文件系统复制到本地文件系统并检查它们

dd@wdn:~/wdn_hdfs/hadoop-3.3.4$ bin/hdfs dfs -get output output
dd@wdn:~/wdn_hdfs/hadoop-3.3.4$ cat output/*
1       dfsadmin
1       dfs.replication
dd@wdn:~/wdn_hdfs/hadoop-3.3.4$ bin/hdfs dfs -cat output/*
1       dfsadmin
1       dfs.replication

(8)停止Hadoop集群

dd@wdn:~/wdn_hdfs/hadoop-3.3.4$ sbin/stop-dfs.sh
Stopping namenodes on [localhost]
Stopping datanodes
Stopping secondary namenodes [wdn]

4.4 单个节点YARN

通过设置一些参数并另外运行ResourceManager守护程序和NodeManager守护程序,可以在YARN上以伪分布式模式运行MapReduce作业。

以下指令假设已执行上述指令的1~4步骤

(1)配置参数

etc/hadoop/mapred-site.xml 文件配置

<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
    <property>
        <name>mapreduce.application.classpath</name>
        <value>$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/*:$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/lib/*</value>
    </property>
</configuration>

etc/hadoop/yarn-site.xml 文件配置

<configuration>
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <property>
        <name>yarn.nodemanager.env-whitelist</name>
        <value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_HOME,PATH,LANG,TZ,HADOOP_MAPRED_HOME</value>
    </property>
</configuration>

(2)启动ResourceManager守护程序和NodeManager守护程序

dd@wdn:~/wdn_hdfs/hadoop-3.3.4$ sbin/start-yarn.sh
Starting resourcemanager
Starting nodemanagers

(3)浏览ResourceManager的web界面;

默认情况下,它位于 http://localhost:8088

在这里插入图片描述

(4)运行MapReduce作业

提交一个MapReduce作业到YARN上

hadoop的根目录下找到有一个share/hadoop/mapreduce 下,有一个hadoop-mapreduce-examples-2.6.0-cdh5.7.0.jar,这是hadoop提供的一个mapreduce测试jar文件。

输入命令:hadoop jar [jar文件地址] 别名 参数1 参数2

dd@wdn:~/wdn_hdfs/hadoop-3.3.4$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.4.jar pi 2 3
Number of Maps  = 2
Samples per Map = 3
Wrote input for Map #0
Wrote input for Map #1
Starting Job
2022-12-18 14:52:29,787 INFO client.DefaultNoHARMFailoverProxyProvider: Connecting to ResourceManager at /0.0.0.0:8032
2022-12-18 14:52:30,510 INFO mapreduce.JobResourceUploader: Disabling Erasure Coding for path: /tmp/hadoop-yarn/staging/dd/.staging/job_1671346336225_0001
2022-12-18 14:52:30,847 INFO input.FileInputFormat: Total input files to process : 2
...

进入yarn的管理界面,如下就可以看到运行状态的任务:

在这里插入图片描述

(5)停止YARN

完成后,使用以下命令停止守护程序。

dd@wdn:~/wdn_hdfs/hadoop-3.3.4$ sbin/stop-yarn.sh
Stopping nodemanagers
Stopping resourcemanager

5.Hadoop完全分布式

需要三台虚拟机操作,其中一台为master主节点,两台为子节点;IP分配如下:

  • master:192.168.118.129
  • slave1:192.168.118.130
  • slave2:192.168.118.131

Note:hadoop根目录:/home/dd/wdn_hdfs/hadoop-3.3.4

5.1 Hadoop核心文件配置

(1)etc/hadoop/hadoop-env.sh 文件配置


export JAVA_HOME=/usr/local/java/jdk1.8.0_351

# dd是我自己的用户名
export HDFS_NAMENODE_USER=dd
export HDFS_DATANODE_USER=dd
export HDFS_SECONDARYNAMENODE_USER=dd
export YARN_RESOURCEMANAGER_USER=dd
export YARN_NODEMANAGER_USER=dd

(2)etc/hadoop/core-site.xml 文件配置

<configuration>
		<property>
                <name>fs.defaultFS</name>
                <value>hdfs://master:8020</value>
        </property>
        <property>
                <name>hadoop.tmp.dir</name>
                <value>/home/dd/wdn_hdfs/hadoop-3.3.4/tmp</value>
        </property>
        <property>
                <name>hadoop.http.staticuser.user</name>
                <value>dd</value>
        </property>
</configuration>

(3)etc/hadoop/hdfs-site.xml 文件配置

<configuration>
		<property>
                <name>dfs.namenode.http-address</name>
                <value>master:9870</value>
        </property>
        <property>
                <name>dfs.namenode.secondary.http-address</name>
                <value>slave2:9868</value>
        </property>
</configuration>

(4)etc/hadoop/yarn-site.xml 文件配置

<configuration>
	<property>
                <name>yarn.nodemanager.aux-services</name>
                <value>mapreduce_shuffle</value>
        </property>
        <property>
                <name>yarn.resourcemanager.hostname</name>
                <value>slave1</value>
        </property>
        <property>
                <name>yarn.nodemanager.env-whitelist</name>
                <value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
        </property>
        <property>
                <name>yarn.application.classpath</name>
                <value>/home/dd/wdn_hdfs/hadoop-3.3.4/etc/hadoop:/home/dd/wdn_hdfs/hadoop-3.3.4/share/hadoop/common/lib/*:/home/dd/wdn_hdfs/hadoop-3.3.4/share/hadoop/common/*:/home/dd/wdn_hdfs/hadoop-3.3.4/share/hadoop/hdfs:/home/dd/wdn_hdfs/hadoop-3.3.4/share/hadoop/hdfs/lib/*:/home/dd/wdn_hdfs/hadoop-3.3.4/share/hadoop/hdfs/*:/home/dd/wdn_hdfs/hadoop-3.3.4/share/hadoop/mapreduce/*:/home/dd/wdn_hdfs/hadoop-3.3.4/share/hadoop/yarn:/home/dd/wdn_hdfs/hadoop-3.3.4/share/hadoop/yarn/lib/*:/home/dd/wdn_hdfs/hadoop-3.3.4/share/hadoop/yarn/*
</value>
        </property>
<!-- 开启日志聚集功能 -->
        <property>
                <name>yarn.log-aggregation-enable</name>
                <value>true</value>
        </property>
    <!-- 设置日志聚集服务器地址 -->
        <property>
                <name>yarn.log.server.url</name>
                <value>http://slave1:19888/jobhistory/logs</value>
        </property>
    <!-- 设置日志保留时间为7天 -->
        <property>
                <name>yarn.log-aggregation.retain-seconds</name>
                <value>604800</value>
        </property>
        <property>
                <name>yarn.nodemanager.vmem-check-enabled</name>
                <value>false</value>
        </property>
</configuration>

(5)etc/hadoop/mapred-site.xml 文件配置

<configuration>
		<property>
                <name>mapreduce.framework.name</name>
                <value>yarn</value>
        </property>
        <property>
                <name>mapreduce.application.classpath</name>
                <value>/home/dd/wdn_hdfs/hadoop-3.3.4/share/hadoop/mapreduce/*:/home/dd/wdn_hdfs/hadoop-3.3.4/share/hadoop/mapreduce/lib/*</value>
        </property>
        <!-- 历史服务器端地址 -->
        <property>
                <name>mapreduce.jobhistory.address</name>
                <value>slave1:10020</value>
        </property>
 
        <!-- 历史服务器web端地址 -->
        <property>
                <name>mapreduce.jobhistory.webapp.address</name>
                <value>slave1:19888</value>
        </property>
</configuration>

(6)workers 文件配置

master
slave1
slave2

这里的master是此台虚拟机的主机名,slave1slave2是后面我们将会克隆的另外两台虚拟机的主机名。

5.2 Hadoop从属结点虚拟机克隆、以及配置

(1)克隆虚拟机

关闭master主结点的虚拟机,克隆虚拟机,最终克隆三台虚拟机:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KDY8sXs4-1671887814545)(images/image-20221218154934740.png)]

(2)修改IP及主机名

设置master节点IP为192.168.118.129,主机名为master

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gZDL75Xp-1671887814545)(images/image-20221218160227589.png)]

设置slave1节点IP为192.168.118.130,主机名为slave1

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jNvqZWut-1671887814545)(images/image-20221218160301981.png)]

设置slave2节点IP为192.168.118.131,主机名为slave2

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Xh5TLQKh-1671887814545)(images/image-20221218160330257.png)]

(4)虚拟机间IP地址映射

设置master、slave1、slave2节点的IP地址映射

# 打开 hosts 文件
dd@master:~$ sudo vim /etc/hosts

# 增加IP地址映射
192.168.118.129 master
192.168.118.130 slave1
192.168.118.131 slave2

# 保存
:wq

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QXAgpKMG-1671887814545)(images/image-20221218160950898.png)]

5.3 三台虚拟机之间的SSH免密登录访问

(1)安装SSH

分别在三台机器的命令行中输入以下命令安装SSH服务端,因为Ubuntu操作系统已经默认安装了SSH的客户端,所以这里只需要安装SSH服务端就好了。

sudo apt-get install openssh-server

(2)节点master配置

然后依次执行以下的命令:

# 生成密钥
dd@master:~/.ssh$ ssh-keygen -t rsa    
# 将生成的密钥添加到同一目录下的authorized_keys授权文件中
dd@master:~/.ssh$ cat ./id_rsa.pub >> ./authorized_keys
# 显示生成文件
dd@master:~/.ssh$ ls
authorized_keys  id_rsa  id_rsa.pub

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ispF5hEM-1671887814545)(images/image-20221218164049043.png)]

其中:

  • authorized_keys:授权文件
  • id_rsa.pub:密钥

然后在将master的公钥发送到slave1slave2两台机器上去

# 发送至slave1
dd@master:~/.ssh$ scp id_rsa.pub dd@slave1:~/.ssh/master_rsa.pub
# 发送至slave2
dd@master:~/.ssh$ scp id_rsa.pub dd@slave2:~/.ssh/master_rsa.pub

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Hihi5JWA-1671887814546)(images/image-20221218163526495.png)]

(3)节点slave1配置

然后依次执行以下的命令:

# 生成密钥
dd@slave1:~/.ssh$ ssh-keygen -t rsa    
# 将生成的密钥添加到同一目录下的authorized_keys授权文件中
dd@slave1:~/.ssh$ cat ./id_rsa.pub >> ./authorized_keys
# 显示生成文件
dd@slave1:~/.ssh$ ls
authorized_keys  id_rsa  id_rsa.pub  master_rsa.pub

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7fLvAF7B-1671887814546)(images/image-20221218164030148.png)]

其中:

  • authorized_keys:授权文件
  • id_rsa.pub:密钥

然后在将slave1的公钥发送到masterslave2两台机器上去

# 发送至master
dd@slave1:~/.ssh$ scp id_rsa.pub dd@master:~/.ssh/slave1_rsa.pub
# 发送至slave2
dd@slave1:~/.ssh$ scp id_rsa.pub dd@slave2:~/.ssh/slave1_rsa.pub

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NqXm0p02-1671887814546)(images/image-20221218164351223.png)]

(4)节点slave2配置

然后依次执行以下的命令:

# 生成密钥
dd@slave2:~/.ssh$ ssh-keygen -t rsa    
# 将生成的密钥添加到同一目录下的authorized_keys授权文件中
dd@slave2:~/.ssh$ cat ./id_rsa.pub >> ./authorized_keys
# 显示生成文件
dd@slave2:~/.ssh$ ls
authorized_keys  id_rsa  id_rsa.pub  master_rsa.pub  slave1_rsa.pub

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L38Gt9w6-1671887814546)(images/image-20221218164446507.png)]

其中:

  • authorized_keys:授权文件
  • id_rsa.pub:密钥

然后在将slave2的公钥发送到slave1master两台机器上去

# 发送至master
dd@slave2:~/.ssh$ scp id_rsa.pub dd@master:~/.ssh/slave2_rsa.pub
# 发送至slave2
dd@slave2:~/.ssh$ scp id_rsa.pub dd@slave1:~/.ssh/slave2_rsa.pub

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-E7zZcRuH-1671887814546)(images/image-20221218164641123.png)]

(5)将密钥添加到授权文件中

master中执行以下命令将slave1slave2的密钥添加到授权文件当中:

dd@master:~/.ssh$ ls
authorized_keys  id_rsa  id_rsa.pub  known_hosts  slave1_rsa.pub  slave2_rsa.pub
# 添加slave1的密钥到授权文件中
dd@master:~/.ssh$ cat ./slave1_rsa.pub >> ./authorized_keys
# 添加slave2的密钥到授权文件中
dd@master:~/.ssh$ cat ./slave2_rsa.pub >> ./authorized_keys
# 配置权限
chmod 0600 authorized_keys

slave1中执行以下命令将masterslave2的密钥添加到授权文件当中:

dd@slave1:~/.ssh$ ls
authorized_keys  id_rsa  id_rsa.pub  known_hosts  master_rsa.pub  slave2_rsa.pub
# 添加master的密钥到授权文件中
dd@slave1:~/.ssh$ cat ./master_rsa.pub >> ./authorized_keys
# 添加slave2的密钥到授权文件中
dd@slave1:~/.ssh$ cat ./slave2_rsa.pub >> ./authorized_keys
# 配置权限
chmod 0600 authorized_keys

slave2中执行以下命令将slave1master的密钥添加到授权文件当中:

dd@slave2:~/.ssh$ ls
authorized_keys  id_rsa  id_rsa.pub  known_hosts  master_rsa.pub  slave1_rsa.pub
# 添加master的密钥到授权文件中
dd@slave2:~/.ssh$ cat ./master_rsa.pub >> ./authorized_keys
# 添加slave1的密钥到授权文件中
dd@slave2:~/.ssh$ cat ./slave1_rsa.pub >> ./authorized_keys
# 配置权限
chmod 0600 authorized_keys

(6)测试

配置好了之后可以分别测试一下配置是否成功(第一次连接会输一次密码,后面就不会让你输密码了,可以第一次连上后再exit断开,再测试第二次,看看效果):

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6lGInOZk-1671887814546)(images/image-20221218170514893.png)]

其余两个节点也可以免密登录,此处不再演示。

5.4 Hadoop集群规划

主机名NNJJNDNRMNMSNN
masterNameNodeDataNodeNodeManager
slave1JournalNodeDataNodeResourceManagerNodeManager
slave2DataNodeNodeManagerSecondaryNameNode

5.5 Hadoop集群运行

(1)master节点

第一次启动集群,需要将文件系统初始化,输入以下命令:

# 进入hadoop-3.3.4的安装目录
dd@master:~$ cd wdn_hdfs/hadoop-3.3.4/
dd@master:~/wdn_hdfs/hadoop-3.3.4$ pwd
/home/dd/wdn_hdfs/hadoop-3.3.4
# 初始化HDFS文件系统
dd@master:~/wdn_hdfs/hadoop-3.3.4$ bin/hdfs namenode -format
WARNING: /home/dd/wdn_hdfs/hadoop-3.3.4/logs does not exist. Creating.
2022-12-18 18:04:51,256 INFO namenode.NameNode: STARTUP_MSG:
/************************************************************
STARTUP_MSG: Starting NameNode
STARTUP_MSG:   host = master/127.0.1.1
STARTUP_MSG:   args = [-format]
STARTUP_MSG:   version = 3.3.4
STARTUP_MSG:   classpath = /home/dd/wdn_hdfs/hadoop-3.3.4/etc/hadoop
...
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at master/127.0.1.1
************************************************************/

注意:只有第一次启动集群需要初始化HDFS文件系统,如果后续再执行初始化文件系统(格式化NameNode)由于每次初始化都会产生新的集群id,会导致NameNode和DataNode的集群id不一样,导致集群找不到以往的数据。如果非要再格式化一次,那就把三台机器下的/home/dd/wdn_hdfs/hadoop-3.3.4/目录下的tmplogs文件夹删除,再格式化NameNode。

初始化完文件系统后,继续输入,启动HDFS:

# 启动HDFS
dd@master:~/wdn_hdfs/hadoop-3.3.4$ sbin/start-dfs.sh
Starting namenodes on [master]
Starting datanodes
Starting secondary namenodes [slave2]

然后在三台虚拟机中分别输入jps命令查看是否启动成功:

  • master:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-neYdZShR-1671887814546)(images/image-20221218181031874.png)]

  • slave1:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dbTYyzkn-1671887814547)(images/image-20221218183626647.png)]

  • slave2:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZLlgeKaq-1671887814547)(images/image-20221218183613145.png)]

(2)slave1节点中启动YARN

因为我们配置的ResourceManager结点是slave1,所以在slave1中执行下面的命令:

# 转到hadoop-3.3.4的安装目录下
dd@slave1:~$ cd ~/wdn_hdfs/hadoop-3.3.4/
# 启动yarn
dd@slave1:~/wdn_hdfs/hadoop-3.3.4$ sbin/start-yarn.sh
Starting resourcemanager
resourcemanager is running as process 3668.  Stop it first and ensure /tmp/hadoop-dd-resourcemanager.pid file is empty before retry.
Starting nodemanagers
slave1: Warning: Permanently added 'slave1' (ECDSA) to the list of known hosts.

在三台机器中执行jps查看是否启动成功:

  • master:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HWSo0iS3-1671887814547)(images/image-20221218181553714.png)]

  • slave1:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HW1eV0bq-1671887814547)(images/image-20221218183804455.png)]

  • slave2:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rZMgAgGn-1671887814547)(images/image-20221218183755773.png)]

(3)在Web端验证HDFS和YARN是否启动成功

打开浏览器输入 :http://master:9870

如果出现以下Hadoop页面则说明HDFS配置成功:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yQRjHRDy-1671887814548)(images/image-20221218181824847.png)]

再输入网址(ResourceManager):http://slave1:8088

出现以下页面则说明启动成功:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HDNRPvlw-1671887814548)(images/image-20221218181951519.png)]

(4)文件上传文件测试,以及Wordcount功能测试

按照以下命令创建并进入word.txt文件:

# 创建上传文件
dd@master:~/wdn_hdfs/hadoop-3.3.4$ mkdir input
dd@master:~/wdn_hdfs/hadoop-3.3.4$ touch input/word.txt
dd@master:~/wdn_hdfs/hadoop-3.3.4$ chmod 777 input/word.txt
dd@master:~/wdn_hdfs/hadoop-3.3.4$ vim input/word.txt

然后在文件中添加以下内容以供测试:

hello hadoop hive hbase spark flink
hello hadoop hive hbase spark
hello hadoop hive hbase 
hello hadoop hive 
hello hadoop 
hello

添加完成后退出文本编辑,然后再输入以下命令:

# 将word.txt文件传送到HDFS下的/input目录下
dd@master:~/wdn_hdfs/hadoop-3.3.4$ bin/hadoop fs -put /home/dd/wdn_hdfs/hadoop-3.3.4/input/word.txt /input

# 执行wordcount程序来对文件中的单词计数
dd@master:~/wdn_hdfs/hadoop-3.3.4$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.4.jar wordcount /
input /output

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JkpPL00D-1671887814548)(images/image-20221218185213059.png)]

然后可以输入一下语句来查看统计的结果:

# 转到运行程序是设置的输出目录下面并查看其中的文件
dd@master:~/wdn_hdfs/hadoop-3.3.4$ bin/hdfs dfs -ls /output
Found 2 items
-rw-r--r--   3 dd supergroup          0 2022-12-18 18:51 /output/_SUCCESS
-rw-r--r--   3 dd supergroup         48 2022-12-18 18:51 /output/part-r-00000

Wordcount程序运行的结果所在:

# 查看这个结果储存文件
dd@master:~/wdn_hdfs/hadoop-3.3.4$ bin/hdfs dfs -cat /output/part-r-00000
flink   1
hadoop  5
hbase   3
hello   6
hive    4
spark   2

最后的统计结果就如下图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dwu8cnsC-1671887814548)(images/image-20221218185437925.png)]

除了命令行这种查看方式也可以在web端查看:

打开浏览器输入:http://master:9870

进入到如下页面:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UPA7EaQm-1671887814548)(images/image-20221218185837808.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B3s4TTNH-1671887814548)(images/image-20221218185857732.png)]

(5)启动历史服务器

转到slave1节点下启动历史服务器服务:

# 启动历史服务器
dd@slave1:~/wdn_hdfs/hadoop-3.3.4$ bin/mapred --daemon start historyserver

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yXKOmrLk-1671887814549)(images/image-20221218190314870.png)]

然后回到浏览器输入以下网址:http://slave1:8088/cluster

然后再点击history可查看此任务执行的历史信息:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZDRuLDVZ-1671887814549)(images/image-20221218190511317.png)]

点开logs后,可以看到历史记录:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zKbuU3Hm-1671887814549)(images/image-20221218190602753.png)]

(6)关闭Hadoop集群

进入master节点,进入命令行输入以下命令关闭HDFS:

# master节点,关闭dfs
dd@master:~/wdn_hdfs/hadoop-3.3.4$ sbin/stop-dfs.sh
Stopping namenodes on [master]
Stopping datanodes
Stopping secondary namenodes [slave2]

进入slave1节点下去输入以下命令关闭YARN和历史服务器:

# slave1节点,关闭YARN
dd@slave1:~/wdn_hdfs/hadoop-3.3.4$ sbin/stop-yarn.sh
Stopping nodemanagers
Stopping resourcemanager
# slave1节点,关闭history服务
dd@slave1:~/wdn_hdfs/hadoop-3.3.4$ bin/mapred --daemon stop historyserver

6.出现问题

6.1 pdsh rcmd: socket: Permission denied

错误位置:伪分布式运行第二步启动时出现此问题

错误信息:

dd@wdn:~/wdn_hdfs/hadoop-3.3.4$ sbin/start-dfs.sh
Starting namenodes on [localhost]
pdsh@wdn: localhost: rcmd: socket: Permission denied
Starting datanodes
pdsh@wdn: localhost: rcmd: socket: Permission denied
Starting secondary namenodes [wdn]
pdsh@wdn: wdn: rcmd: socket: Permission denied

解决方法:

dd@wdn:~$ export PDSH_RCMD_TYPE=ssh
dd@wdn:~$ source ~/.bashrc

6.2 INFO ipc.Client: Retrying connect to server

错误位置:完全分布式上传文件出现此错误

错误信息:

# 上传文件
dd@master:~/wdn_hdfs/hadoop-3.3.4$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.4.jar wordcount /input /output
2022-12-18 18:40:41,240 INFO client.DefaultNoHARMFailoverProxyProvider: Connecting to ResourceManager at slave1/192.168.118.130:8032
2022-12-18 18:40:43,001 INFO ipc.Client: Retrying connect to server: slave1/192.168.118.130:8032. Already tried 0 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleepTime=1000 MILLISECONDS)
2022-12-18 18:40:44,003 INFO ipc.Client: Retrying connect to server: slave1/192.168.118.130:8032. Already tried 1 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleepTime=1000 MILLISECONDS)
2022-12-18 18:40:45,005 INFO ipc.Client: Retrying connect to server: slave1/192.168.118.130:8032. Already tried 2 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleepTime=1000 MILLISECONDS)

解决方法:

找到/etc/hosts文件,用sudo命令打开,将127.0.0.1和127.0.1.1的映射注释掉即可。

注意:如果及设计的是分布式的,就要把master和slave中的hosts文件都要修改,伪分布式的就无所谓了,因为它只有一个配置文件。

# 打开hosts文件
dd@master:~/wdn_hdfs/hadoop-3.3.4$ sudo vim /etc/hosts
[sudo] password for dd:

# 注释映射
# 127.0.0.1     localhost
# 127.0.1.1     master
192.168.118.129 master
192.168.118.130 slave1
192.168.118.131 slave2

# 关闭保存
:wq

7.实验总结

7.1 HDFS优点总结

  1. 支持任意超大文件存储;硬件节点可不断扩展,低成本存储(真实案例为:4000节点,目前最大5000节点);
  2. 对上层应用屏蔽分布式部署结构,提供统一的文件系统访问接口,感觉就是一个大硬盘;应用无需知道文件具体存放位置,使用简单;
  3. 文件分块存储(1块缺省64MB),不同块可分布在不同机器节点上,通过元数据记录文件块位置;应用顺序读取各个块;
  4. 系统设计为高容错性,允许廉价PC故障;每块文件数据在不同机器节点上保存3份;这种备份的另一个好处是可方便不同应用就近读取,提高访问效率。

7.2 HDFS缺点总结

  1. 适合大数据文件保存和分析,不适合小文件,由于分布存储需要从不同节点读取数据,效率反而没有集中存储高;一次写入多次读取,不支持文件修改;
  2. 是最基础的大数据技术,基于文件系统层面提供文件访问能力,不如数据库技术强大,但也是海量数据库技术的底层依托;
  3. 文件系统接口完全不同于传统文件系统,应用需要重新开发。

7.3 实验总结

is RetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleepTime=1000 MILLISECONDS)
2022-12-18 18:40:45,005 INFO ipc.Client: Retrying connect to server: slave1/192.168.118.130:8032. Already tried 2 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleepTime=1000 MILLISECONDS)


解决方法:

找到/etc/hosts文件,用sudo命令打开,将127.0.0.1和127.0.1.1的映射注释掉即可。

注意:如果及设计的是分布式的,就要把master和slave中的hosts文件都要修改,伪分布式的就无所谓了,因为它只有一个配置文件。

```shell
# 打开hosts文件
dd@master:~/wdn_hdfs/hadoop-3.3.4$ sudo vim /etc/hosts
[sudo] password for dd:

# 注释映射
# 127.0.0.1     localhost
# 127.0.1.1     master
192.168.118.129 master
192.168.118.130 slave1
192.168.118.131 slave2

# 关闭保存
:wq

7.实验总结

7.1 HDFS优点总结

  1. 支持任意超大文件存储;硬件节点可不断扩展,低成本存储(真实案例为:4000节点,目前最大5000节点);
  2. 对上层应用屏蔽分布式部署结构,提供统一的文件系统访问接口,感觉就是一个大硬盘;应用无需知道文件具体存放位置,使用简单;
  3. 文件分块存储(1块缺省64MB),不同块可分布在不同机器节点上,通过元数据记录文件块位置;应用顺序读取各个块;
  4. 系统设计为高容错性,允许廉价PC故障;每块文件数据在不同机器节点上保存3份;这种备份的另一个好处是可方便不同应用就近读取,提高访问效率。

7.2 HDFS缺点总结

  1. 适合大数据文件保存和分析,不适合小文件,由于分布存储需要从不同节点读取数据,效率反而没有集中存储高;一次写入多次读取,不支持文件修改;
  2. 是最基础的大数据技术,基于文件系统层面提供文件访问能力,不如数据库技术强大,但也是海量数据库技术的底层依托;
  3. 文件系统接口完全不同于传统文件系统,应用需要重新开发。

7.3 实验总结

通过本次实验,简单掌握了Hadoop整体的搭建过程,由于笔记本电脑性能不足,搭建三台虚拟机导致电脑数次崩溃,网页查看时多次出错。在Hadoop完全分布式的安装配置过程中,遇到许许多多的问题,安装jdk,配置环境变量,安装ssh等等。同时在本次实验中认识到了自己的不足,在以后的学习中需要进一步努力。实验考验是一个人的耐心,实验步骤要一步一步地做,每一步都要严谨认真。今后会加强对Linux系统知识的掌握,力求手到擒来。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/112949.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python pandas有几千个库函数,你用过几个?(1)

对Python的 pandas 库所有的内置元类、函数、子模块等全部浏览一遍&#xff0c;然后挑选一些重点学习一下。我安装的库版本号为1.3.5&#xff0c;如下&#xff1a; >>> import pandas as pd >>> pd.__version__ 1.3.5 >>> print(pd.__doc__)pandas…

C++ STL vector list set map容器循环通过迭代器删除元素注意事项

先说说写这篇博客的原因吧&#xff0c;同事转部门了&#xff0c;把他手头的工作交接给了我。他以前维护的一个模块&#xff0c;会将外部输入的数据缓存起来分段处理&#xff0c;处理完了就会清除缓存数据&#xff0c;最近出现了一个bug&#xff0c;缓存数据一直不清除&#xff…

【SpringMVC】非注解的处理器映射器和适配器

项目目录 1.导入的依赖 pom.xml <properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target><…

【K3s】第2篇 一篇文章学习实践K3s部署安装

目录 1、docker安装 2、docker-compose安装 3、K3s安装 3.1 k3s与install.sh文件准备 3.2 k3s 安装步骤 4、查看k3s部署状态 1、docker安装 方式一 https://fanjufei.blog.csdn.net/article/details/123500511https://fanjufei.blog.csdn.net/article/details/123500511 …

12.24

接口测试 ​ <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-width…

Unity3D异步加载场景SceneManager.LoadSceneAsync()卡住,并不异步,获取process直接到0.9的问题

问题阐述&#xff1a; 一般来说&#xff0c;在加载场景的时候&#xff0c;会因为所加载资源的大小、复杂度、电脑配置等因素导致加载过程耗费一定的时间。虽然这个加载时间是不可避免的&#xff0c;但是在这一小段卡着的时间里如果就这样卡着的话会大大降低玩家体验。 所以很多…

(matlab编程基础)数组的基本操作

目录 1、数组寻址 2、数组元素删除 3、数组查找和排序 &#xff08;1&#xff09;数组查找 &#xff08;2&#xff09;数组排序 4、数组运算 5、数组操作函数 数组操作主要从以下5部分进行介绍:数组寻址、数组元素的删除、数组查找和排序、数组运算和数组操作函数。 1、…

PS CS6视频剪辑基本技巧(五)添加logo、动画和画中画

系列讲座导读 PS CS6视频剪辑基本技巧&#xff08;一&#xff09;CS6可以实现的视频剪辑功能 PS CS6视频剪辑基本技巧&#xff08;二&#xff09;视频剪接和添加图片 PS CS6视频剪辑基本技巧&#xff08;三&#xff09;添加声音和字幕 PS CS6视频剪辑基本技巧&#xff08;四&am…

RMQ - ST表

RMQ - ST表 1、RMQ 简介 RMQ (Range Minimum / Maximum Query) 问题是指&#xff1a;对于长度为 nnn 的数列 AAA&#xff0c;回答若干询问 (A,i,j)(A, i, j)(A,i,j) (1≤i,j≤n)(1≤i,j≤n)(1≤i,j≤n)&#xff0c;返回数列 A 中区间在 [i,j][i,j][i,j] 中的最小 (大) 值所在…

Vue2.0全面教程

Vue2.0 学习视频地址 文章目录Vue2.01.vue 简介1.1.什么是vue1.2.vue的两个特性1.2.1.数据驱动视图1.2.2.双向数据绑定1.3.MVVM概述1.4.MVVM工作原理2.vue的基本使用2.1.基本使用步骤2.2.基本代码与MVVM的对应关系3.vue的调试工具3.1.安装vue-devtool调试工具3.2.配置Chrome浏…

Axios(三)

目录 1.Axios的默认配置 2.Axios创建Ajax实例对象发送请求 3.Axios拦截器 4.Axios取消请求 5.Axios文件结构说明 6.Axios创建过程 7.Axios对象创建过程模拟实现 8.Axios发送请求过程详解 9.模拟实现Axios发送请求 1.Axios的默认配置 <!doctype html> <html …

QT系列第7节 标准对话框使用

QT编程中对话框作为最常用的窗口经常被使用&#xff0c;本节介绍一些QT常用的标准对话框使用。 目录 1.选择单文件 2.选择多文件 3.选择目录 4.文件存储 5.选择颜色 6.选择字体 7.输入字符换/整数/浮点数/条目 8.消息对话框 9.进度对话框 10.向导对话框 1.选择单文件…

【圣诞节限定】今天教你如何用Html+JS+CSS绘制3D动画圣诞树

一、前言 应CSDN的邀请&#xff0c;这次给大家展示一波&#xff0c;如何用H5技术绘制3D圣诞树。 二、创意名 只采用简单的HtmlJSCSS 技术绘制。 三、效果展示 圣诞树修过如下&#xff1a; 四、编码实现 将源码复制保存到html中打开即可。 <!DOCTYPE html> <html lang…

ChatGPT与BimAnt的1小时对话实录【数字孪生】

本文为BimAnt和ChatGPT对数字孪生相关问题的解答&#xff0c;感觉这个AI真的已经“懂”了很多东西&#xff0c;让人恍惚间忘了是在和bot对话。 BimAnt&#xff1a;hello ChatGPT&#xff1a;Hello! How can I help you today? BimAnt&#xff1a;can you speak chinese&am…

鲸鱼优化算法及其在无线网络资源分配中的应用(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 鲸鱼优化算法&#xff08;Whale Optimization Algorithm&#xff09;是一种新兴的智能优化算法&#xff0c;在2016年提出。算法…

JWT渗透与攻防(二)

目录 前言 JWT漏洞演示之CTFhub&#xff08;一&#xff09; JWT漏洞演示之CTFhub&#xff08;二&#xff09; 前言 我们在之前的文章中已经讲解过了JWT漏洞相关的原理和利用&#xff0c;今天我们就通过这篇文章再来了解一下JWT的漏洞。 JWT漏洞演示之CTFhub&#xff08;一&…

Linux-信号

文章目录信号准备知识&#xff1a;信号产生的方式实验验证&#xff1a;9号信号是不可被捕捉&#xff08;自定义的&#xff09;信号处理&#xff1a;信号产生前&#xff1a;信号产生的方式&#xff1a;键盘实验显示&#xff1a;段错误&#xff08;野指针&#xff09;实验验证&am…

SSRF ME XCTF

题目 就是一个验证框和URL框&#xff0c;两个都必须有参数 解法 验证码 做一个粗略的脚本&#xff0c;一般验证码都是数字&#xff0c;所以直接开md5&#xff1a; def cmpcapt(substr):for i in range(1,100001):md5 hashlib.md5(str(i).encode(utf-8))hexmd5 md5.hexd…

机器学习任务功略

目录 机器学习的结构机器学习攻略 训练集loss较大 model bias问题optimization问题 gradient descent的问题解决 如何区分训练集loss大是model bias还是优化器的问题 测试集loss较大 overfitting过拟合 为什么会有overfitting解决过拟合的方法 训练集与测试集的不匹配 如何选择…

Linux内核基础篇——常用调试技巧汇总

文章目录printk动态输出BUG()和BUG_ON()dump_stack()devmemprintk printk共有8个等级&#xff0c;从0-7&#xff0c;等级依次降低。 打印等级可以通过修改/proc/sys/kernel/printk来改变。 查看printk等级&#xff1a; cat /proc/sys/kernel/printk 7 4 1 7打开内核所有打印…