Hive4.0.1集群安装部署(Hadoop版本为3.3.6)(详细教程)

前置环境

​​​Linux环境Zookeeper集群安装(详细教程)-CSDN博客

Hadoop HA高可用集群3.3.6搭建(详细教程)-CSDN博客

MySQL8.0.40离线安装(详细教程)_mysql 8.0.40 ftp-CSDN博客

Hadoop3.3.6官网下载链接地址

部署规划

服务器节点

MetaStore

HiveServer2

bigdata01

bigdata02

bigdata03

1.先在bigdata01解压安装(先配置一个节点再分发)

# 解压到/opt目录下
tar -zxvf /opt/apk/apache-hive-4.0.1-bin.tar.gz -C /opt

# 创建软链接
ln -s /opt/apache-hive-4.0.1-bin /opt/apps/hive

# 添加环境变量
vi /etc/profile.d/my_env.sh
### 在my_env.sh中添加以下内容
# HIVE_HOME
export HIVE_HOME=/opt/apps/hive
export PATH=$PATH:$HIVE_HOME/bin

# 同步配置环境到其他节点,并生效
xsync -i "bigdata02 bigdata03" /etc/profile.d/my_env.sh
xcall source /etc/profile

2.上传MySQL8.0驱动jar包

MySQL8.0驱动下载链接: 百度网盘 请输入提取码 提取码: chxd 复制这段内容后打开百度网盘手机App,操作更方便哦 --来自百度网盘超级会员v6的分享

# 将下载的jar包添加到目录$HIVE_HOME/hive/lib下
[root@bigdata01 apk]# cp mysql-connector-java-8.0.16.jar $HIVE_HOME/hive/lib

# 查看hadoop下的guava版本
[root@bigdata01 lib]# ll /opt/apps/hadoop/share/hadoop/common/lib |grep guava
-rw-r--r--. 1 hadoop hadoop 2747878 Jan  4 14:55 guava-27.0-jre.jar
-rw-r--r--. 1 hadoop hadoop 3362359 Jan  4 14:55 hadoop-shaded-guava-1.1.1.jar
-rw-r--r--. 1 hadoop hadoop    2199 Jan  4 14:55 listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar

# 查看hive下的guava版本,发现不一致
[root@bigdata01 lib]# ll /opt/apps/hive/lib |grep guava
-rw-r--r--. 1 root root  2575022 Sep 25 15:52 guava-22.0.jar

# 删除hive的guava,复制hadoop的到hive
[root@bigdata01 lib]# cp /opt/apps/hadoop/share/hadoop/common/lib/guava-27.0-jre.jar /opt/apps/hive/lib/
[root@bigdata01 lib]# mv /opt/apps/hive/lib/guava-22.0.jar /opt/apps/hive/lib/guava-22.0.jar_bak

3.进入bigdata04(数据库服务器)

[root@bigdata04 ~]# mysql -uroot -p
mysql> create user 'hive'@'%' identified by 'Lucky@#998**';
Query OK, 0 rows affected (0.02 sec)

mysql> GRANT ALL PRIVILEGES ON hive.* TO 'hive'@'%';  -- 授权hive用户hive数据库所有权限
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;   -- 刷新权限生效
Query OK, 0 rows affected (0.00 sec)

mysql> quit;
Bye

4.配置日志组件(bigdata01)

# 创建日志目录 
mkdir -p /opt/apps/hive/logs

# 拷贝默认文件 
cp /opt/apps/hive/conf/hive-log4j2.properties.template /opt/apps/hive/conf/hive-log4j2.properties

# 修改日志配置文件 
vi /opt/apps/hive/conf/hive-log4j2.properties
# 找到日志的位置,修改如下:
property.hive.log.dir = /opt/apps/hive/logs

5.回到bigdata01配置hive(先配置一个节点再分发)

# Hive配置文件里要用到HDFS的一些路径,需要先手动创建
hdfs dfs -mkdir -p /usr/hive/{warehouse,tmp,log}
hdfs dfs -chmod g+w /usr/hive/

