CHAPTER 7 HPC集群部署 - hadoop

HPC集群部署 - hadoop

    • 1. 介绍
    • 2. 优点
    • 3. 架构及相关组件
      • 3.1 HDFS
        • 3.1.1 NameNode
        • 3.1.2 DataNode
        • 3.1.3 Secondary NameNode
        • 3.1.4 Client(客户端)
      • 3.2 Mapreduce(分布式计算框架)
      • 3.3. HBase(分布式列存储数据库)
      • 3.4 Zookeeper(分布式协作服务)
      • 3.5. Hive / Impala(基于Hadoop的数据仓库)
      • 3.6 Pig(ad-hoc脚本)
      • 3.7 Sqoop(数据ETL/同步工具)
      • 3.8 Flume(日志收集工具)
      • 3.9 kafka (发布订阅消息系统)
      • 3.10 Spark(内存计算框架)
      • 3.11 Flink(内存计算框架)
      • 3.12 Oozie(工作流程调度管理系统)
      • 3.13 YARN(另一种资源协调者)
    • 4. 安装及验证
      • 4.1 环境准备
      • 4.2 软件准备
      • 4.3 环境配置
      • 4.4 安装hadoop
      • 4.5 配置集群
      • 4.6 分发文件
      • 4.7 Hadoop初始化
      • 4.8 Hadoop集群启动
      • 4.9 集群启动/停止方式总结
      • 4.10 编写Hadoop集群常用脚本
      • 4.11 查看web页面
      • 4.12 测试集群
      • 4.13 启动遇到的问题
        • 1. ResourceManager无法启动
        • 2. OOM
        • 3. datanode无法启动

1. 介绍

Hadoop是一个由Apache基金会所开发的分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。

Hadoop实现了一个分布式文件系统( Distributed File System),其中一个组件是HDFS(Hadoop Distributed File System)。HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上;而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了(relax)POSIX的要求,可以以流的形式访问(streaming access)文件系统中的数据。Hadoop的框架最核心的设计就是:HDFS和MapReduce。HDFS为海量的数据提供了存储,而MapReduce则为海量的数据提供了计算。

其中MapReduce由于其使用场景的极端复杂性,同时性能也达不到用户的期待,所以现在很少人会使用。
可参考 mapreduce为什么被淘汰了?

2. 优点

Hadoop是一个能够让用户轻松架构和使用的分布式计算平台。用户可以轻松地在Hadoop上开发和运行处理海量数据的应用程序。它主要有以下几个优点 :

  • 1.高可靠性。Hadoop按位存储和处理数据的能力值得人们信赖 。
  • 2.高扩展性。Hadoop是在可用的计算机集簇间分配数据并完成计算任务的,这些集簇可以方便地扩展到数以千计的节点中 。
  • 3.高效性。Hadoop能够在节点之间动态地移动数据,并保证各个节点的动态平衡,因此处理速度非常快 。
  • 4.高容错性。Hadoop能够自动保存数据的多个副本,并且能够自动将失败的任务重新分配 。
  • 5.低成本。与一体机、商用数据仓库以及QlikView、Yonghong Z-Suite等数据集市相比,hadoop是开源的,项目的软件成本因此会大大降低 。

Hadoop带有用Java语言编写的框架,因此运行在 Linux 生产平台上是非常理想的。Hadoop 上的应用程序也可以使用其他语言编写,比如 C++

Hadoop大数据处理的意义
Hadoop得以在大数据处理应用中广泛应用得益于其自身在数据提取、变形和加载(ETL)方面上的天然优势。Hadoop的分布式架构,将大数据处理引擎尽可能的靠近存储,对例如像ETL这样的批处理操作相对合适,因为类似这样操作的批处理结果可以直接走向存储。Hadoop的MapReduce功能实现了将单个任务打碎,并将碎片任务(Map)发送到多个节点上,之后再以单个数据集的形式加载(Reduce)到数据仓库里

ETL,是英文Extract-Transform-Load的缩写,用来描述将数据从来源端经过抽取(extract)、转换(transform)、加载(load)至目的端的过程。ETL一词较常用在数据仓库,但其对象并不限于数据仓库。

3. 架构及相关组件

Hadoop 由许多元素构成。其最底部是 Hadoop Distributed File System(HDFS),它存储 Hadoop 集群中所有存储节点上的文件。HDFS的上一层是MapReduce 引擎,该引擎由 JobTrackers 和 TaskTrackers 组成。通过对Hadoop分布式计算平台最核心的分布式文件系统HDFS、MapReduce处理过程,以及数据仓库工具Hive和分布式数据库Hbase的介绍,基本涵盖了Hadoop分布式平台的所有技术核心
在这里插入图片描述

3.1 HDFS

源自于Google的GFS论文,发表于2003年10月,HDFS是GFS克隆版。

对外部客户机而言,HDFS就像一个传统的分级文件系统。可以创建、删除、移动或重命名文件,等等。但是 HDFS 的架构是基于一组特定的节点构建的,这是由它自身的特点决定的。
在这里插入图片描述

这些节点包括 NameNode(仅一个),它在 HDFS 内部提供元数据服务;DataNode,它为 HDFS 提供存储块。由于仅存在一个 NameNode,因此这是 HDFS 1.x版本的一个缺点(单点失败)。在Hadoop 2.x版本可以存在两个NameNode,解决了单节点故障问题 。

存储在 HDFS 中的文件被分成块,然后将这些块复制到多个计算机中(DataNode)。这与传统的 RAID 架构大不相同。块的大小(1.x版本默认为 64MB,2.x版本默认为128MB)和复制的块数量在创建文件时由客户机决定。NameNode 可以控制所有文件操作。HDFS 内部的所有通信都基于标准的 TCP/IP 协议。

3.1.1 NameNode

