Centos7 离线安装 CDH7.1.7

1. 安装CDH的准备工作(所有节点都要执行)

1.1 准备环境

角色

IP

k8s-master

192.168.181.129

k8s-node1

192.168.181.130

k8s-node2

192.168.181.131

1.2 安装JDK

# https://www.oracle.com/java/technologies/downloads/#java11
wget 
rpm -ivh jdk-11.0.21_linux-x64_bin.rpm$. vi /etc/profile
JAVA_HOME=/usr/java/jdk-11/
CLASSPATH=.:$JAVA_HOME/lib/jrt-fs.jar
PATH=$JAVA_HOME/bin:$HOME/bin:$HOME/.local/bin:$PATH

1.3 更改主机名和hosts

# 更改3台主机hostname,每个主机上按ip递增的顺序,分别执行下面一条命令:# echo "bigdata01.dpcg.com" > /etc/hostname
# echo "bigdata02.dpcg.com" > /etc/hostname
# echo "bigdata03.dpcg.com" > /etc/hostname# ===================================================== # 
# 在3台机器中分别执行如下命令:
# echo "10.101.15.229    bigdata01.dpcg.com    bigdata01" >> /etc/hosts
# echo "10.101.15.230    bigdata02.dpcg.com    bigdata02" >> /etc/hosts
# echo "10.101.15.231    bigdata03.dpcg.com    bigdata03" >> /etc/hosts# use 
cat >> /etc/hosts << EOF
192.168.31.52 cdh-master-52 cdh-master-52.com
192.168.31.53 cdh-node1-53 cdh-node1-53.com
192.168.31.54 cdh-node2-54 cdh-node2-54.com
192.168.31.55 cdh-node3-55 cdh-node3-55.com
EOF

1.4 关闭防火墙

并重启服务器使hostname和selinux的配置生效

$. systemctl stop firewalld
$. systemctl disable firewalld
$. systemctl status firewalld
$. sed -i "s/SELINUX=enforcing/SELINUX=disabled/" /etc/selinux/config$. getenforce
$. sestatus -v

1.5 安装NTP服务

#在所有节点
$. yum -y install ntp# 在master节点,注释掉原有的server指向把时间服务器的域名地址指向一个靠谱可连的时间服务器,
# 我选择的是ntp.api.bz.
$. vi /etc/ntp.conf……# 添加修改上层时间服务器,如果能联通外网,则不需要修改server 0.centos.pool.ntp.org iburstserver 1.centos.pool.ntp.org iburstserver 2.centos.pool.ntp.org iburstserver 3.centos.pool.ntp.org iburst# server ntp.api.gz iburst
......# 在其余的节点上,把时间服务器的server指向master namenode节点
$. vi /etc/ntp.conf……#server 0.centos.pool.ntp.org iburst#server 1.centos.pool.ntp.org iburst#server 2.centos.pool.ntp.org iburst#server 3.centos.pool.ntp.org iburstserver 172.17.28.1 iburst
......# 在所有节点
systemctl enable ntpd --now
systemctl status ntpd
systemctl start ntpd
systemctl restart ntpd#查询上级服务时间
[root@localhost etc]# ntpq -p#查看时间同步状态 
[root@localhost etc]# ntpstat

1.6 关闭透明大页

echo "echo never > /sys/kernel/mm/transparent_hugepage/enabled" >> /etc/rc.local
echo "echo never > /sys/kernel/mm/transparent_hugepage/defrag" >> /etc/rc.local

1.7 磁盘写进fstab

lsblk -f | egrep '\/[a-z]+' | awk '{print "UUID="$(NF-1)"\t"$NF"\t"$(NF-2)"\t""defaults,noatime""\t""0 0"}'| sort -k2 >> /etc/fstab 

1.8 其它调优