进入Hive的配置目录: cd /opt/apps/hive/conf/

5.1配置hive环境变量

配置hive-env.sh

export HADOOP_HOME=/opt/apps/hadoop
export HIVE_CONF_DIR=/opt/apps/hive/conf
export HIVE_AUX_JARS_PATH=/opt/apps/hive/lib
export JAVA_HOME=/opt/apps/java

配置hive-site.xml

<configuration>
  <!--  ################# MetaStore相关配置 ################# -->
  <!-- 数据库地址,名称 -->
  <property>
    <name>javax.jdo.option.ConnectionURL</name>
    <value>jdbc:mysql://bigdata04:3306/hive?createDatabaseIfNotExist=true&amp;serverTimezone=GMT%2B8&amp;useSSL=false&amp;allowPublicKeyRetrieval=true</value>
  </property>
  <!-- 数据库连接用户 -->
  <property>
    <name>javax.jdo.option.ConnectionUserName</name>
    <value>hive</value>
  </property>
  <!-- 数据库连接密码 -->
  <property>
    <name>javax.jdo.option.ConnectionPassword</name>
    <value>Lucky@#998**</value>
  </property>
  <property>
    <name>hive.metastore.schema.verification</name>
    <value>false</value>
  </property>
  <!-- 显示数据库名称 -->
  <property>
    <name>hive.cli.print.current.db</name>
    <value>true</value>
  </property>
  <!--显示表的列名 -->
  <property>
    <name>hive.cli.print.header</name>
    <value>true</value>
  </property>

  <!-- MetaStore 高可用 -->
  <property>
    <name>hive.metastore.uris</name>
    <value>thrift://bigdata01:9083,thrift://bigdata02:9083</value>
  </property>

  <!-- hdfs 上 Hive元数据存放的位置 -->
  <property>
  	<name>hive.metastore.warehouse.dir</name>
  	<value>/usr/hive/warehouse</value>
  </property>
   
  <!-- Hive作业的HDFS根目录位置 -->
  <property>
  	<name>hive.exec.scratchdir</name>
  	<value>/usr/hive/tmp</value>
  </property>
  <!-- Hive作业的HDFS根目录创建权限 -->
  <property>
  	<name>hive.scratch.dir.permission</name>
  	<value>775</value>
  </property>

  <!-- ####################### HiveServer2相关配置 ######################## -->
  <property>
    <name>hive.server2.support.dynamic.service.discovery</name>
    <value>true</value>
  </property>
  <property>
    <name>hive.server2.zookeeper.namespace</name>
    <value>hiveserver2_zk</value>
  </property>

  <property>
    <name>hive.zookeeper.quorum</name>
    <value>bigdata01:2181,bigdata02:2181,bigdata03:2181</value>
  </property>

  <property>
    <name>hive.zookeeper.client.port</name>
    <value>2181</value>
  </property>
  <property>
    <name>hive.server2.thrift.bind.host</name>
    <value>bigdata01</value>
  </property>

  <property>
    <name>hive.server2.thrift.port</name>
    <value>10001</value>
  </property>
</configuration>

5.2 需修改hadoop 配置(安装hadoop时已配置,可跳过)

在hadoop安装目录下的core-site.xml中,需要开启hadoop代理用户配置

<property>
	<name>hadoop.proxyuser.root.hosts</name>
	<value>*</value>
</property>
 
<property>
	<name>hadoop.proxyuser.root.groups</name>
	<value>*</value>
</property>

<property>
	<name>hadoop.proxyuser.root.users</name>
	<value>*</value>
</property>

5.3初始化元数据库

配置完metastore-site.xml,需要先初始化hive元数据库,选择在一台节点初始化即可

schematool -initSchema -dbType mysql -verbose

5.4 启动metastore(规划为bigdata01、bigdata02部署)

