(必看图文)Hadoop集群安装及MapReduce应用(手把手详解版)

前言

       随着大数据时代的到来,处理和分析海量数据已成为企业和科研机构不可或缺的能力。Hadoop,作为开源的分布式计算平台,因其强大的数据处理能力和良好的可扩展性,成为大数据处理领域的佼佼者。本图文教程旨在帮助读者理解Hadoop集群的安装过程,并通过MapReduce应用实例,深入体验Hadoop在大数据处理中的强大功能。

       在正式进入Hadoop集群安装之前,我们将简要介绍Hadoop的核心组件——HDFS(Hadoop Distributed File System)和MapReduce。HDFS提供了分布式存储能力,使得数据可以存储在集群中的多个节点上,从而实现高容错性和高吞吐量。而MapReduce则是一种编程模型,用于处理大规模数据集,其独特的“Map”和“Reduce”两个阶段使得数据处理任务可以并行执行,大大提高了处理效率。

       通过本教程的学习,读者将能够掌握Hadoop集群的搭建方法,理解MapReduce编程模型的基本原理,并通过实际案例体验Hadoop在大数据处理中的强大能力。

安装OpenEuler系统

选择Installer oenEuler  20.03-LTS

选择默认磁盘分区

配置网络

选择ipv4 setting

填写IP地址(手动配置地址必须遵守Vmware WorkStation的基本配置)

查看地址配置信息

开始安装

配置root账户密码

置root账户密码

通过此部署依次部署4台,并通过ssh登录

为每一台配置yum源地址

cd /etc/yum.repos.d/

vi openEulerOS.repo

配置华为Yum源地址。

[openEuler-source]

name=openEuler-source

baseurl=https://repo.huaweicloud.com/openeuler/openEuler-20.03-LTS/source/

enabled=1

gpgcheck=1

gpgkey=https://repo.huaweicloud.com/openeuler/openEuler-20.03-LTS/source/RPM-GPG-KEY-openEuler


[openEuler-os]

name=openEuler-os

baseurl=https://repo.huaweicloud.com/openeuler/openEuler-20.03-LTS/OS/x86_64/

enabled=1

gpgcheck=1

gpgkey=https://repo.huaweicloud.com/openeuler/openEuler-20.03-LTS/OS/x86_64/RPM-GPG-KEY-openEuler


[openEuler-everything]

name=openEuler-everything

baseurl=https://repo.huaweicloud.com/openeuler/openEuler-20.03-LTS/everything/x86_64/

enabled=1

gpgcheck=1

gpgkey=https://repo.huaweicloud.com/openeuler/openEuler-20.03-LTS/everything/x86_64/RPM-GPG-KEY-openEuler



[openEuler-EPOL]

name=openEuler-epol

baseurl=https://repo.huaweicloud.com/openeuler/openEuler-20.03-LTS/EPOL/x86_64/

enabled=1

gpgcheck=0

清楚现有并生成新的缓存

安装实验所需工具 vim tar (4台都安装)

yum install -y vim  tar

基础配置

此部分配置Hadoop各节点使其符合软件安装的要求,内容比较多,除了教程中给出的步骤,如果是物理服务器等需要另外设置时间同步,因为华为云已经同步了时间,所以此处不加上相应的配置过程,如感兴趣,请自行查资料完成。下面操作以node01为例,进行相应的配置

1.1.1.1 修改主机名

注意:如果主机名不是对应的node01、node2、node3、node4,则需要分别将四个节点的主机名进行修改,四台均需要修改,此处以node01为例子。如果你在购买的时候已经设置好主机名,则不需要修改,可忽略此步骤。

方式一:使用hostname命令,直接命名主机名(但是此种设置重启后会变回原来的,可不操作):

>  hostname node01

>  bash

方式二:修改/etc/hostname文件(修改好后重启,发生修改已生效):

>  vim /etc/hostname

# 修改完毕后,效果如下:

>  cat /etc/hostname

node01

>  reboot