1. 设置最大可大开文件数* soft nofile 10240* hard nofile 10240* soft nproc 65565* hard nproc 655652. TCP连接优化# 查看连接数(一般默认1024)netstat -an|wc -l# 查看连接数范围cat /proc/sys/net/ipv4/ip_local_port_range# 打开 vi /etc/sysctl.conf 文件后在文件末尾加上如下配置:  $. vi /etc/sysctl.confnet.ipv4.tcp_syncookies = 1net.ipv4.tcp_tw_reuse = 1net.ipv4.tcp_tw_recycle = 1net.ipv4.tcp_fin_timeout = 30# 端口范围net.ipv4.ip_local_port_range = 1024 65000或者执行:echo net.ipv4.ip_local_port_range = 1024 65000 >> /etc/sysctl.confecho "net.ipv4.ip_forward=1" >>/etc/sysctl.conf# 验证, 输入命令: sysctl net.ipv4.ip_forward, 返回为1即可# 通过命令行设置: sysctl -w net.ipv4.ip_forward=1net.ipv4.ip_forward = 1# 执行生效即可        sysctl -p# ============================================================ # 
# 永久关闭Swap步骤: 
1. swapoff -a # 临时关闭
2. 永久关闭编辑/etc/fstab文件, 使用文本编辑器打开该文件: vi /etc/fstab在文件中找到含有swap的行, 并在行首添加#注释符, 以将其注释掉。例如: # /dev/mapper/centos-swap swap               swap    defaults        0 0或者是# UUID=<swap分区的UUID>       none     swap    sw          0 0保存并关闭文件。重新启动系统。reboot3. 执行以下命令来验证Swap是否已经被禁用: free -h现在, Swap已经被永久关闭了。

2. CDH版本选择

old:
CDH版本选择:建议5.4.8和5.8.0版本,如需要版本较高可以选择5.12版本,目前6.x版本还没有使用过,请注意,千万不要选择5.11.0版本。
这里选择最新版本6.3.2。
在CDH5版本中,JDK一般安装为JDK8,还需要安装python环境,可以选择python2.6.X或者python2.7.x都可以。

now:

最新版本为:Index of cm6/6.3.1/redhat7/yum/RPMS/x86_64/

https://www.cloudera.com/downloads.html

3. CDH的安装方式选择

方式一: rpm包安装:

  • 先离线下载rpm文件,再进行安装,安装过程中会下载相应的依赖,比较稳定,但安装要求较高。
  • 此安装方式开始配置时较麻烦,但之后安装很方便,建议使用,具体安装方式请参考上述相关文章链接中的第五章CDH的安装和部署。

方式二: bin文件安装:

  • 通过bin文件安装一般用于在线安装,对网络要求比较高,如果现在过程中网络中断会造成安装失败,但此方法安装简单,全程傻瓜式安装。
  • bin文件安装参考网址:https://www.cnblogs.com/ljy2013/p/4662191.html   https://www.cnblogs.com/leocook/p/cdh_management.html
  • 此方法为去http://archive.cloudera.com/cm5/installer/latest/cloudera-manager-installer.bin 中下载bin文件,再执行bin文件进行安装。

方式三: tar包安装

不是很了解tar包的安装方式,但使用tar包安装会有依赖未安装而造成安装失败的异常,不建议使用。

4. CDH的下载

4.1. cm的tar包下载

cm6.3.1下载地址:https://archive.cloudera.com/cm6/6.3.1/repo-as-tarball/

下载allkeys.asc文件:

4.2. parcels包下载

cdh6.3.2下载地址:https://archive.cloudera.com/cdh6/6.3.2/parcels/

请选择对应的版本,el7,并将后缀.sha1更改为.sha。

5. 配置CDH的离线安装

目的:将上述下载的4个文件上传到centos7服务器中,并配置好离线服务,安装时即可以从该离线服务中下载,不需要再从官网中去下载,防止网络错误。

5.1 在master节点上安装httpd

# 查看该centos7是否存在httpd服务
rpm -qa|grep httpd# 如果不存在该服务就安装
yum install -y httpd# 启动该服务
systemctl start httpd.service #启动
systemctl stop httpd.service #停止
systemctl restart httpd.service #重启# 设置该服务是否开机启动
systemctl enable httpd.service #开机启动
systemctl disable httpd.service #开机不启动# 查看该服务的状态
systemctl status httpd.service

当访问该服务器的80端口出现如下画面即为安装和启动成功

5.2 创建 parcels文件