# 先把hive整体同步到bigdata02、bigdata03
[root@bigdata01 apps]# xsync -i "bigdata02 bigdata03" /opt/apps/hive
[root@bigdata01 apps]# xsync -i "bigdata02 bigdata03" /opt/apache-hive-4.0.1-bin/



# 修改bigdata02,bigdata03中的hiveserver2服务的配置,再启动
[root@bigdata02 conf]# vi /opt/apps/hive/conf/hive-site.xml
<!-- 修改值为bigdata02,其余节点以此类推 -->
<!-- 指定metastore连接地址 -->
<property>
    <name>hive.server2.thrift.bind.host</name>
    <value>bigdata02</value>
</property>


# 希望哪台服务器配置元数据库服务,就在那台执行hive --service metastore >> $HIVE_HOME/logs/metastore.log 2>&1 &
# 可查看端口9083是否占用判断启动成功,xcall -i "bigdata01 bigdata02" "ss -nptl |grep 9083"
# 以下是bigdata01 bigdata02都执行启动
[root@bigdata01 apps]# xcall -i "bigdata01 bigdata02" "hive --service metastore >> $HIVE_HOME/logs/metastore.log 2>&1 &"

5.5 启动hiveserver2服务 (规划为bigdata02、bigdata03部署)

分别在bigdata02 、bigdata03启动

# 可查看端口10001是否占用判断启动成功,xcall -i "bigdata02 bigdata03" "ss -nptl |grep 10001"
[root@bigdata01 apps]# xcall -i "bigdata02 bigdata03" "hive --service hiveserver2 >> $HIVE_HOME/logs/hiveserver2.log 2>&1 &"

5.6访问zk

[root@bigdata02 conf]# zkCli.sh -server bigdata01:2181
[zk: localhost:2181(CONNECTED) 1] ls /
[hadoop-ha, hiveserver2_zk, killQueries, rmstore, yarn-leader-election, zookeeper]
[zk: localhost:2181(CONNECTED) 2] ls /h
hadoop-ha        hiveserver2_zk   
[zk: localhost:2181(CONNECTED) 2] ls /hiveserver2_zk 
[serverUri=bigdata01:10001;version=4.0.1;sequence=0000000003, serverUri=bigdata02:10001;version=4.0.1;sequence=0000000002]

6.使用hive客户端

hive4.0已经弃用默认的Hive Cli

使用命令hive或者beeline

6.1客户端连接

[root@bigdata03 conf]# hive
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/opt/apache-hive-4.0.1-bin/lib/log4j-slf4j-impl-2.18.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/opt/hadoop-3.3.6/share/hadoop/common/lib/slf4j-reload4j-1.7.36.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/opt/apache-hive-4.0.1-bin/lib/log4j-slf4j-impl-2.18.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/opt/hadoop-3.3.6/share/hadoop/common/lib/slf4j-reload4j-1.7.36.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]
Beeline version 4.0.1 by Apache Hive
beeline> 

连接方式一:

!connect jdbc:hive2://bigdata01:10001

连接方式二:

!connect jdbc:hive2://bigdata01:2181,bigdata02:2181,bigdata03:2181/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2_zk root

6.2 访问hiveserver2的web页面

部署了hiveserver2的服务器均可访问

http://bigdata02:10002/ 或者 http://bigdata03:10002/

7.关闭hive集群

hive本身没有直接关停服务的命令,可以通过端口进程的方式进行关闭。两个RunJar分别为metastore、hiveserver2的进程,可以通过“kill -9 进程号”进行关停

附录

附录一、hive集群一键启停脚本

连接方式一:

!connect jdbc:hive2://bigdata01:10001

连接方式二:

!connect jdbc:hive2://bigdata01:2181,bigdata02:2181,bigdata03:2181/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2_zk root

退出命令 !quit 或者 !exit