方式三(统一采用这种):此外,还有一种更加简便的办法,直接执行后就可以了,不需要重启:

>  hostnamectl set-hostname node01

>  bash

以下是修改结果:

步骤 1  修改hosts配置文件

使用命令vim /etc/hosts,为node01-4四个节点增加内网IP与节点主机名的映射,确保各节点之间可以使用主机名作为通信的方式。

>  vim /etc/hosts

# 需删除自己的主机名映射到127.0.0.1的映射,如node01为:

127.0.0.1       node01   node01

此行务必删除!

# 加入以下内容如下:(注意IP地址必须是自己的IP地址)

192.168.28.31   node01

192.168.28.32   node02

192.168.28.33   node03

192.168.28.34   node04

呈现结果如下:

1.1.1.2 关闭防火墙

执行下面命令查看防火墙状态:

>  systemctl status firewalld

如果发现默认是已经禁用的,所以不需要关闭了。如果是开启的,则需要在node01-4四个节点执行如下命令关闭防火墙:

>  systemctl stop firewalld

>  systemctl disable firewalld

4个节点均执行此命令:

1.1.1.3 配置ssh互信

          步骤 1      生成id_rsa.pub 文件

各节点执行 ssh-keygen -t rsa 命令后,连续回车三次后生成/root/.ssh/id_rsa.pub 文件

 步骤 1      汇总id_rsa.pub

各个节点执行cat /root/.ssh/id_rsa.pub命令,我们需要将密钥进行汇总,思路是先将node2、node3、node4的密钥拷贝到node01,在node01进行汇总,然后将汇总好的文件分发到node2、node3、node4,这样的话,每个节点就有了彼此的密钥,达到互相免密码登录的效果。

将node2的密钥拷贝到node01(在node2执行):

> scp ~/.ssh/id_rsa.pub root@node01:~/.ssh/id2

执行的时候可能输入“yes”,并且需要输入node01的服务器密码。

将node3的密钥拷贝到node01(在node3执行):

> scp ~/.ssh/id_rsa.pub root@node01:~/.ssh/id3

执行的时候可能输入“yes”,并且需要输入node01的服务器密码。

将node4的密钥拷贝到node01(在node4执行):

> scp ~/.ssh/id_rsa.pub root@node01:~/.ssh/id4

执行的时候可能输入“yes”,并且需要输入node01的服务器密码。

查看一下是否拷贝完成(在node01执行):

> ll ~/.ssh

发现node2、node3、node4的密钥都拷贝到node01上了:

继续进行汇总:

> cd ~/.ssh

> cat id2 id3 id4 >> authorized_keys

此外,还要将node01的密钥也放进去:

> cat id_rsa.pub >> authorized_keys

查看汇总后的文件authorized_keys,发现已经有四台机器的密钥了:

> cat authorized_keys

最后,需要将此文件分发到node02、node03、node04:

> scp authorized_keys root@node02:~/.ssh/

> scp authorized_keys root@node03:~/.ssh/

> scp authorized_keys root@node04:~/.ssh/

步骤 1      验证测试

每个节点分别 ssh node01~node4,选择 yes 后,确保能够互相免密码登录。

两两相互测试

          步骤 1      安装JDK,在 node01~node04

1. 下载jdk8,或者通过上传本地安装文件

> wget https://mirrors.huaweicloud.com/java/jdk/8u192-b12/jdk-8u192-linux-x64.tar.gz

(此次演示node01,02-04都需要执行)

2. 解压jdk

> mkdir –p /usr/lib/jvm/

> tar -zxvf jdk-8u192-linux-x64.tar.gz -C /usr/lib/jvm/

> mv  /usr/lib/jvm/jdk1.8.0_192   /usr/lib/jvm/java

3. 配置环境变量

执行指令vim /etc/profile,编辑环境变量文件,在文件末尾添加下面内容

>  vim /etc/profile

export JAVA_HOME=/usr/lib/jvm/java

export PATH=$PATH:$JAVA_HOME/bin