# 在/var/www/html下创建一个parcels文件夹,并将上述下载的3个文件上传到该目录下
cd /var/www/html/
mkdir cdh6.3.2/parcels -p
# 上传如下3个文件
CDH-6.3.2-1.cdh6.3.2.p0.1605554-el7.parcel
CDH-6.3.2-1.cdh6.3.2.p0.1605554-el7.parcel.sha
manifest.json# 校验文件下载未损坏
/usr/bin/sha1sum CDH-6.3.2-1.cdh6.3.2.p0.1605554-el7.parcel
cat CDH-6.3.2-1.cdh6.3.2.p0.1605554-el7.parcel.sha

如果2个验证码一样,证明该文件未损坏,可以使用:

在浏览器中能打开如下网址,证明配置成功:

http://10.101.15.229/cdh6.3.2/parcels/

5.3 创建cm文件

# 在/var/www/html创建cm5/redhat/7/x86_64/文件夹(和官网一样的路径)
cd /var/www/html/
mkdir -p cm6/redhat/7/x86_64/cm # 上传cm6.3.1-redhat7.tar.gz包到/var/www/html目录下,并解压
tar -xf cm6.3.1-redhat7.tar.gz
mv cm6.3.1 6.3.1# 将解压好的文件夹移动到上述创建的文件夹下
mv 6.3.1 /var/www/html/cm6/redhat/7/x86_64/cm!上传allkeys.asc文件到/var/www/html/cm6/redhat/7/x86_64/cm/6.3.1 文件夹下# 配置本地的yum源,cdh集群在安装时会就从本地down包,不会从官网了,
# 注意: 所有节点都要执行!!!
vim /etc/yum.repos.d/cloudera-manager.repo#在该文件下插入如下数据
[cloudera-manager]
name=Cloudera Manager
baseurl= http://10.101.15.229/cm6/redhat/7/x86_64/cm/6.3.1/
gpgkey = http://10.101.15.229/cm6/redhat/7/x86_64/cm/6.3.1/RPM-GPG-KEY-cloudera    
gpgcheck = 1

在浏览器中出现如下界面:

http://10.101.15.229/cm6/redhat/7/x86_64/cm/6.3.1/

5.4 安装CM的server+agent

# 进入上述创建的CM的文件目录下
# cd /var/www/html/cm5/redhat/7/x86_64/cm/5.7.0/RPMS/x86_64/
cd /var/www/html/cm6/redhat/7/x86_64/cm/6.3.1/RPMS/x86_64/# 安装cloudera-manager-daemons-6.3.1-1466458.el7.x86_64.rpm
yum install cloudera-manager-daemons-6.3.1-1466458.el7.x86_64.rpm# 安装cloudera-manager-server-6.3.1-1466458.el7.x86_64.rpm,
# 请注意,不用安装db版本的,那是使用默认数据库的,在生产环境中一般不使用,
# 生产环境中是使用MySQL数据库的
yum -y install cloudera-manager-server-6.3.1-1466458.el7.x86_64.rpm

5.5 配置Postgresql数据库

在master节点上安装postgre数据库,安装过程参考:centos7系统下postgresql11离线安装,卸载

数据库安装完成后,创建名称为cdh的数据库实例。

修改 /etc/cloudera-scm-server/db.properties 内容如下:

com.cloudera.cmf.db.type=postgresql
com.cloudera.cmf.db.host=10.101.15.229:5432
com.cloudera.cmf.db.name=cdh
com.cloudera.cmf.db.user=postgres
com.cloudera.cmf.db.password=123456
#com.cloudera.cmf.db.setupType=EXTERNAL #注意:最后一行要注释掉,否则会报INVALID value is specified for db.setupType的异常

5.6 启动cloudera-scm-server服务并查看日志

#启动
service cloudera-scm-server start
service cloudera-scm-server statusservice cloudera-scm-server restart# 在启动时有可能碰到The server time zone value 'EDT' is unrecognized异常,
# 这是mysql的时区和系统的时区不匹配,可以参考如下网站解决
https://blog.csdn.net/u010003835/article/details/88974898#查看日志
cd /var/log/cloudera-scm-server/
tail -f cloudera-scm-server.log
# 出现如下7180即证明启动成功
WebServerImpl:org.mortbay.log: Started SelectChannelConnector@0.0.0.0:7180

成功图片如下所示:

此时查看Postgre数据库,会发现cmf数据库下回自动创建表:

5.7 在浏览器的web页面上安装CM

service cloudera-scm-server start启动成功后,即可以在浏览器上服务7180端口(需开放防火墙)。

登录CM的web界面

在浏览器中输入http://10.101.15.229:7180/cmf/login ,登录CM的web界面,账号和密码均为admin

点击同意许可:

点击继续:

选择CM的版本:

欢迎页面,点击继续:

设置集群名称:

使用搜索模式,搜索需要安装CDH的主机:

5.8 在浏览器的web页面上安装CDH集群

选择存储库

点击更多选项,将其他远程Parcel删除,并输入先前配置好的Parcel:

http://10.101.15.229/cm6/redhat/7/x86_64/cm/6.3.1/

http://10.101.15.229/cdh6.3.2/parcels/

是否需要安装JDK

默认不进行安装,直接下一步:

提供 SSH 登录凭据

提供 SSH 登录凭据,可以自由选择,这里直接使用root用户:

点击继续

安装选定Parcel

先前配置的Parcel就作用于此处,如果不进行此配置会去官网进行下载,对网络要求很高,并网络中断后会重新下载,较麻烦,使用此配置可以直接下载成功,并速度很快:

完成安装

5.8 集群设置

5.8.1 选择服务

5.8.2 自定义角色分配

自定义角色分配,一般将主色分配到master节点,所以该节点内存要大,zookeeper需要安装奇数台,这里是只安装了一台,不合理,请安装3台以上的奇数台:

5.8.3 数据库设置

进行数据库设置,这里使用Postgre数据库:

5.8.4 审核更改

此步骤中不管是开发测试还是生产环境,均不需要更改,直接点击继续,进行下一步:

5.8.5 审核更改

首次运行,会自动运行,运行之后点击继续按钮即可:

6. 安装成功:

此状态为主机配置较低,运行不良,对集群无影响,可以正常工作。

7. 安装kerberos(选装)

(一般人不需要安这个玩意儿,到此cdh安装就结束了)