NameNode 是一个通常在 HDFS 实例中的单独机器上运行的软件。它负责管理文件系统名称空间和控制外部客户机的访问。NameNode 决定是否将文件映射到 DataNode 上的复制块上。对于最常见的 3 个复制块,第一个复制块存储在同一机架的不同节点上,最后一个复制块存储在不同机架的某个节点上。
实际的 I/O事务并没有经过 NameNode,只有表示 DataNode 和块的文件映射的元数据经过 NameNode。当外部客户机发送请求要求创建文件时,NameNode 会以块标识和该块的第一个副本的 DataNode IP 地址作为响应。这个 NameNode 还会通知其他将要接收该块的副本的 DataNode。
NameNode 在一个称为 FsImage 的文件中存储所有关于文件系统名称空间的信息。这个文件和一个包含所有事务的记录文件(这里是 EditLog)将存储在 NameNode 的本地文件系统上。FsImage 和 EditLog 文件也需要复制副本,以防文件损坏或 NameNode 系统丢失。
NameNode本身不可避免地具有SPOF(Single Point Of Failure)单点失效的风险,主备模式并不能解决这个问题,通过Hadoop Non-stop namenode才能实现100% uptime可用时间。

3.1.2 DataNode

DataNode 也是一个通常在 HDFS实例中的单独机器上运行的软件。Hadoop 集群包含一个 NameNode 和大量 DataNode。DataNode 通常以机架的形式组织,机架通过一个交换机将所有系统连接起来。Hadoop 的一个假设是:机架内部节点之间的传输速度快于机架间节点的传输速度。
DataNode 响应来自 HDFS 客户机的读写请求。它们还响应来自 NameNode 的创建、删除和复制块的命令。NameNode 依赖来自每个 DataNode 的定期心跳(heartbeat)消息。每条消息都包含一个块报告,NameNode 可以根据这个报告验证块映射和其他文件系统元数据。如果 DataNode 不能发送心跳消息,NameNode 将采取修复措施,重新复制在该节点上丢失的块

3.1.3 Secondary NameNode

辅助NameNode,实现高可靠性,定期合并fsimage和fsedits,推送给NameNode;紧急情况下辅助和恢复NameNode,但其并非NameNode的热备份。

3.1.4 Client(客户端)

切分文件,访问HDFS时,首先与NameNode交互,获取目标文件的位置信息,然后与DataNode交互,读写数据。

Hadoop 2为HDFS引入了两个重要的新功能 ——Federation和高可用(HA):

  • Federation允许集群中出现多个NameNode,之间相互独立且不需要互相协调,各自分工,管理自己的区域。 DataNode 被用作通用的数据块存储设备。每个 DataNode 要向集群中所有NameNode 注册,并发送心跳报告,执行所有 namenode的命令。
  • HDFS中的高可用性消除了Hadoop 1中存在的单点故障,其中,NameNode故障将导致集群中断。HDFS的高可用性提供故障转移功能(备用节点从失败的主NameNode接管工作的过程)以实现自动化。

3.2 Mapreduce(分布式计算框架)

源自于google的MapReduce论文,发表于2004年12月,Hadoop MapReduce是google MapReduce 克隆版。

MapReduce是一种基于磁盘的分布式并行批处理计算模型,用以进行大数据量的计算。它屏蔽了分布式计算框架细节,将计算抽象成map和reduce两部分。

其中Map对数据集上的独立元素进行指定的操作,生成键-值对形式中间结果。Reduce则对中间结果中相同“键”的所有“值”进行规约,以得到最终结果。

MapReduce非常适合在大量计算机组成的分布式并行环境里进行数据处理。

基本原理:
在这里插入图片描述

相关概念

  • Jobtracker:master节点,只有一个,管理所有作业,任务/作业的监控,错误处理等,将任务分解成一系列任务,并分派给Tasktracker。
  • Tasktracker:slave节点,运行 Map task和Reduce task;并与Jobtracker交互,汇报任务状态。
  • Map task:解析每条数据记录,传递给用户编写的map()函数并执行,将输出结果写入到本地磁盘(如果为map—only作业,则直接写入HDFS)。
  • Reduce task:从Map 它深刻地执行结果中,远程读取输入数据,对数据进行排序,将数据分组传递给用户编写的Reduce()函数执行。

参考 MAPREDUCE详解

3.3. HBase(分布式列存储数据库)

源自Google的Bigtable论文,发表于2006年11月,HBase是GoogleBigtable克隆版。

HBase是一个建立在HDFS之上,面向列的针对结构化数据的可伸缩、高可靠、高性能、分布式和面向列的动态模式数据库。

HBase采用了BigTable的数据模型:增强的稀疏排序映射表(Key/Value),其中,键由行关键字、列关键字和时间戳构成。

HBase提供了对大规模数据的随机、实时读写访问,同时,HBase中保存的数据可以使用MapReduce来处理,它将数据存储和并行计算完美地结合在一起。

3.4 Zookeeper(分布式协作服务)

源自Google的Chubby论文,发表于2006年11月,Zookeeper是Chubby克隆版

解决分布式环境下的数据管理问题:统一命名,状态同步,集群管理,配置同步等。

Hadoop的许多组件依赖于Zookeeper,它运行在计算机集群上面,用于管理Hadoop操作。

3.5. Hive / Impala(基于Hadoop的数据仓库)

由Facebook开源,最初用于解决海量结构化的日志数据统计问题。

Hive定义了一种类似SQL的查询语言(HQL),将SQL转化为MapReduce任务在Hadoop上执行。通常用于离线分析。

HQL用于运行存储在Hadoop上的查询语句,Hive让不熟悉MapReduce开发人员也能编写数据查询语句,然后这些语句被翻译为Hadoop上面的MapReduce任务。

Impala是用于处理存储在Hadoop集群中的大量数据的MPP(大规模并行处理)SQL查询引擎。 它是一个用C ++和Java编写的开源软件。 与Apache Hive不同,Impala不基于MapReduce算法。 它实现了一个基于守护进程的分布式架构,它负责在同一台机器上运行的查询执行的所有方面。因此执行效率高于Apache Hive。

3.6 Pig(ad-hoc脚本)

由yahoo!开源,设计动机是提供一种基于MapReduce的ad-hoc(计算在query时发生)数据分析工具

Pig定义了一种数据流语言—PigLatin,它是MapReduce编程的复杂性的抽象,Pig平台包括运行环境和用于分析Hadoop数据集的脚本语言(Pig Latin)。

其编译器将Pig Latin翻译成MapReduce程序序列将脚本转换为MapReduce任务在Hadoop上执行。通常用于进行离线分析。

3.7 Sqoop(数据ETL/同步工具)

Sqoop是SQL-to-Hadoop的缩写,主要用于传统数据库和Hadoop之前传输数据。数据的导入和导出本质上是Mapreduce程序,充分利用了MR的并行化和容错性。