export CLASSPATH=.:%JAVA_HOME%/lib/dt.jar:%JAVA_HOME%/lib/tools.jar

示例子如下:

使环境变量生效

> source /etc/profile

 5. 验证java环境

> java –version

出现以下信息表示jdk安装成功

java version "1.8.0_192"

Java(TM) SE Runtime Environment (build 1.8.0_192-b12)

Java HotSpot(TM) 64-Bit Server VM (build 25.192-b12, mixed mode)

上面验证通过,下面的步骤可以不用执行

6. 环境变量拷至bashrc文件,使每次打开shell都生效,编辑/etc/bashrc,在文件末尾添加下面内容 (可选)

>vim /etc/bashrc

export JAVA_HOME=/usr/lib/jvm/java

export PATH=$PATH:$JAVA_HOME/bin

export CLASSPATH=.:%JAVA_HOME%/lib/dt.jar:%JAVA_HOME%/lib/tools.jar

1.1.1.4 创建必要的目录

> mkdir -p /home/modules/data/buf/

> mkdir -p /home/test_tools/

> mkdir -p /home/nm/localdir

注意:四台服务器都需要操作。

1.2.1 下载软件包

          步骤 1      获取Hadoop软件包

node01找到下载好的Hadoop软件包,放到home目录,或者从本地上传安装文件

> wget https://archive.apache.org/dist/hadoop/common/hadoop-2.8.3/hadoop-2.8.3.tar.gz

1.2.1 搭建Hadoop集群

1.2.1.1 查看解压目录

在node01上准备hadoop组件

> tar -zxvf hadoop-2.8.3.tar.gz -C /home/modules

> ls /home/modules/  | grep hadoop

hadoop-2.8.3

1.2.1.2 修改配置文件

          步骤 1      配置hadoop-env.sh

在node010上执行命令:

> vim /home/modules/hadoop-2.8.3/etc/hadoop/hadoop-env.sh

修改JAVA_HOME路径为ECS已经默认装好了JDK路径

export

=/usr/lib/jvm/java

步骤 1      预配置core-site.xml

在node01上执行命令+

> vim /home/modules/hadoop-2.8.3/etc/hadoop/core-site.xml

在<configuration>与</configuration>之间填入以下内容,此为预配置,后期还要再修改,注意涉及到的主机名如果不同需要根据具体情况修改:

<property>

    <name>fs.defaultFS</name>

    <value>hdfs://node01:8020</value>

 </property>

 <property>

    <name>hadoop.tmp.dir</name>

    <value>/home/modules/hadoop-2.8.3/tmp</value>

 </property>

<property>

    <name>fs.obs.buffer.dir</name>

    <value>/home/modules/data/buf</value>

 </property>




<property>

    <name>fs.obs.readahead.inputstream.enabled</name>

    <value>true</value>

 </property>

 <property>

    <name>fs.obs.buffer.max.range</name>

    <value>6291456</value>

 </property>

 <property>

    <name>fs.obs.buffer.part.size</name>

    <value>2097152</value>

 </property>

 <property>

    <name>fs.obs.threads.read.core</name>

    <value>500</value>

 </property>

 <property>

    <name>fs.obs.threads.read.max</name>

    <value>1000</value>

 </property>

 <property>

    <name>fs.obs.write.buffer.size</name>

    <value>8192</value>

 </property>

 <property>

    <name>fs.obs.read.buffer.size</name>

    <value>8192</value>

 </property>

 <property>

    <name>fs.obs.connection.maximum</name>

    <value>1000</value>

 </property>



 <property>

    <name>fs.obs.impl</name>

    <value>org.apache.hadoop.fs.obs.OBSFileSystem</value>

 </property>

 <property>

    <name>fs.obs.connection.ssl.enabled</name>

    <value>false</value>

 </property>

 <property>

    <name>fs.obs.fast.upload</name>

    <value>true</value>

 </property>

 <property>

    <name>fs.obs.socket.send.buffer</name>

    <value>65536</value>

 </property>

 <property>

    <name>fs.obs.socket.recv.buffer</name>

    <value>65536</value>

 </property>

 <property>

    <name>fs.obs.max.total.tasks</name>

    <value>20</value>

 </property>

 <property>

    <name>fs.obs.threads.max</name>

    <value>20</value>

 </property>