# 安装kerberos,注意要安装1.15.1-50.el7版本左右的,不能太低,不然CDH开启kerberos报错
# kerberos 1.15.1-50.el7版本在CentOS-7-x86_64-DVD-2009.iso镜像的yum源里就有
# 选择一个节点安装kerberos服务端
yum -y install krb5-server openldap-clients# 所有节点安装客户端及相关库
yum install -y krb5-workstation krb5-libs# 所有节点修改krb5.conf
sudo vi /etc/krb5.conf# krb5.conf示例内容如下:
# Configuration snippets may be placed in this directory as well
includedir /etc/krb5.conf.d/
[logging]default = FILE:/var/log/krb5libs.logkdc = FILE:/var/log/krb5kdc.logadmin_server = FILE:/var/log/kadmind.log
[libdefaults]dns_lookup_realm = falseticket_lifetime = 24hrenew_lifetime = 7dforwardable = truerdns = falsepkinit_anchors = FILE:/etc/pki/tls/certs/ca-bundle.crtdefault_realm = kunlun.test
# default_ccache_name = KEYRING:persistent:%{uid}
[realms]kunlun.test = {kdc = bjzj1-vbig-tmp02admin_server = bjzj1-vbig-tmp02}[domain_realm].bjzj1-vbig-tmp02 = kunlun.testbjzj1-vbig-tmp02 = kunlun.test# kerberos服务节点修改kdc.conf
sudo vi /var/kerberos/krb5kdc/kdc.conf# kdc.conf示例内容如下:
[kdcdefaults]kdc_ports = 88kdc_tcp_ports = 88
[realms]kunlun.test = {#master_key_type = aes256-ctsmax_renewable_life = 7d 0h 0m 0sdefault_principal_flags = +renewableacl_file = /var/kerberos/krb5kdc/kadm5.acldict_file = /usr/share/dict/wordsadmin_keytab = /var/kerberos/krb5kdc/kadm5.keytabsupported_enctypes = aes256-cts:normal aes128-cts:normal des3-hmac-sha1:normal arcfour-hmac:normal camellia256-cts:normal camellia128-cts:normal des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normal}max_life = 24h# kerberos服务节点修改kadm5.acl
sudo vi /var/kerberos/krb5kdc/kadm5.acl# kadm5.acl示例内容如下:
*/admin@kunlun.test     *#创建数据库
kdb5_util create -r kunlun.test -s# 开启kdc、kadmin服务
sudo systemctl start krb5kdc
sudo systemctl start kadmin
systemctl enable krb5kdc 
systemctl enable kadmin# 创建管理员账户,用于CDH开启kerberos时自动创建principal
kadmin.local:addprinc admin/admin
# 记得创建完后测试下该用户

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

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

相关文章

亚马逊Listing怎么写!亲身经验分享

亚马逊运营的重要环节之一&#xff0c;listing的攥写&#xff0c;可以决定了产品的搜索排名&#xff0c;用户的点击率和转化率&#xff0c;那么如果你的产品排名或者转化不理想的情况&#xff0c;可以考虑对listing进行优化&#xff0c;在关键词过多和语句流程通顺的情况下&…

js获取时间日期

目录 Date 对象 1. 获取当前时间 2. 获取特定日期时间 Date 对象的方法 1. 获取各种日期时间组件 2. 获取星期几 3. 获取时间戳 格式化日期时间 1. 使用 toLocaleString() 方法 2. 使用第三方库 UNIX 时间戳 内部表示 时区 Date 对象 JavaScript中内置的 Date 对象…

数据挖掘之PCA-主成分分析

PCA的用处&#xff1a;找出反应数据中最大变差的投影&#xff08;就是拉的最开&#xff09;。 在减少需要分析的指标同时&#xff0c;尽量减少原指标包含信息的损失&#xff0c;以达到对所收集数据进行全面分析的目的 但是什么时候信息保留的最多呢&#xff1f;具体一点&#…

​飞凌嵌入式FCU2601网关,为工商业储能EMS注入智慧的力量

一、火热的储能行业&#xff0c;寻求新的市场机会 最近一段时间以来&#xff0c;世界储能大会、上海储能展、能源电子产业发展大会等多个储能相关论坛和展览密集登场&#xff0c;即使“内卷”已成为了业内讨论的热词&#xff0c;但寻求新的市场机会仍然是行业共识&#xff0c;…

Qt C++中调用python,并将软件打包发布,python含第三方依赖

工作中遇到qt c调用我的python 代码&#xff0c;并且想要一键打包&#xff0c;这里我根据参考的以及个人实践的结果来简单实现一下。 环境&#xff1a;windows系统&#xff0c;QT Creater 4.5&#xff0c; python 3.8&#xff08;anaconda虚拟环境&#xff09; 1. 简单QT调用…

electron windows robotjs 安装教程

Robotjs 安装 前言第一步 : 安装python第二步 : 安装Visual Studio 2022第三步 : 安装robotjs 前言 robotjs可以控制鼠标键盘&#xff0c;获取屏幕内容&#xff0c;配合electron可做很多自动化操作。windows下配置环境有很多坑&#xff0c;很多文章都太旧了。试了很多次发现了…

ky10 server x86 auditd安装(日志审计系统)

概述 Auditd工具可以帮助运维人员审计Linux&#xff0c;分析发生在系统中的发生的事情。Linux 内核有用日志记录事件的能力&#xff0c;包括记录系统调用和文件访问。管理员可以检查这些日志&#xff0c;确定是否存在安全漏洞&#xff08;如多次失败的登录尝试&#xff0c;或者…

golang学习笔记——接口和继承比较2

接口和继承 现在有一个需要要求大学生和足球运动员掌握英语技能&#xff0c;请问怎么实现? 给运动员和学生结构体添加studyEnglish方法显示是可以的&#xff0c;但是篮球动员和中学生也学习了英语&#xff0c;显示不行。这时&#xff0c;我们可以直接给足球运动员和大学生添加…

跳转应用市场详情页market

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、商业变现、人工智能等&#xff0c;希望大家多多支持。 未经允许不得转载 目录 一、导读二、概览三、跳转到各大厂商应…

播放器开发(四):多线程解复用与解码模块实现

学习课题&#xff1a;逐步构建开发播放器【QT5 FFmpeg6 SDL2】 前言 根据第一章内容&#xff0c;我们首先可以先把解复用和解码模块完成&#xff0c;其中需要使用到多线程以及队列&#xff0c;还需要使用FFmpeg进行解复用和解码动作的实现。 创建BaseQueue基类 BaseQueue.h…

亚马逊两步验证有哪些验证方法?

亚马逊通常提供多种两步验证的方式&#xff0c;包括短信&#xff08;通过手机接收验证码&#xff09;和认证器应用程序&#xff08;如Google Authenticator、Authy等&#xff09;。选择你偏好的方式。 短信验证&#xff1a; 如果选择短信验证&#xff0c;需要将你的手机号码关联…

YOLOv8改进 | 2023 | LSKAttention大核注意力机制助力极限涨点

论文地址&#xff1a;官方论文地址 代码地址&#xff1a;官方代码地址 一、本文介绍 在这篇文章中&#xff0c;我们将讲解如何将LSKAttention大核注意力机制应用于YOLOv8&#xff0c;以实现显著的性能提升。首先&#xff0c;我们介绍LSKAttention机制的基本原理&#xff0c;…

定制手机套餐---python序列

if __name__ __main__:print("定制手机套餐")print("")#定义电话时长&#xff1a;字典callTimeOptions{1:0分钟,2:50分钟,3:100分钟,4:300分钟,5:不限量}keyinput("请输入电话时长的选择编号&#xff1a;")valuecallTimeOptions.get(key)if val…

代码随想录算法训练营第五十四天|392.判断子序列 115.不同的子序列

文档讲解&#xff1a;代码随想录 视频讲解&#xff1a;代码随想录B站账号 状态&#xff1a;看了视频题解和文章解析后做出来了 392.判断子序列 class Solution:def isSubsequence(self, s: str, t: str) -> bool:dp [[0] * (len(t)1) for _ in range(len(s)1)]for i in ra…

RabbitMq使用与整合

MQ基本概念 MQ概述 MQ全称 Message Queue&#xff08;[kjuː]&#xff09;&#xff08;消息队列&#xff09;&#xff0c;是在消息的传输过程中保存消息的容器。多用于分布式系统之间进行通信。 &#xff08;队列是一种容器&#xff0c;用于存放数据的都是容器&#xff0c;存…

优秀的时间追踪软件Timemator for Mac轻松管理时间!

在现代社会&#xff0c;时间管理成为了我们工作和生活中的一大挑战。如果你经常感到时间不够用&#xff0c;无法高效地完成任务&#xff0c;那么Timemator for Mac将成为你的得力助手。 Timemator for Mac是一款出色的时间追踪软件&#xff0c;它可以帮助你精确记录和管理你的…

Linux的基本指令 ( 一 )

目录 前言 Linux基本指令 快速认识五个指令 ls指令 补充内容 pwd指令 补充内容 cd指令 补充内容 重新认识指令 指令的本质 which指令 alias指令 最后 一个文件的三种时间 tree指令及安装 tree指令 前言 关于Linux操作系统的桌面&#xff0c;在学校教学中我们…

实用高效 无人机光伏巡检系统助力电站可持续发展

近年来&#xff0c;我国光伏发电行业规模日益壮大&#xff0c;全球领先地位愈发巩固。为解决光伏电站运维中的难题&#xff0c;浙江某光伏电站与复亚智能达成战略合作&#xff0c;共同推出全自动无人机光伏巡检系统&#xff0c;旨在提高发电效率、降低运维成本&#xff0c;最大…

Spark---SparkCore(一)

一、术语与宽窄依赖 1、术语解释 1、Master(standalone):资源管理的主节点&#xff08;进程&#xff09; 2、Cluster Manager:在集群上获取资源的外部服务(例如&#xff1a;standalone,Mesos,Yarn) 3、Worker Node(standalone):资源管理的从节点(进程)或者说管理本机资源的…

用Python写一个浏览器集群框架

更多Python学习内容&#xff1a;ipengtao.com 在分布式爬虫和大规模数据采集的场景中&#xff0c;使用浏览器集群是一种有效的方式&#xff0c;可以提高数据采集的速度和效率。本文将介绍如何用Python编写一个简单但强大的浏览器集群框架&#xff0c;以应对需要使用多个浏览器实…