Sqoop利用数据库技术描述数据架构,用于在关系数据库、数据仓库和Hadoop之间转移数据。

3.8 Flume(日志收集工具)

Cloudera开源的日志收集系统,具有分布式、高可靠、高容错、易于定制和扩展的特点。

Flume是一个可扩展、适合复杂环境的海量日志收集系统,也可以用于收集其他类型数据。它将数据从产生、传输、处理并最终写入目标的路径的过程抽象为数据流,在具体的数据流中,数据源支持在Flume中定制数据发送方,从而支持收集各种不同协议数据。

同时,Flume数据流提供对日志数据进行简单处理的能力,如过滤、格式转换等。此外,Flume还具有能够将日志写往各种数据目标(可定制)的能力。

3.9 kafka (发布订阅消息系统)

Kafka 是一种高吞吐量的分布式发布订阅消息系统

3.10 Spark(内存计算框架)

Spark 是当前最流行的开源大数据内存计算框架。可以基于 Hadoop 上存储的大数据进行计算。

3.11 Flink(内存计算框架)

Flink 是当前最流行的开源大数据内存计算框架。 用于实时计算的场景较多。

3.12 Oozie(工作流程调度管理系统)

Oozie 是一个管理 Hadoop 作业(job)的工作流程调度管理系统。

3.13 YARN(另一种资源协调者)

YARN(Yet Another Resource Negotiator,另一种资源协调者),是通用资源管理器和调度平台,可为上层应用提供统一的资源管理和调度。

可以把YARN理解为相当于一个分布式的操作系统平台,MapReduce等计算程序相当于运行在操作系统之上的应用程序,YARN为这些应用程序分配资源。

  • 资源管理系统:管理集群的cpu,内存,YARN没有管理磁盘,因为磁盘由HDFS管理 。
  • 调度平台:为来申请资源的应用合理分配资源
  • 通用:支持各种计算框架,YARN不关心你干是干什么的,只关心你要的资源。

在这里插入图片描述
从图中可以看出,YARN不仅支持MapReduce,还支持其他很多框架,MapReduce已经淘汰了,但是Hadoop依然屹立不倒,正是因为YARN,YARN能支持各种框架来读取HDFS上的数据。

参考 YARN详解

4. 安装及验证

4.1 环境准备

准备3台linux机器(或虚拟机),IP在同一网段,笔者机器只能带起两个虚拟机,所以只准备两个虚拟机

主机名IP用户HDFSYARN
node1192.168.71.183rootNameNode、DataNodeNodeManager、ResourceManager
node2192.168.71.253rootDataNode、SecondaryNameNodeNodeManager
node3--DataNodeNodeManager

4.2 软件准备

  1. hadoop下载 https://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/hadoop-2.10.2/
  2. jdk
[root@node2 ~]# yum install java-1.8.0-openjdk.x86_64 : OpenJDK 8 Runtime Environment
[root@node2 ~]# java -version
openjdk version "1.8.0_362"
OpenJDK Runtime Environment (build 1.8.0_362-b08)
OpenJDK 64-Bit Server VM (build 25.362-b08, mixed mode)

此处需要着重声明,yum默认安装的openjdk是jre,而我们需要的是jdk,所以推荐用安装包下载,此处笔者重新安装了java并修改环境变量

[root@node2 share]# yum remove java*
Resolving Dependencies
...

Complete!
[root@node2 share]# java -version
-bash: /usr/bin/java: No such file or directory

[root@node2 share]# scp root@192.168.71.183:/usr/local/share/jdk-8u361-linux-x64.tar.gz .
jdk-8u361-linux-x64.tar.gz                                                                              100%  132MB  15.4MB/s   00:08
[root@node2 share]# tar -zxvf jdk-8u361-linux-x64.tar.gz
[root@node2 share]# cat /etc/profile
# /etc/profile
...
export JAVA_HOME=/usr/local/share/jdk
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin
[root@node2 share]# source /etc/profile
[root@node2 share]# java -version
java version "1.8.0_361"
Java(TM) SE Runtime Environment (build 1.8.0_361-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.361-b09, mixed mode)

补充: 卸载自带的jdk

[root@hadoop100 ~]# rpm -qa | grep -i java | xargs -n1 rpm -e --nodeps 

​ 注意:如果你的虚拟机是最小化安装不需要执行这一步。

rpm -qa:查询所安装的所有rpm软件包
grep -i:忽略大小写
xargs -n1:表示每次只传递一个参数
rpm -e –nodeps:强制卸载软件

4.3 环境配置

    1. 配置静态IP
    1. 修改主机名
    1. 安装openssh,并配置免密登录
      在这里插入图片描述

      必须要node1节点可以SSH无密码登录到各个节点上。首先生成node1节点公钥,如果之前已经生成,必须删除,重新生成一次。在node1上进行下面操作:

		[root@node1 .ssh]# rm ./id_rsa* -f
		[root@node1 .ssh]# ll
		total 8
		-rw-------  1 root root 2751 Mar  1 03:57 authorized_keys
		-rw-r--r--. 1 root root 1563 Mar 28 10:50 known_hosts
		[root@node1 .ssh]# ssh-keygen -t rsa
		Generating public/private rsa key pair.
		Enter file in which to save the key (/root/.ssh/id_rsa):
		Enter passphrase (empty for no passphrase):
		Enter same passphrase again:
		Your identification has been saved in /root/.ssh/id_rsa.
		Your public key has been saved in /root/.ssh/id_rsa.pub.
		The key fingerprint is:
		SHA256:LGCOrSrdps8bt/wNDpk/IXyQ0XEPkHcpn2Txv0f62YM root@node1
		The key's randomart image is:
		+---[RSA 2048]----+
		|       .o+o .o   |
		|      . o.oo=.   |
		|    o  o . *...  |
		|   = .o.    o  . |
		|  . o...S       o|
		|   .  o+o      o.|
		| .... =o..    o..|
		|....o+ =.o   E o+|
		|o .++.o.+..    .+|
		+----[SHA256]-----+