效果如下:

1.2.1.3 配置hdfs-site.xml

在node01上执行命令

> vim /home/modules/hadoop-2.8.3/etc/hadoop/hdfs-site.xml

在<configuration>与</configuration>之间内容替换如下:

<property>

    <name>dfs.replication</name>

    <value>3</value>

 </property>

 <property>

    <name>dfs.namenode.secondary.http-address</name>

    <value>node01:50090</value>

 </property>

 <property>

    <name>dfs.namenode.secondary.https-address</name>

    <value>node01:50091</value>

 </property>

1.2.1.4 配置yarn-site.xml

在node01上执行命令

> vim /home/modules/hadoop-2.8.3/etc/hadoop/yarn-site.xml

在<configuration>与</configuration>之间内容替换如下:

<property>

    <name>yarn.resourcemanager.hostname</name>

    <value>node01</value>

    <description>表示ResourceManager安装的主机</description>

</property>

<property>

    <name>yarn.resourcemanager.address</name>

    <value>node01:8032</value>

    <description>表示ResourceManager监听的端口</description>

</property>

<property>

    <name>yarn.nodemanager.aux-services</name>

    <value>mapreduce_shuffle</value>

    <description>为map reduce应用打开shuffle 服务</description>

</property>

<property>

    <name>yarn.nodemanager.local-dirs</name>

    <value>/home/nm/localdir</value>

    <description>表示nodeManager中间数据存放的地方</description>

</property>

<property>

    <name>yarn.nodemanager.resource.memory-mb</name>

    <value>3072</value>

    <description>表示这个NodeManager管理的内存大小</description>

</property>

<property>

    <name>yarn.nodemanager.resource.cpu-vcores</name>

    <value>2</value>

    <description>表示这个NodeManager管理的cpu个数</description>

</property>

<property>

    <name>yarn.nodemanager.pmem-check-enabled</name>

    <value>false</value>

    <description>不检查每个任务的物理内存量</description>

</property>

<property>

    <name>yarn.nodemanager.vmem-check-enabled</name>

    <value>false</value>

    <description>不检查每个任务的虚拟内存量</description>

</property>

<property>

    <name>yarn.nodemanager.aux-services</name>

    <value>mapreduce_shuffle</value>

    <description>为map reduce应用打开shuffle 服务</description>

</property>

1.2.1.5 配置mapred-site.xml

在node01上执行命令:

> cp /home/modules/hadoop-2.8.3/etc/hadoop/mapred-site.xml.template /home/modules/hadoop-2.8.3/etc/hadoop/mapred-site.xml

然后编辑复制出来的配置文件:

  vim /home/modules/hadoop-2.8.3/etc/hadoop/mapred-site.xml

在<configuration>与</configuration>之间内容替换如下:

<property>

<name>mapreduce.framework.name</name>

<value>yarn</value>

</property>

<property>

<name>mapreduce.jobhistory.address</name>

<value>node1:10020</value>

</property>

<property>

<name>mapreduce.jobhistory.webapp.address</name>

<value>node1:19888</value>

</property>

<property>

<name>mapred.task.timeout</name>

<value>1800000</value>

</property>

1.2.1.6 配置slaves

在node01节点配置从节点,删掉里面的localhost,配置上从节点(node02、node03、node04)

> vim /home/modules/hadoop-2.8.3/etc/hadoop/slaves

# 删掉里面的localhost,添加以下内容

node02

node03

node04

1.2.1.7 分发组件

在 node01 执行如下命令,将 hadoop-2.8.3 目录拷贝到其他各个节点的/home/modules/下