#!/bin/bash
# chmod a+x /usr/local/bin/hiveCluster
if [ $# -lt 1 ]
then
    echo "No Args Input!"
    exit;
fi

case $1 in
"start")
        echo -e "\n================= 启动 hive 高可用集群 ================="
        echo " ------------------- 启动 metastore 服务集群 --------------------"
        echo "Starting metastore on [bigdata01]"
        ssh bigdata01 "hive --service metastore >> $HIVE_HOME/logs/metastore.log 2>&1 &"
        echo "Starting metastore on [bigdata02]"
        ssh bigdata02 "hive --service metastore >> $HIVE_HOME/logs/metastore.log 2>&1 &"
        sleep 4
        echo " ------------------- 启动 hiveserver2 服务集群 --------------------"
        echo "Starting hiveserver2 on [bigdata02]"
        ssh bigdata02 "hive --service hiveserver2 >> $HIVE_HOME/logs/hiveserver2.log 2>&1 &"
        echo "Starting hiveserver2 on [bigdata03]"
        ssh bigdata03 "hive --service hiveserver2 >> $HIVE_HOME/logs/hiveserver2.log 2>&1 &"
      	sleep 2
  echo -e "\n"
;;
"stop")
        echo -e "\n================= 关闭 hive 高可用集群 ================="
        echo " ------------------- 关闭 hiveserver2 服务集群 --------------------"
        echo "Stopping hiveserver2 on [bigdata02]"
        ssh bigdata02 "ss -nptl | grep 10001 | awk '{print \$6}' | awk -F'pid=' '{print \$2}' | awk -F',' '{print \$1}' | xargs -r kill"
        echo "Stopping hiveserver2 on [bigdata03]"
        ssh bigdata03 "ss -nptl | grep 10001 | awk '{print \$6}' | awk -F'pid=' '{print \$2}' | awk -F',' '{print \$1}' | xargs -r kill"

        # 等待4秒
        sleep 4
        
        echo " ------------------- 关闭 metastore 服务集群 --------------------"
        echo "Stopping metastore on [bigdata01]"
        ssh bigdata01 "ss -nptl | grep 9083 | awk '{print \$6}' | awk -F'pid=' '{print \$2}' | awk -F',' '{print \$1}' | xargs -r kill"
        echo "Stopping metastore on [bigdata02]"
        ssh bigdata02 "ss -nptl | grep 9083 | awk '{print \$6}' | awk -F'pid=' '{print \$2}' | awk -F',' '{print \$1}' | xargs -r kill"
	echo -e "\n"
;;
"status")
    echo -e "\n================= 检查 hive 高可用集群状态 ================="
    echo " ------------------- 检查 metastore 服务状态 --------------------"
    echo "Checking metastore on [bigdata01]"
    ssh bigdata01 "ss -tuln | grep :9083" > /dev/null
    if [ $? -eq 0 ]; then
        echo "metastore on bigdata01 is running."
    else
        echo "metastore on bigdata01 is not running."
    fi

    echo "Checking metastore on [bigdata02]"
    ssh bigdata02 "ss -tuln | grep :9083" > /dev/null
    if [ $? -eq 0 ]; then
        echo "metastore on bigdata02 is running."
    else
        echo "metastore on bigdata02 is not running."
    fi

    echo " ------------------- 检查 hiveserver2 服务状态 --------------------"
    echo "Checking hiveserver2 on [bigdata02]"
    ssh bigdata02 "ss -tuln | grep :10001" > /dev/null
    if [ $? -eq 0 ]; then
        echo "hiveserver2 on bigdata02 is running."
    else
        echo "hiveserver2 on bigdata02 is not running."
    fi

    echo "Checking hiveserver2 on [bigdata03]"
    ssh bigdata03 "ss -tuln | grep :10001" > /dev/null
    if [ $? -eq 0 ]; then
        echo "hiveserver2 on bigdata03 is running."
    else
        echo "hiveserver2 on bigdata03 is not running."
    fi
    echo -e "\n"
    ;;
*)
    echo "Input Args Error!"
;;
esac

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

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

相关文章

Windows安装ES单机版设置密码