再让node1节点能够无密码SSH登录本机,在node1节点上执行下面命令:

	[root@node1 .ssh]# cat ./id_rsa.pub >> ./authorized_keys
		[root@node1 .ssh]# ssh node1
		Last login: Wed Mar 29 05:05:08 2023 from 192.168.20.252
		[root@node1 ~]# exit
		logout
		Connection to node1 closed.

接下来将node1上的公钥传给node2节点:

	[root@node1 .ssh]# scp ~/.ssh/id_rsa.pub root@node2:/home/node2/
	root@node2's password:
	id_rsa.pub                                                                                 100%  392   415.8KB/s   00:00
		

其中scp是secure copy的简写,在Linux中用于远程拷贝。

接着在node2节点上,将接收到的公钥加入授权:

[root@node2 node2]# cat /home/node2/id_rsa.pub >> ~/.ssh/authorized_keys
[root@node2 node2]# rm id_rsa.pub -f

在node1测试

[root@node1 .ssh]# ssh node2
Last login: Wed Mar 29 07:52:40 2023 from node1
welcome yurq
[root@node2 ~]# exit
logout
Connection to node2 closed.


    1. 配置jdk环境变量(如果环境变量中没有的话)

4.4 安装hadoop

在所有机器安装java和hadoop

[root@node1 hadoop]# tar -zxvf hadoop-2.10.2.tar.gz
[root@node1 hadoop]# mv hadoop-2.10.2 hadoop
[root@node2 hadoop]# cat /etc/profile.d/my_env.sh
#JAVA_HOME
export JAVA_HOME=/usr/local/share/jdk
export PATH=$PATH:$JAVA_HOME/bin

#HADOOP_HOME
export HADOOP_HOME=/root/hadoop/hadoop

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

如果之前修改过/etc/profile,则需要手动修改

...
export JAVA_HOME=/usr/local/share/jdk
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin

刷新

source profile

查看版本

[root@node1 hadoop]# ./bin/hadoop version
Hadoop 2.10.2
Subversion Unknown -r 965fd380006fa78b2315668fbc7eb432e1d8200f
Compiled by ubuntu on 2022-05-24T22:35Z
Compiled with protoc 2.5.0
From source with checksum d3ab737f7788f05d467784f0a86573fe
This command was run using /root/hadoop/hadoop/share/hadoop/common/hadoop-common-2.10.2.jar

4.5 配置集群

Hadoop运行模式

1)Hadoop官方网站:http://hadoop.apache.org/

2)Hadoop运行模式包括:本地模式、伪分布式模式以及完全分布式模式。

  • 本地模式:单机运行,只是用来演示一下官方案例。生产环境不用。

  • 伪分布式模式:也是单机运行,但是具备Hadoop集群的所有功能,一台服务器模拟一个分布式的环境。个别缺钱的公司用来测试,生产环境不用。

  • 完全分布式模式:多台服务器组成分布式环境。生产环境使用。

本文主要演示完全分布式模式
配置集群模式时,需要修改/root/hadoop/hadoop/etc/hadoop目录下的配置文件,包括workers、core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml。各节点路径应保持一致,笔者此处路径有冗余,不过没有修改,能用就行。

[root@node1 hadoop]# ll
total 164
-rw-r--r-- 1 1000 1000  8814 May 24  2022 capacity-scheduler.xml
-rw-r--r-- 1 1000 1000  1335 May 24  2022 configuration.xsl
-rw-r--r-- 1 1000 1000  1211 May 24  2022 container-executor.cfg
-rw-r--r-- 1 1000 1000   774 May 24  2022 core-site.xml
...
-rw-r--r-- 1 1000 1000    10 May 24  2022 slaves
-rw-r--r-- 1 1000 1000  2316 May 24  2022 ssl-client.xml.example
-rw-r--r-- 1 1000 1000  2697 May 24  2022 ssl-server.xml.example
-rw-r--r-- 1 1000 1000  2250 May 24  2022 yarn-env.cmd
-rw-r--r-- 1 1000 1000  4876 May 24  2022 yarn-env.sh
-rw-r--r-- 1 1000 1000   690 May 24  2022 yarn-site.xml
[root@node1 hadoop]# pwd
/root/hadoop/hadoop/etc/hadoop
    1. 修改slaves文件
    [root@node1 hadoop]# cat slaves
    node1
    node2
    

    该文件内容可以指定某几个节点作为数据节点,默认为localhost,我们将其删除并修改为node2。当然也可以将node1加进去,让node1节点既做名称节点,也做数据节点,本文将node1一起加进去作为数据节点。

    注意:slaves文件中不允许出现空格和空行!

    1. 修改core-site.xml文件

fs.defaultFS:指定namenode的hdfs协议的文件系统通信地址,可以指定一个主机+端口
hadoop.tmp.dir:hadoop集群在工作时存储的一些临时文件存放的目录

	[root@node1 hadoop]# cat core-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
  ...
<!-- Put site-specific property overrides in this file. -->

<configuration>
        <property>
                <name>fs.defaultFS</name>
                <value>hdfs://node1:9000</value>
        </property>
        <property>
                <name>hadoop.tmp.dir</name>
                <value>file:/usr/local/hadoop/tmp</value>
        </property>
</configuration>
    1. 修改hdfs-site.xml文件

dfs.secondary.http.address:secondarynamenode运行节点的信息,应该和namenode存放在不同节点
dfs.repliction:hdfs的副本数设置,默认为3
dfs.namenode.name.dir:namenode数据的存放位置,元数据存放位置
dfs.datanode.data.dir:datanode数据的存放位置,block块存放的位置

[root@node1 hadoop]# cat hdfs-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
 ...
<!-- Put site-specific property overrides in this file. -->

<configuration>
        <property>
                <name>dfs.namenode.secondary.http-address</name>
                <value>node2:50090</value>
        </property>
        <property>
                <name>dfs.replication</name>
                <value>2</value>
        </property>
        <property>
                <name>dfs.namenode.name.dir</name>
                <value>file:/usr/local/hadoop/tmp/dfs/name</value>
        </property>
        <property>
                <name>dfs.datanode.data.dir</name>
                <value>file:/usr/local/hadoop/tmp/dfs/data</value>
        </property>
</configuration>
    1. 修改mapred-site.xml文件

mapreduce.framework.name:指定mapreduce框架为yarn方式
mapreduce.jobhistory.address:指定历史服务器的地址和端口
mapreduce.jobhistory.webapp.address:查看历史服务器已经运行完的Mapreduce作业记录的web地址,需要启动该服务才行