> for i in {02..04};do scp -r /home/modules/hadoop-2.8.3 root@node${i}:/home/modules/;done

二选一

scp -r /home/modules/hadoop-2.8.3 root@node02:/home/modules/

scp -r /home/modules/hadoop-2.8.3 root@node03:/home/modules/

scp -r /home/modules/hadoop-2.8.3 root@node04:/home/modules/

等待几分钟拷贝完毕后,在 node02~node04 节点执行如下命令检查是否复制成功

> ls /home/modules/ | grep hadoop

1.2.1.8 添加并校验环境变量

在 node01~node04,执行下面命令添加环境变量:

> vim /etc/profile

# 添加内容为:

export HADOOP_HOME=/home/modules/hadoop-2.8.3

export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH

export HADOOP_CLASSPATH=/home/modules/hadoop-2.8.3/share/hadoop/tools/lib/*:$HADOOP_CLASSPATH

注意:请在末尾添加!

在 node01~node4,执行如下命令,使环境变量生效:

> source /etc/profile

此处以node01为例子

在 node01~node4,执行如下命令,校验环境变量:

> echo $HADOOP_HOME

显示如下内容则为配置正确:

1.2.1.9 初始化namenode

node01上执行如下命令,初始化 Namenode:

> hdfs namenode -format

1.3.1 启动Hadoop集群

步骤 1    在node01节点执行以下命令:
> start-dfs.sh ; start-yarn.sh

返回信息中有以下内容,表示hadoop集群启动成功:

Starting namenodes on [node01]

Starting secondary namenodes [node01]

starting yarn daemonshi

1.3.2 验证Hadoop状态

步骤 1   使用jps命令在node01-4中查看Java进程

在node01中可以查看到 NameNode,SecondaryNameNode,ResourceManager

进程,在node2-4中可以查看到 NodeManager 和 Datanode 进程,表示hadoop集群状态正常。

>  jps

1538 WrapperSimpleApp

5732 SecondaryNameNode

5508 NameNode

6205 Jps

5918 ResourceManager

>  jps

3026 Jps

2740 DataNode

1515 WrapperSimpleApp

2862 NodeManager

步骤 3    访问,可以登录Namenode的Web界面:

http://namenodeip:50070

访问Yran界面:

1.4.1 使用Hadoop统计以下表格人名字的出现次数

首先找到hadoop自带worldcount jar包示例的路径

创建数据文件夹,以及输出文件夹

编辑输入数据:

具体输入的数据听从老师安排

将本地准备的输入文件上传到hdfs中:

查看文件

执行MapReduce

hadoop jar hadoop-mapreduce-examples-2.8.3.jar wordcount /data/wordcount /output/wordcountresult

查看结果:jps

hadoop fs -text /output/wordcountresult/part-r-00000

结尾

        经过前面的学习,相信读者已经对Hadoop集群的安装和MapReduce应用有了深入的了解。Hadoop作为一个开源的分布式计算平台,为大数据处理提供了强大的支持。通过本教程的学习,读者可以搭建起自己的Hadoop集群,并尝试使用MapReduce处理大规模数据集。当然,Hadoop的功能远不止于此,它还有更多的高级特性和应用场景等待我们去探索。希望本教程能够为您在大数据处理领域的学习和实践提供一些帮助。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一次搞懂 Python 字典!Python字典的20种神奇用法

目录 引言 1. 创建字典 2. 访问字典元素 3. 添加或更新元素 4. 删除元素 5. 检查键是否存在 6. 获取字典的长度 7. 遍历字典 8. 合并字典 9. 字典推导式 10. 获取所有键 11. 获取所有值 12. 获取所有键值对 13. 从字典中获取值 14. 设置默认值 15. 清空字典 1…

《RepViT Revisiting Mobile CNN From ViT Perspective》

期刊&#xff1a;CVPR 年份&#xff1a;2024 代码&#xff1a;http://https: //github.com/THU-MIG/RepViT 摘要 最近&#xff0c;与轻量级卷积神经网络(CNN)相比&#xff0c;轻量级视觉Transformer(ViTs)在资源受限的移动设备上表现出了更高的性能和更低的延迟。研究人员已…

鸿蒙星河NEXT学习笔记

1.1 字符串 // 变量的存储和修改&#xff08;string number boolean&#xff09; // 1. 变量存储 // 1.1 字符串 string 类型 // 注意点1&#xff1a;字符串需要用引号引起来&#xff08;单引双引号&#xff09;字符串 "字符串" // 注意点2&#xff1a;存储的时候&a…

【pytorch12】什么是梯度

说明 导数偏微分梯度 梯度&#xff1a;是一个向量&#xff0c;向量的每一个轴是每一个方向上的偏微分 梯度是有方向也有大小&#xff0c;梯度的方向代表函数在当前点的一个增长的方向&#xff0c;然后这个向量的长度代表了这个点增长的速率 蓝色代表比较小的值&#xff0c;红色…

【吊打面试官系列-MyBatis面试题】模糊查询 like 语句该怎么写?

大家好&#xff0c;我是锋哥。今天分享关于 【模糊查询 like 语句该怎么写?】面试题&#xff0c;希望对大家有帮助&#xff1b; 模糊查询 like 语句该怎么写? 第 1 种&#xff1a;在 Java 代码中添加 sql 通配符。 string wildcardname “%smi%”; list<name> names …

煤都鄂尔多斯的“模”变

去年&#xff0c;《中国日报》曾经报道了这样一个故事。 从小生活在鄂尔多斯市准格尔旗三宝窑村的肖存海&#xff0c;如今对家园有了新的印象。村子附近曾经满是沟壑纵横&#xff0c;满眼荒芜的矿坑。如今&#xff0c;这些大地的伤疤不见了&#xff0c;取而代之的是一排排的苹果…

星火认知大模型Spark3.5 api调用 #AI夏令营 #Datawhale #夏令营

环境安装 pip install --upgrade -q spark_ai_python 官网注册 链接&#xff1a;https://console.xfyun.cn/app/myapp 官方会在报名成功后&#xff0c;立即发放星火大模型 Spark Max的 API 额度助力我们完成赛事&#xff0c; 200w Tokens 任你花&#xff01; 暑期有四场夏令营…

智慧水利3D可视化模拟仿真系统定制让您足不出门也能“掌控全厂”

在当今信息爆炸的时代&#xff0c;3d数据可视化大屏系统以其直观、动态的展示方式&#xff0c;让您轻松把握数据趋势&#xff0c;助力科学决策&#xff0c;正成为企业、政府乃至城市规划等领域的得力助手。 无论是企业管理、城市规划还是交通管理&#xff0c;3D可视化数据大屏系…

【紫光同创盘古PGX-Nano教程】——(盘古PGX-Nano开发板/PG2L50H_MBG324第十二章)Wifi透传实验例程说明

本原创教程由深圳市小眼睛科技有限公司创作&#xff0c;版权归本公司所有&#xff0c;如需转载&#xff0c;需授权并注明出处&#xff08;www.meyesemi.com) 适用于板卡型号&#xff1a; 紫光同创PG2L50H_MBG324开发平台&#xff08;盘古PGX-Nano&#xff09; 一&#xff1a;…

Docker 一篇到位

目录 01. Docker使用导航 02. Build Share Run 样例 03. 理解容器 04. 安装 Docker 05. Docker 样例&#xff08;常见命令使用&#xff09; 下载镜像 启动容器 修改页面 保存镜像 docker commit docker save docker load 分享社区 docker login docker tag do…

【Leetcode 566】【Easy】重塑矩阵

目录 题目描述 整体思路 具体代码 题目描述&#xff1a; 原题链接 整体思路 首先要确保重塑后的矩阵内元素个数和原矩阵元素个数要相同&#xff0c;如果不同则原样返回原矩阵。 按行遍历顺序遍历原矩阵&#xff0c;设一个临时vector<int>存放新矩阵的每一行的元素…

Go线程实现模型-G

G 概述 一个G就代表一个goroutine(或称Go例程)&#xff0c;也与go函数相对应。作为编程人员&#xff0c;我们只是使用go语句向Go的运行时系统提交一个并发任务&#xff0c;而Go的运行时系统则会按照我们要求并发地执行它 Go编译器会把go语句变成对内部函数newproc的调用&…

张嘴就能生图?一分钟教会你使用魔法!(Stable Diffusion进阶:SDXL-Turbo)

大家好我是极客菌&#xff01;&#xff01;&#xff01;Stable Diffusion&#xff0c;一款基于深度学习的图像生成模型&#xff0c;以其强大的图像生成能力和个性化风格迁移能力&#xff0c;在艺术创作领域掀起了一场革命。而SDXL-Turbo&#xff0c;作为Stable Diffusion的进阶…

ADS基础教程23 - 有限元电磁仿真(FEM)可视化操作

EM介绍 一、引言二、FEM可视化操作流程1.打开可视化界面2.查看介质的网格3.设置网格颜色4.选择网格5.传感器选择6.编辑传感器7.选择频率8.动画 三、总结 一、引言 在ADS基础教程22中介绍了如何在ADS进行有限元电磁仿真&#xff08;FEM&#xff09;&#xff0c;本文将继续介绍F…

MD5算法详解

哈希函数 是一种将任意输入长度转变为固定输出长度的函数。 一些常见哈希函数有&#xff1a;MD5、SHA1、SHA256。 MD5算法 MD5算法是一种消息摘要算法&#xff0c;用于消息认证。 数据存储方式&#xff1a;小段存储。 数据填充 首先对我们明文数据进行处理&#xff0c;使其…

Jasper studio报表工具中,如何判断subDataSource()子报表数据源是否为空

目录 1.1、错误描述 1.2、解决方案 1.1、错误描述 今天在处理一个有关Jasper Studio报表模板制作的线上问题&#xff0c;需要根据某个报表子数据源是否为空&#xff0c;来决定对应的组件是否显示&#xff0c;找了好久的资料都没有实现&#xff0c;最后找到一种解决办法。就是…

专为运维工程师设计!阿里藏经阁出品的Python实战手册被我搞来了

Python 可能是极少数既简单又强大的编程语言中的一种。更重要的是&#xff0c;用它来编程是非常快乐的事。 今天给小伙伴们分享的是阿里“藏经阁”出品的专门给运维工程师设计的Python实战手册 废话不多说&#xff0c;下面把内容展示给大家 01 Python快速回顾 02 Python脚本…

Linux下SUID提权学习 - 从原理到使用

目录 1. 文件权限介绍1.1 suid权限1.2 sgid权限1.3 sticky权限 2. SUID权限3. 设置SUID权限4. SUID提权原理5. SUID提权步骤6. 常用指令的提权方法6.1 nmap6.2 find6.3 vim6.4 bash6.5 less6.6 more6.7 其他命令的提权方法 1. 文件权限介绍 linux的文件有普通权限和特殊权限&a…

【剑指Offer系列】68-二叉树的最近公共祖先(哈希)

思路&#xff1a;使用map存储每个节点的父节点&#xff0c;则两个节点的最近公共祖先&#xff0c;即二者的最近父节点 1、中序遍历二叉树&#xff08;当前节点的下一个节点&#xff09; 2、记录每个节点的父节点 3、列出p的族谱、q的族谱 4、寻找二者最近的祖先 class Soluti…

CesiumJS【Basic】- #041 绘制纹理线(Entity方式)- 需要自定义着色器

文章目录 绘制纹理线(Entity方式)- 需要自定义着色器1 目标2 代码2.1 main.ts3 资源文件绘制纹理线(Entity方式)- 需要自定义着色器 1 目标 使用Entity方式绘制纹理线 2 代码 2.1 main.ts import * as Cesium from cesium;const viewer = new Cesium.Viewer