下载ES ES下载链接 我用的是7.17.26 启动前配置 解压之后打开D:\software\elasticsearch-7.17.26\bin\elasticsearch-env.bat 在elasticsearch-env.bat文件中修改jdk的路径 修改前 修改内容 if defined ES_JAVA_HOME (set JAVA"D:\software\elasticsearch-7.17.26\…

Wireshark抓包教程(2024最新版个人笔记)

改内容是个人的学习笔记 Wireshark抓包教程&#xff08;2024最新版&#xff09;_哔哩哔哩_bilibili 该课程笔记1-16 wireshark基础 什么是抓包工具&#xff1a;用来抓取数据包的一个软件 wireshark的功能&#xff1a;用来网络故障排查&#xff1b;用来学习网络技术 wireshark下…

云平台一键部署【Video-Background-Removal】视频换背景,无任何限制,随意换

Video-Background-Removal 是一款革命性的视频背景替换工具&#xff0c;旨在让用户轻松实现视频背景的快速更换。无论你是专业创作者还是普通用户&#xff0c;这款软件都能让你在几秒钟内改变背景&#xff0c;完全消除限制&#xff0c;随心所欲&#xff0c;随时随地想换就换&am…

2025年,华为认证HCIA、HCIP、HCIE 该如何选择?

眼看都到 2025 年啦&#xff0c;华为认证还吃香不&#xff1f; 把这问题摆在每个网络工程师跟前&#xff0c;答案可没那么容易说清楚。 到底考不考它值当不值当&#xff0c;重点在于您自己的职业规划&#xff0c;还有对行业走向的领会。 2025 年华为认证仍然值得一考&#…

使用 Docker 部署 Java 项目(通俗易懂)

目录 1、下载与配置 Docker 1.1 docker下载&#xff08;这里使用的是Ubuntu&#xff0c;Centos命令可能有不同&#xff09; 1.2 配置 Docker 代理对象 2、打包当前 Java 项目 3、进行编写 DockerFile&#xff0c;并将对应文件传输到 Linux 中 3.1 编写 dockerfile 文件 …

学习threejs,使用TrackballControls相机控制器

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.TrackballControls 相…

C# OpenCV机器视觉:转速测量

在一个看似平常却又暗藏神秘能量的日子里&#xff0c;阿杰正在他那充满科技感的实验室里&#xff0c;对着一堆奇奇怪怪的仪器发呆。突然&#xff0c;手机铃声如一道凌厉的剑气划破寂静&#xff0c;原来是工厂的赵厂长打来的紧急电话&#xff1a;“阿杰啊&#xff0c;咱们工厂新…

机器视觉4-损失函数与梯度计算

机器视觉4-损失函数与梯度计算 损失函数定义公式及变量含义整体理解 多类支撑向量机损失正则项与超参数什么是超参数一、与模型参数的区别二、常见的超参数三、调参方法 什么是优化一、参数优化的重要性二、利用损失函数进行反馈三、调整分类器参数的方法 优化的目标一、最小化…

网络安全-RSA非对称加密算法、数字签名

数字签名非常普遍&#xff1a; 了解数字签名前先了解一下SHA-1摘要&#xff0c;RSA非对称加密算法。然后再了解数字签名。 SHA-1 SHA-1&#xff08;secure hash Algorithm &#xff09;是一种 数据加密算法。该算法的思想是接收一段明文&#xff0c;然后以一种不可逆的方式将…

Lianwei 安全周报|2025.1.13

新的一周又开始了&#xff0c;以下是本周「Lianwei周报」&#xff0c;我们总结推荐了本周的政策/标准/指南最新动态、热点资讯和安全事件&#xff0c;保证大家不错过本周的每一个重点&#xff01; 政策/标准/指南最新动态 01 美国国土安全部发布《公共部门生成式人工智能部署手…

LabVIEW部署Web服务

目录 LabVIEW部署Web服务1、创建项目2、创建Web服务3、新建WebVI3.1、使用GET方法3.2、使用POST方法 4、 部署和对应URL4.1、应用程序&#xff1a;80804.2、本地调试&#xff1a;80094.3、NI Web服务器&#xff1a;9090(禁用) 5、测试5.1、测试GET方法5.2、测试POST方法 6、实际…

初阶数据结构【栈及其接口的实现】

目录 前言一、栈的概念及结构二、栈的实现方式三、栈的实现3.1 基本结构3.2 栈的基本功能接口栈的初始化栈的销毁 3.3 入栈接口3.4 出栈接口3.5 栈的其它接口获取数据的个数接口栈判断是否为空接口获取栈顶数据接口 注&#xff1a;为什么要实现这些简单的接口&#xff0c;直接调…

基于Java+SpringBoot+Vue的前后端分离的体质测试数据分析及可视化设计

基于JavaSpringBootVue的前后端分离的体质测试数据分析及可视化设计 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末附源码…

Github配置ssh key,密钥配对错误怎么解决?

解决密钥配对的方案如下&#xff1a; 方法一、最有效的方案&#xff1a;重新配置&#xff0c;验证 SSH 密钥是否已添加到 GitHub 确保您的 SSH 密钥已经正确添加到了 GitHub 账户中。您可以打开命令行控制台&#xff08;cmd/powerShell都可以&#xff09;&#xff0c;按照以下…

HarmonyOS鸿蒙开发 弹窗及加载中指示器HUD功能实现

HarmonyOS鸿蒙开发 弹窗及加载中指示器HUD功能实现 最近在学习鸿蒙开发过程中&#xff0c;阅读了官方文档&#xff0c;在之前做flutter时候&#xff0c;经常使用overlay&#xff0c;使用OverlayEntry加入到overlayState来做添加悬浮按钮、提示弹窗、加载中指示器、加载失败的t…

STL之VectorMapList针对erase方法踩坑笔记

前沿 如下总结的三种容器&#xff0c;开头都会涉及当前容器的特点&#xff0c;再者就本次针对erase方法的使用避坑总结。 一.Vector vector关联关联容器&#xff0c;存储内存是连续&#xff0c;且特点支持快速访问&#xff0c;但是插入和删除效率比较地(需要找查找和移动)。另…

【Rust】引用与借用

目录 思维导图 1. 引用与借用的基本概念 1.1. 引用示例 2. 借用的规则 2.1. 可变借用示例 2.2. 借用的限制 3. 引用的生命周期 思维导图 1. 引用与借用的基本概念 引用的定义&#xff1a;引用是一种指向数据的指针&#xff0c;但与裸指针不同&#xff0c;Rust的引用在编…

《自动驾驶与机器人中的SLAM技术》ch8:基于 IESKF 的紧耦合 LIO 系统

紧耦合系统&#xff0c;就是把点云的残差方程直接作为观测方程&#xff0c;写入观测模型中。这种做法相当于在滤波器或者优化算法内置了一个 ICP 或 NDT。因为 ICP 和 NDT 需要迭代来更新它们的最近邻&#xff0c;所以相应的滤波器也应该使用可以迭代的版本&#xff0c;ESKF 对…

Mac 删除ABC 输入法

参考链接&#xff1a;百度安全验证 Mac下删除系统自带输入法ABC&#xff0c;正解&#xff01;_mac删除abc输入法-CSDN博客 ABC 输入法和搜狗输入法等 英文有冲突~~ 切换后还会在英文状态&#xff0c;可以删除 &#xff1b;可能会对DNS 输入有影响&#xff0c;但是可以通过复…

1.13 多线程编程

1.思维导图 2.创建两个子进程&#xff0c;父进程负责&#xff1a;向文件中写入数据&#xff1b;两个子进程负责&#xff1a;从文件中读取数据。 要求&#xff1a;一定保证1号子进程先读取&#xff0c;2号子进程后读取&#xff0c;使用文件IO去实现。 1>程序代码 …