[root@node1 hadoop]# cp mapred-site.xml.template mapred-site.xml
[root@node1 hadoop]# vim mapred-site.xml
[root@node1 hadoop]# cat mapred-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
  ...

<!-- Put site-specific property overrides in this file. -->

<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>yarn.app.mapreduce.am.env</name>
                <value>HADOOP_MAPRED_HOME=/root/hadoop</value>
        </property>
        <property>
                <name>mapreduce.map.env</name>
                <value>HADOOP_MAPRED_HOME=/root/hadoop</value>
        </property>
        <property>
                <name>mapreduce.reduce.env</name>
                <value>HADOOP_MAPRED_HOME=/root/hadoop</value>
        </property>
</configuration>
    1. 修改yarn-site.xml文件
[root@node1 hadoop]# cat yarn-site.xml
<?xml version="1.0"?>
<!--
...
<configuration>
        <property>
                <name>yarn.resourcemanager.hostname</name>
                <value>node1</value>
        </property>
        <property>
                <name>yarn.nodemanager.aux-services</name>
                <value>mapreduce_shuffle</value>
        </property>
</configuration>

4.6 分发文件

修改完上面五个文件后,将node1节点上的hadoop文件复制到各个结点上。在node1节点上执行下面命令:

[root@node1 etc]# tar -zcvf  hadoop.tar.gz hadoop
hadoop/
...
hadoop/yarn-site.xml
[root@node1 etc]# ll
total 40
drwxr-xr-x 2 1000 1000  4096 Mar 28 10:32 hadoop
-rw-r--r-- 1 root root 34519 Mar 28 10:35 hadoop.tar.gz
[root@node1 etc]# scp hadoop.tar.gz root@192.168.71.253:/root/hadoop/etc/
hadoop.tar.gz                                                                 

在node2节点执行:

[root@node2 etc]# mv hadoop hadoop.bak
[root@node2 etc]# tar -zxvf hadoop.tar.gz
hadoop/
...
hadoop/yarn-site.xml
[root@node2 etc]# ll
total 44
drwxr-xr-x 2 liquid liquid  4096 Mar 28 10:32 hadoop
drwxr-xr-x 2 liquid liquid  4096 May 24  2022 hadoop.bak
-rw-r--r-- 1 root   root   34519 Mar 28 13:23 hadoop.tar.gz

授权:

[root@node1 hadoop]# ll
total 404908
drwxr-xr-x 9 1000 1000       149 May 24  2022 hadoop
-rw-r--r-- 1 root root 414624228 Mar 27 06:42 hadoop-2.10.2.tar.gz
[root@node1 hadoop]# chown -R root hadoop
[root@node1 hadoop]# ll
total 404908
drwxr-xr-x 9 root 1000       149 May 24  2022 hadoop
-rw-r--r-- 1 root root 414624228 Mar 27 06:42 hadoop-2.10.2.tar.gz

笔者用root账号执行相关操作,读者可根据自己服务器情况,自行修改属主

4.7 Hadoop初始化

HDFS初始化只能在主节点上进行

[root@node1 hadoop]# ./bin/hdfs namenode -format
...
...
23/03/28 10:46:41 INFO common.Storage: Storage directory /usr/local/hadoop/tmp/dfs/name has been successfully formatted.
23/03/28 10:46:41 INFO namenode.FSImageFormatProtobuf: Saving image file /usr/local/hadoop/tmp/dfs/name/current/fsimage.ckpt_0000000000000000000 using no compression
23/03/28 10:46:41 INFO namenode.FSImageFormatProtobuf: Image file /usr/local/hadoop/tmp/dfs/name/current/fsimage.ckpt_0000000000000000000 of size 323 bytes saved in 0 seconds .
23/03/28 10:46:41 INFO namenode.NNStorageRetentionManager: Going to retain 1 images with txid >= 0
23/03/28 10:46:41 INFO namenode.FSImage: FSImageSaver clean checkpoint: txid = 0 when meet shutdown.
23/03/28 10:46:41 INFO namenode.NameNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at node1/192.168.71.183
************************************************************/

在初始化过程中,只要看到common.Storage: Storage directory /usr/local/hadoop/tmp/dfs/name has been successfully formatted.说明初始化成功。

4.8 Hadoop集群启动

在node1节点上执行下面命令:

[root@node1 hadoop]# start-dfs.sh
Starting namenodes on [node1]
node1: starting namenode, logging to /root/hadoop/hadoop/logs/hadoop-root-namenode-node1.out
node1: starting datanode, logging to /root/hadoop/hadoop/logs/hadoop-root-datanode-node1.out
node2: starting datanode, logging to /root/hadoop/hadoop/logs/hadoop-root-datanode-node2.253.out
Starting secondary namenodes [node2]
node2: starting secondarynamenode, logging to /root/hadoop/hadoop/logs/hadoop-root-secondarynamenode-node2.253.out
[root@node1 hadoop]# jps
15538 Jps
15194 NameNode
15292 DataNode
6109 JobHistoryServer
[root@node1 hadoop]# start-yarn.sh
starting yarn daemons
starting resourcemanager, logging to /root/hadoop/hadoop/logs/yarn-root-resourcemanager-node1.out
node2: starting nodemanager, logging to /root/hadoop/hadoop/logs/yarn-root-nodemanager-node2.253.out
node1: starting nodemanager, logging to /root/hadoop/hadoop/logs/yarn-root-nodemanager-node1.out


通过jps可以查看各个节点所启动的进程,如果按照本文的设置,正确启动的话,在node1节点上会看到以下进程:

[root@node1 logs]# jps
15062 NodeManager
14952 ResourceManager
14697 DataNode
3802 JobHistoryServer
15118 Jps
14559 NameNode

我们就可以在相应机器的19888端口上打开历史服务器的WEB UI界面。可以查看已经运行完的作业情况
在这里插入图片描述

4.9 集群启动/停止方式总结

  • 1)各个模块分开启动/停止\常用

​ (1)整体启动/停止HDFS

start-dfs.sh/stop-dfs.sh

​ (2)整体启动/停止YARN

start-yarn.sh/stop-yarn.sh
  • 2)各个服务组件逐一启动/停止

​ (1)分别启动/停止HDFS组件

hdfs --daemon start/stop namenode/datanode/secondarynamenode

​ (2)启动/停止YARN

yarn --daemon start/stop  resourcemanager/nodemanager

(3)单独启动historyserver

[root@node1 hadoop]# mr-jobhistory-daemon.sh start historyserver

4.10 编写Hadoop集群常用脚本

1)Hadoop集群启停脚本(包含HDFS,yarn,Historyserver):myhadoop.sh

#!/bin/bash

 
if [ $# -lt 1 ]

then

  echo "No Args Input..."

  exit ;

fi

 
case $1 in

"start")echo " =================== 启动 hadoop集群 ==================="echo " --------------- 启动 hdfs ---------------"ssh node1 "/opt/module/hadoop-3.1.3/sbin/start-dfs.sh"echo " --------------- 启动 yarn ---------------"ssh node1 "/opt/module/hadoop-3.1.3/sbin/start-yarn.sh"echo " --------------- 启动 historyserver ---------------"ssh node1 "/opt/module/hadoop-3.1.3/bin/mapred --daemon start historyserver"

;;

"stop")echo " =================== 关闭 hadoop集群 ==================="echo " --------------- 关闭 historyserver ---------------"ssh node1 "/opt/module/hadoop-3.1.3/bin/mapred --daemon stop historyserver"echo " --------------- 关闭 yarn ---------------"ssh node1 "/opt/module/hadoop-3.1.3/sbin/stop-yarn.sh"echo " --------------- 关闭 hdfs ---------------"ssh node1 "/opt/module/hadoop-3.1.3/sbin/stop-dfs.sh"

;;

*)

  echo "Input Args Error..."

;;

esac

2)查看三台服务器Java进程脚本:jpsall

#!/bin/bash

 

for host in node1 node2 node3

doecho =============== $host ===============ssh $host jps 

done

4.11 查看web页面

    1. web端查看HDFS文件系统
      http://node1:50070/dfshealth.html#tab-overview
      在这里插入图片描述
      在这里插入图片描述
  • 2.web端查看YARN
    http://node1:8088/cluster
    在这里插入图片描述

  • 3.web端查看SeconddaryNameNode
    http://node2:50090/status.html
    在这里插入图片描述
    如果某个页面无法访问,则说明某个进程启动失败,需要调查

4.12 测试集群

运行词频统计程序的jar包

    1. 准备素材
hdfs dfs -mkdir /BigData
hdfs dfs -ls /
[root@node1 hadoop]# cat test.txt
hello linux world
hello hadoop world
hello hdfs hello yarn
we learn linux
we learn hadoop

hdfs dfs -put test.txt /BigData
hdfs dfs -ls /BigData
cd $HADOOP_HOME/share/hadoop/mapreduce
    1. 执行指令
[root@node1 mapreduce]# hadoop jar ./hadoop-mapreduce-examples-2.10.2.jar wordcount /BigData/test.txt /wc_result5
23/03/30 06:39:43 INFO client.RMProxy: Connecting to ResourceManager at node1/192.168.71.183:8032
23/03/30 06:39:44 INFO input.FileInputFormat: Total input files to process : 1
23/03/30 06:39:45 INFO mapreduce.JobSubmitter: number of splits:1
23/03/30 06:39:45 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1680166854941_0003
23/03/30 06:39:46 INFO conf.Configuration: resource-types.xml not found
23/03/30 06:39:46 INFO resource.ResourceUtils: Unable to find 'resource-types.xml'.
23/03/30 06:39:46 INFO resource.ResourceUtils: Adding resource type - name = memory-mb, units = Mi, type = COUNTABLE
23/03/30 06:39:46 INFO resource.ResourceUtils: Adding resource type - name = vcores, units = , type = COUNTABLE
23/03/30 06:39:46 INFO impl.YarnClientImpl: Submitted application application_1680166854941_0003
23/03/30 06:39:46 INFO mapreduce.Job: The url to track the job: http://node1:8088/proxy/application_1680166854941_0003/
23/03/30 06:39:46 INFO mapreduce.Job: Running job: job_1680166854941_0003
23/03/30 06:39:54 INFO mapreduce.Job: Job job_1680166854941_0003 running in uber mode : false
23/03/30 06:39:54 INFO mapreduce.Job:  map 0% reduce 0%
23/03/30 06:40:05 INFO mapreduce.Job:  map 100% reduce 0%
23/03/30 06:40:07 INFO mapreduce.Job: Task Id : attempt_1680166854941_0003_r_000000_1000, Status : FAILED
Container launch failed for container_1680166854941_0003_02_000003 : org.apache.hadoop.yarn.exceptions.YarnException: Unauthorized request to start container.
This token is expired. current time is 1680182767542 found 1680173406537
Note: System times on machines may be out of sync. Check system time and time zones.
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
        at org.apache.hadoop.yarn.api.records.impl.pb.SerializedExceptionPBImpl.instantiateExceptionImpl(SerializedExceptionPBImpl.java:171)
        at org.apache.hadoop.yarn.api.records.impl.pb.SerializedExceptionPBImpl.instantiateException(SerializedExceptionPBImpl.java:182)
        at org.apache.hadoop.yarn.api.records.impl.pb.SerializedExceptionPBImpl.deSerialize(SerializedExceptionPBImpl.java:106)
        at org.apache.hadoop.mapreduce.v2.app.launcher.ContainerLauncherImpl$Container.launch(ContainerLauncherImpl.java:162)
        at org.apache.hadoop.mapreduce.v2.app.launcher.ContainerLauncherImpl$EventProcessor.run(ContainerLauncherImpl.java:393)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:750)

23/03/30 06:40:17 INFO mapreduce.Job:  map 100% reduce 100%
23/03/30 06:40:18 INFO mapreduce.Job: Job job_1680166854941_0003 completed successfully
23/03/30 06:40:18 INFO mapreduce.Job: Counters: 50
        File System Counters
                FILE: Number of bytes read=98
                FILE: Number of bytes written=424611
                FILE: Number of read operations=0
                FILE: Number of large read operations=0
                FILE: Number of write operations=0
                HDFS: Number of bytes read=189
                HDFS: Number of bytes written=60
                HDFS: Number of read operations=6
                HDFS: Number of large read operations=0
                HDFS: Number of write operations=2
        Job Counters
                Failed reduce tasks=1
                Launched map tasks=1
                Launched reduce tasks=2
                Data-local map tasks=1
                Total time spent by all maps in occupied slots (ms)=8742
                Total time spent by all reduces in occupied slots (ms)=6332
                Total time spent by all map tasks (ms)=8742
                Total time spent by all reduce tasks (ms)=6332
                Total vcore-milliseconds taken by all map tasks=8742
                Total vcore-milliseconds taken by all reduce tasks=6332
                Total megabyte-milliseconds taken by all map tasks=8951808
                Total megabyte-milliseconds taken by all reduce tasks=6483968
        Map-Reduce Framework
                Map input records=5
                Map output records=16
                Map output bytes=154
                Map output materialized bytes=98
                Input split bytes=99
                Combine input records=16
                Combine output records=8
                Reduce input groups=8
                Reduce shuffle bytes=98
                Reduce input records=8
                Reduce output records=8
                Spilled Records=16
                Shuffled Maps =1
                Failed Shuffles=0
                Merged Map outputs=1
                GC time elapsed (ms)=151
                CPU time spent (ms)=2360
                Physical memory (bytes) snapshot=375308288
                Virtual memory (bytes) snapshot=4168269824
                Total committed heap usage (bytes)=161746944
        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=90
        File Output Format Counters
                Bytes Written=60
                
    1. 查看结果
[root@node1 hadoop]# hdfs dfs -ls /wc_result5
Found 2 items
-rw-r--r--   2 root supergroup          0 2023-03-30 06:40 /wc_result5/_SUCCESS
-rw-r--r--   2 root supergroup         60 2023-03-30 06:40 /wc_result5/part-r-00000
[root@node1 hadoop]# hdfs dfs -cat /wc_result5/part-r-00000
hadoop  2
hdfs    1
hello   4
learn   2
linux   2
we      2
world   2
yarn    1

在这里插入图片描述

4.13 启动遇到的问题

如果有某个进程无法启动,则需要查明log,笔者在搭建集群的时候遇到的问题,包括:

1. ResourceManager无法启动

2023-03-30 04:24:03,143 INFO org.apache.hadoop.conf.Configuration: found resource capacity-scheduler.xml at file:/root/hadoop/hadoop/etc/hadoop/capacity-scheduler.xml
2023-03-30 04:24:03,145 ERROR org.apache.hadoop.conf.Configuration: error parsing conf java.io.BufferedInputStream@5884a914
com.ctc.wstx.exc.WstxIOException: Invalid UTF-8 start byte 0x8b (at char #2, byte #-1)
        at com.ctc.wstx.sr.StreamScanner.constructFromIOE(StreamScanner.java:653)
        at com.ctc.wstx.sr.StreamScanner.loadMore(StreamScanner.java:1017)

笔者调查发现配置文件格式不对,打开之后是乱码,重新解包,更新文件后就可以正常启动ResourceManager

  [root@node2 hadoop]#  file /root/hadoop/hadoop/etc/hadoop/capacity-scheduler.xml
/root/hadoop/hadoop/etc/hadoop/capacity-scheduler.xml: gzip compressed data, from Unix, last modified: Tue Mar 28 10:34:33 20					#错误格式

2. OOM

期间由于内存不足OOM,失败了一次,加了交换空间,勉强能跑过去了

[root@node2 hadoop]# dd if=/dev/sda2 of=/opt/swap bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 22.2187 s, 48.3 MB/s
[root@node2 hadoop]# mkswap /opt/swap
mkswap: /opt/swap: warning: wiping old LVM2_member signature.
Setting up swapspace version 1, size = 1048572 KiB
no label, UUID=dc6c2647-8385-4f1c-8be3-eba38f9a7d83
[root@node2 hadoop]# chmod 600 /opt/swap
[root@node2 hadoop]# swapon /opt/swap
[root@node2 hadoop]# free -m
              total        used        free      shared  buff/cache   available
Mem:           1754         618          85           9        1050         967
Swap:          1023           0        1023

3. datanode无法启动

关于个别节点无法启动datanode,参考 【Hadoop 】Hadoop datanode启动不起来的原因总结 解决方案一

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

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

相关文章

【其它】玩一玩无线网桥PicoStation M2

一、无线网桥是什么&#xff1f; 无线网桥就是代替网线实现网络连接的装置。看下面这个场景&#xff0c;摄像头与录像机之间可以直接用网线连接&#xff0c;但遇到两者相距较远的情况&#xff0c;铺设网线成本太高&#xff0c;这时候可以用无线网桥进行连接。无线网桥一般成对…

SSM项目之租赁汽车管理

项⽬描述 汽⻋租赁管理系统&#xff0c;管理系统中不仅有客户的管理还有⻋辆租赁的管理&#xff0c;租赁⻋辆公司对于租⻋的流程&#xff0c;租⻋过程的问题&#xff0c;对于客户的维护及不同维度统计租⻋的情况做数据化管理&#xff0c;⽅便租⻋公司更好的维护⻋辆和⻋辆的信…

易基因: m6A RNA甲基化研究的前期探索性实验思路|干货系列

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 近年来&#xff0c;m6A RNA甲基化作为国家自然科学基金表观遗传学研究的热门领域&#xff0c;相关研究成果层出不穷&#xff0c;高分文章不断。研究方向包括疾病发生发展、发育和分化、环…

误删磁盘恢复方法

一、工具如下&#xff1a;1、磁盘分区恢复工具(分区助手 9.8.0)---链接&#xff1a;https://pan.baidu.com/s/1t3siEwtYZl7XtcNJ8t5oLg 提取码&#xff1a;9tsy2、DiskGenius 磁盘信息查看工具&#xff08;修复要收费&#xff09;&#xff1a;链接&#xff1a;https://pan.baid…

(源码篇02)webpack5中的事件调度系统和NormalModuleFactary核心逻辑

1. 书接上回&#xff0c;从 this.factorizeQueue.add(options, callback); 开始 不是很清楚上下文的兄弟&#xff0c;可以去看下我之前写的 &#xff08;源码篇01&#xff09;浅析webpack5中Compiler中重要的hook调用过程。 此文比较干&#xff0c;各位读者开始阅读前&#xf…

反射器和Spring中的IOC/DI

1.什么是反射 1&#xff09;Java反射机制的核心是在程序运行时动态加载类并获取类的详细信息&#xff0c;从而操作类或对象的属性和方法。本质是JVM得到class对象之后&#xff0c;再通过class对象进行反编译&#xff0c;从而获取对象的各种信息。 2&#xff09;Java属于先编译…

LC-1637. 两点之间不包含任何点的最宽垂直区域(模拟)

1637. 两点之间不包含任何点的最宽垂直区域 难度中等25 给你 n 个二维平面上的点 points &#xff0c;其中 points[i] [xi, yi] &#xff0c;请你返回两点之间内部不包含任何点的 最宽垂直区域 的宽度。 垂直区域 的定义是固定宽度&#xff0c;而 y 轴上无限延伸的一块区域…

户外徒步用什么耳机好?户外运动耳机推荐

作为一个徒步爱好者&#xff0c;在长时间的户外行走的途中自然会准备一个耳机来陪伴我。市面上各种运动型耳机层出不穷&#xff0c;价格也从几十到上千不等。但是喜爱的运动项目不同对运动耳机的需求也不一样。今天我们就来盘带点一下市面上各产品的性能参数&#xff0c;哪一款…

如何理解文件描述符和文件指针,两者的区别和联系?

下面是一些预备的知识&#xff1a; 我们先来回顾一下这张图 如果你对此图并不了解&#xff0c;甚至完全都知道这张图&#xff0c;那么下面的内容了解起来可能并不容易。 第一&#xff0c;首先我们要明确的认识一点&#xff0c;文件流指针是各种语言对系统调用接口的封装&…

代码随想录算法训练营第四十二天 | 416. 分割等和子集

背包问题之01背包问题基础&#xff1a; 视频讲解 &#xff08;一&#xff09;常见要求&#xff1a; 有n件物品&#xff0c;每个物品只有一个&#xff0c;和一个最多能背重量为w 的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品只能用一次&a…

【操作系统】模块六 :文件系统 (Linux文件目录 | 文件系统 | B树 B+树 |分布式文件系统)

文章目录【操作系统】模块六 &#xff1a;文件系统Linux的文件目录分区结构挂载目录结构/usr&#xff08;Unix System Resource&#xff09; 包含系统需要的资源文件&#xff0c;通常应用程序会把后来安装的可执行文件 也放到这个目录下&#xff0c;比如说文件系统底层设计 FAT…

树莓派学习笔记(十二)Linux驱动认知及编译加载驱动

文章目录一、Linux驱动认知二、内核空间1、如何找到相关的驱动2、主设备号和次设备号3、驱动链表&#xff1a;管理所有设备的驱动4、驱动插入链表的顺序由设备号检索5、驱动代码的开发三、驱动编写、编译、测试四、驱动阶段性总结一、Linux驱动认知 Linux驱动分为用户空间、内…

TCP网络事件模型的封装2.0

TCP网络事件模型的封装2.0 最近学习了TCP网络模型的封装&#xff0c;其中运用的封装技术个人感觉有点绕 在反复读代码、做思维导图下初步理解了这套封装模型&#xff0c;不禁感叹原来代码还能这样写&#xff1f;神奇&#xff01; 为此将源码分享出来并将流程图画出&#xff…

FITC-PEG-SH,荧光素-聚乙二醇-巯基的用途:用于修饰氨基酸,蛋白质等

FITC-PEG-SH 荧光素聚乙二醇巯基 英文名称&#xff1a;Fluorescein (polyethylene glycol)Thiol 中文名称&#xff1a;荧光素聚乙二醇巯基 外观: 黄色液体、半固体或固体&#xff0c;取决于分子量。 溶剂&#xff1a;溶于水等其他常规性有机溶剂 激光/发射波长&#xff1a…

ChatGPT使用案例之自然语言处理

ChatGPT使用案例之自然语言处理 自然语言处理被誉为“人工智能皇冠上的明珠”&#xff0c;这句话就已经说明了自然语言处理在整个人工智能体系中的重要性&#xff0c;自然语言处理&#xff08;Natural Language Processing&#xff0c;NLP&#xff09;是一种涉及计算机和人类自…

联想小新 青春版-14笔记本电脑重装系统教程

在使用笔记本电脑的过程中&#xff0c;我们难免会遇到一些问题&#xff0c;比如系统崩溃、病毒感染等等。这时候&#xff0c;我们就需要重装系统来解决这些问题。而联想小新 青春版-14笔记本电脑的系统重装方法&#xff0c;就是我们需要掌握的技能之一。本文将详细介绍如何重装…

python怎么自学

其实0基础选择python学习入行的不在少数&#xff0c;Python近段时间一直涨势迅猛&#xff0c;在各大编程排行榜中崭露头角&#xff0c;得益于它多功能性和简单易上手的特性&#xff0c;让它可以在很多不同的工作中发挥重大作用。 正因如此&#xff0c;目前几乎所有大中型互联网…

element-plus官网访问太慢 下载文档到本地部署 实现快速查阅

我只是吐槽下 element基于githup pages这个部署文档地址 本来访问就慢,然后吧这个文档看的人还很多,导致更慢了 经常卡半天才出来文档地址 文档地址: https://github.com/element-plus/element-plus/tree/gh-pages 文档的地址(你直接下载下来 想跑起来的话可能需要更改文档的路…

【C++】IO流 + 空间配置器(了解)

文章目录&#x1f4d6; 前言1. IO流1.1 C语言的输入和输出&#xff1a;1.2 流的概念及特性&#xff1a;1.3 自定义类型隐式类型转换&#xff1a;1.4 在线OJ中的输入和输出&#xff1a;1.5 CIO流对文件的操作&#xff1a;1.6 stringstream介绍&#xff1a;2. 空间配置器2.1 什么…

安科瑞智能照明控制系统在工厂的应用

安科瑞 安科瑞 李亚娜 1&#xff5c;概述 安科瑞智能照明控制解决方案ALIBUS&#xff08;Acrel Lighting intelligent Bus&#xff09;基于成熟的RS485通讯控制技术&#xff0c;同时创新地引入了载波侦听和冲突碰撞检测机制&#xff0c;多机间实现了实时双向通讯&#xff0c;线…