PySpark 本地开发环境搭建与实践

目录

一、PySpark 本地开发环境搭建

(一)Windows 本地 JDK 和 Hadoop 的安装

(二)Windows 安装 Anaconda

(三)Anaconda 中安装 PySpark

(四)Pycharm 中创建工程

二、编写代码

(一)编写环境变量的代码

(二)获取 SparkContext 对象

(三)将代码模板化

完整的模板:记得给模板起个名字pyspark_local_script

三、本地开发案例

(一)WordCount 案例

(二)使用正则解决特殊分隔符问题

(三)本地开发 - 读取 hdfs 上的数据

(四)本地开发 - 获取外部的变量

传递数据

参数设置界面

四、Spark 程序的监控

4040 界面的使用

五、local 和结果文件的数量问题

(一)local 模式并行度

(二)结果文件数量与 local 模式的关系

六、总结



        在大数据处理领域,PySpark 作为一个强大的工具,为数据科学家和开发人员提供了便捷的方式来处理大规模数据。本文将详细介绍如何在 Windows 环境下搭建 PySpark 本地开发环境,并深入探讨在这个环境下的代码编写、案例实践、程序监控以及一些常见问题的处理,帮助读者快速上手 PySpark 本地开发。

一、PySpark 本地开发环境搭建

(一)Windows 本地 JDK 和 Hadoop 的安装

        JDK(Java Development Kit)是 Java 开发的基础,而 Hadoop 是处理大数据的重要框架。在 Windows 上安装它们是后续搭建 PySpark 环境的第一步。安装过程需要注意选择合适的版本,并按照安装向导进行操作,确保安装路径等设置正确。

JDK安装配置教程_jdk64位安装-CSDN博客

Windows 系统安装 Hadoop 详细教程-CSDN博客

(二)Windows 安装 Anaconda

         Anaconda 是一个开源的 Python 发行版本,它包含了 conda、Python 等 180 多个科学包及其依赖项。右键以管理员身份运行安装程序,默认安装到了 ProgramData 文件夹(这是一个非空文件夹)。在安装过程中,要注意各种安装选项,确保安装顺利进行。Anaconda 的安装为后续在其环境中安装 PySpark 等相关包提供了基础。

通过网盘分享Miniconda3的:Miniconda3-py38_4.11.0-Windows-x86_64.exe

(三)Anaconda 中安装 PySpark

         在命令提示符(cmd)中进行操作。在安装过程中,如果遇到需要输入 y 或者 n 的情况,输入 y。安装完成后,可以通过 conda list 或者 pip list 检查是否包含 py4j 和 pyspark 两个包。PySpark 的安装路径在 $ANACONDA_HOME/Lib/site - packages。这里需要强调的是,这实际上是在本地安装一个 Spark 软件,如果没有 Spark 环境,仅仅安装了 PySpark 是无法运行 Spark 代码的。

(四)Pycharm 中创建工程

  1. 选择 Conda:在 Pycharm 中创建工程时,选择 Conda。直接点确定即可。因为 Anaconda 包含了 Python 并且可以安装各种环境,比如 pyspark,通过这种关联,Pycharm 可以使用 Anaconda 中的工具。
  2. 解决识别问题:如果 Anaconda 没有安装在 C 盘,可能会出现识别不了的情况。此时需要手动选择。
  3. 检查安装包中是否有相关软件,并验证选择的解释器是否正确。
  4. 创建文件夹,为后续代码编写做好准备。

main :用于存放每天开发的一些代码文件
resources :用于存放程序中需要用到的配置文件
datas :用于存放每天用到的一些数据文件
test :用于存放测试时的一些代码文件

二、编写代码

(一)编写环境变量的代码

        环境变量的设置对于 PySpark 程序的运行至关重要。它确保程序能够找到所需的资源和配置。在代码中,要正确地设置与 Spark 相关的环境变量,包括 Spark 的安装路径、配置文件路径等。

import os

if __name__ == '__main__':
    # 你自己的JDK路径
    os.environ['JAVA_HOME'] = 'D:/Program Files/Java/jdk1.8.0_271'
    # 配置Hadoop的路径,就是前面解压的那个路径
    os.environ['HADOOP_HOME'] = 'D:/hadoop-3.3.1/hadoop-3.3.1'
    # 配置base环境Python解析器的路径
    os.environ['PYSPARK_PYTHON'] = 'C:/ProgramData/Miniconda3/python.exe'  
    # 配置base环境Python解析器的路径
    os.environ['PYSPARK_DRIVER_PYTHON'] = 'C:/ProgramData/Miniconda3/python.exe'

(二)获取 SparkContext 对象

         SparkContext 是 Spark 中的核心类,任何一个 Spark 的程序都必须包含一个 SparkContext 类的对象。通过获取这个对象,我们可以进一步构建和执行 Spark 任务。例如:

import os
# 导入pyspark模块
from pyspark import SparkContext,SparkConf

if __name__ == '__main__':
	# 配置环境
	os.environ['JAVA_HOME'] = 'D:/Program Files/Java/jdk1.8.0_271'
	# 配置Hadoop的路径,就是前面解压的那个路径
	os.environ['HADOOP_HOME'] = 'D:/hadoop-3.3.1/hadoop-3.3.1'
	# 配置base环境Python解析器的路径
	os.environ['PYSPARK_PYTHON'] = 'C:/ProgramData/Miniconda3/python.exe'  # 配置base环境Python解析器的路径
	os.environ['PYSPARK_DRIVER_PYTHON'] = 'C:/ProgramData/Miniconda3/python.exe'

	# 获取 conf 对象
	conf = SparkConf().setMaster("local[*]").setAppName("第一个Spark程序")
	# 假如我想设置压缩
	# conf.set("spark.eventLog.compression.codec","snappy")
	# 根据配置文件,得到一个SC对象,第一个conf 是 形参的名字,第二个conf 是实参的名字
	sc = SparkContext(conf=conf)
	print(sc)


	# 使用完后,记得关闭
	sc.stop()

(三)将代码模板化

         创建一个名为 pyspark_local_script 的模板,并在其中添加必要的内容。模板化代码有助于提高代码的复用性和规范性。在模板中,可以将一些常用的代码结构和函数定义好,方便在不同的项目中使用。

完整的模板:记得给模板起个名字pyspark_local_script
import os
# 导入pyspark模块
from pyspark import SparkContext,SparkConf

"""
------------------------------------------
  Description : TODO:
  SourceFile : ${NAME}
  Author  : ${USER}
  Date  : ${DATE}
-------------------------------------------
"""

if __name__ == '__main__':
	# 配置环境
	os.environ['JAVA_HOME'] = 'D:/Program Files/Java/jdk1.8.0_271'
	# 配置Hadoop的路径,就是前面解压的那个路径
	os.environ['HADOOP_HOME'] = 'D:/hadoop-3.3.1/hadoop-3.3.1'
	# 配置base环境Python解析器的路径
	os.environ['PYSPARK_PYTHON'] = 'C:/ProgramData/Miniconda3/python.exe'  # 配置base环境Python解析器的路径
	os.environ['PYSPARK_DRIVER_PYTHON'] = 'C:/ProgramData/Miniconda3/python.exe'

	# 获取 conf 对象
	conf = SparkConf().setMaster("local[*]").setAppName("第一个Spark程序")
	# 假如我想设置压缩
	# conf.set("spark.eventLog.compression.codec","snappy")
	# 根据配置文件,得到一个SC对象,第一个conf 是 形参的名字,第二个conf 是实参的名字
	sc = SparkContext(conf=conf)
	print(sc)


	# 使用完后,记得关闭
	sc.stop()

模板的使用:

三、本地开发案例

(一)WordCount 案例

代码编写:这是一个经典的大数据处理案例。通过读取文本文件,将其中的单词进行拆分、计数。代码实现如下:

import os
# 导入pyspark模块
from pyspark import SparkContext, SparkConf

if __name__ == '__main__':
    # 配置环境
    os.environ['JAVA_HOME'] = 'C:/Program Files/java/jdk1.8.0_181'
    # 配置Hadoop的路径,就是前面解压的那个路径
    os.environ['HADOOP_HOME'] = 'D:/Linux/hadoop/hadoop-3.3.1'
    # 配置base环境Python解析器的路径
    os.environ['PYSPARK_PYTHON'] = 'C:/ProgramData/Miniconda3/python.exe'  # 配置base环境Python解析器的路径
    os.environ['PYSPARK_DRIVER_PYTHON'] = 'C:/ProgramData/Miniconda3/python.exe'

    # 获取 conf 对象
    # setMaster  按照什么模式运行,local  bigdata01:7077  yarn
    #  local[2]  使用2核CPU   * 你本地资源有多少核就用多少核
    #  appName 任务的名字
    conf = SparkConf().setMaster("local[*]").setAppName("第一个Spark程序")
    # 假如我想设置压缩
    # conf.set("spark.eventLog.compression.codec","snappy")
    # 根据配置文件,得到一个SC对象,第一个conf 是 形参的名字,第二个conf 是实参的名字
    sc = SparkContext(conf=conf)
    print(sc)

    fileRdd = sc.textFile("../../datas/WordCount/data.txt")
    rsRdd = fileRdd.filter(lambda x: len(x) > 0) \
        .flatMap(lambda line: line.strip().split()) \
        .map(lambda word: (word, 1)).reduceByKey(lambda a, b: a+b)

    rsRdd.saveAsTextFile("../datas/WordCount/result2")

    # 使用完后,记得关闭
    sc.stop()
    # 注意,在cmd窗口中执行spark-submit命令时,需要将以下路径添加到环境变量中

建议安装一个工具psutil,如果不想看到就在 Python解释器中安装:pip install psutil

查看运行结果:运行代码后,可以在指定的输出路径中查看结果文件。结果文件中包含了每个单词及其出现的次数。

常见的其他错误:

(二)使用正则解决特殊分隔符问题

        在实际数据处理中,可能会遇到特殊的分隔符。这时可以使用正则表达式来改造 WordCount 代码。例如,如果数据是用特定的非空格字符分隔的,可以通过修改 flatMap 函数中的分隔逻辑,使用正则表达式来正确拆分单词。

import os
import re

# 导入pyspark模块
from pyspark import SparkContext, SparkConf

if __name__ == '__main__':
# 配置环境
os.environ['JAVA_HOME'] = 'C:/Program Files/java/jdk1.8.0_181'
# 配置Hadoop的路径,就是前面解压的那个路径
os.environ['HADOOP_HOME'] = 'D:/Linux/hadoop/hadoop-3.3.1'
# 配置base环境Python解析器的路径
os.environ['PYSPARK_PYTHON'] = 'C:/ProgramData/Miniconda3/python.exe' # 配置base环境Python解析器的路径
os.environ['PYSPARK_DRIVER_PYTHON'] = 'C:/ProgramData/Miniconda3/python.exe'

# 获取 conf 对象
# setMaster 按照什么模式运行,local bigdata01:7077 yarn
# local[2] 使用2核CPU * 你本地资源有多少核就用多少核
# appName 任务的名字
conf = SparkConf().setMaster("local[*]").setAppName("")
# 假如我想设置压缩
# conf.set("spark.eventLog.compression.codec","snappy")
# 根据配置文件,得到一个SC对象,第一个conf 是 形参的名字,第二个conf 是实参的名字
sc = SparkContext(conf=conf)
print(sc)

fileRdd = sc.textFile("../../datas/WordCount/data.txt")
rsRdd = fileRdd.filter(lambda x: len(x) > 0) \
.flatMap(lambda line: re.split("\\s+", line.strip())) \
.map(lambda word: (word, 1)) \
.reduceByKey(lambda sum, num: sum+num)

rsRdd.saveAsTextFile("../datas/WordCount/result3")

# 使用完后,记得关闭
sc.stop()

(三)本地开发 - 读取 hdfs 上的数据

        在 Windows 环境下,用户通常没有权限访问 hdfs 文件系统。这需要进行一些额外的配置,比如配置 Hadoop 的相关权限,或者通过一些代理工具来实现访问。在代码中,要正确设置 Hadoop 的配置参数,以确保能够读取 hdfs 上的数据。

	fileRdd = sc.textFile("hdfs://bigdata01:9820/spark/wordcount/input/*")
	rsRdd = fileRdd.filter(lambda line: len(line.strip()) > 0 ).flatMap(lambda line: re.split("\\s+",line.strip())).map(lambda word: (word,1)).reduceByKey(lambda sum,num : sum+num)
	rsRdd.saveAsTextFile("hdfs://bigdata01:9820/spark/wordcount/output4")

以上这个说明,windows用户没有权限访问hdfs文件系统

# 申明当前以root用户的身份来执行操作
os.environ['HADOOP_USER_NAME'] = 'root'

完整代码

import os
import re

# 导入pyspark模块
from pyspark import SparkContext, SparkConf

if __name__ == '__main__':
    # 配置环境
    os.environ['JAVA_HOME'] = 'C:/Program Files/java/jdk1.8.0_181'
    # 配置Hadoop的路径,就是前面解压的那个路径
    os.environ['HADOOP_HOME'] = 'D:/Linux/hadoop/hadoop-3.3.1'
    # 配置base环境Python解析器的路径
    os.environ['PYSPARK_PYTHON'] = 'C:/ProgramData/Miniconda3/python.exe'  # 配置base环境Python解析器的路径
    os.environ['PYSPARK_DRIVER_PYTHON'] = 'C:/ProgramData/Miniconda3/python.exe'

    # 申明当前以root用户的身份来执行操作
    os.environ['HADOOP_USER_NAME'] = 'root'

    conf = SparkConf().setMaster("local[*]").setAppName("")
    sc = SparkContext(conf=conf)

    fileRdd = sc.textFile("hdfs://bigdata01:9820/spark/wordcount/input/*")
    rsRdd = fileRdd.filter(lambda line: len(line.strip()) > 0) \
        .flatMap(lambda line: re.split("\\s+", line.strip())) \
        .map(lambda word: (word, 1))\
        .reduceByKey(lambda sum, num: sum + num)
    rsRdd.saveAsTextFile("hdfs://bigdata01:9820/spark/wordcount/output4")

    # 使用完后,记得关闭
    sc.stop()

运行

(四)本地开发 - 获取外部的变量

        类似于 Java 中的 String[] args,在 PySpark 中也可以获取外部变量。可以通过命令行参数传递的方式来实现。例如,在运行 pyspark 脚本时,可以使用 spark - sumit xxxxx.py 参数 1, 参数 2 的形式传递参数。在代码中,需要对这些参数进行解析和使用。

import os
import re
import sys

# 导入pyspark模块
from pyspark import SparkContext, SparkConf


if __name__ == '__main__':
    # 配置环境
    os.environ['JAVA_HOME'] = 'C:/Program Files/java/jdk1.8.0_181'
    # 配置Hadoop的路径,就是前面解压的那个路径
    os.environ['HADOOP_HOME'] = 'D:/Linux/hadoop/hadoop-3.3.1'
    # 配置base环境Python解析器的路径
    os.environ['PYSPARK_PYTHON'] = 'C:/ProgramData/Miniconda3/python.exe'  # 配置base环境Python解析器的路径
    os.environ['PYSPARK_DRIVER_PYTHON'] = 'C:/ProgramData/Miniconda3/python.exe'
    # 申明当前以root用户的身份来执行操作
    os.environ['HADOOP_USER_NAME'] = 'root'

    # 获取 conf 对象
    conf = SparkConf().setMaster("local[*]").setAppName("")
    # 根据配置文件,得到一个SC对象,第一个conf 是 形参的名字,第二个conf 是实参的名字
    sc = SparkContext(conf=conf)
    print(sc)

    # 获取第一个参数
    fileRdd = sc.textFile(sys.argv[1])
    rsRdd = fileRdd.filter(lambda line: len(line.strip()) > 0) \
        .flatMap(lambda line: re.split("\\s+", line.strip())) \
        .map(lambda word: (word, 1)) \
        .reduceByKey(lambda sum, num: sum + num)
    # 获取第二个参数
    rsRdd.saveAsTextFile(sys.argv[2])

    # 使用完后,记得关闭
    sc.stop()
传递数据

参数一: hdfs://bigdata01:9820/spark/wordcount/input/*
参数二: hdfs://bigdata01:9820/spark/wordcount/output4

参数设置界面

四、Spark 程序的监控

4040 界面的使用

        因为是本地的程序,所以可以通过访问地址 http://localhost:4040 来监控程序。每个 Spark 程序都有一个对应的 4040 界面。这个界面提供了丰富的信息:

  1. RDD 相关信息:每个黑点表示一个 RDD,每个矩形框中的 RDD 的转换都是在内存中完成的,曲线代表经过了 Shuffle,灰色代表没有执行(因为之前执行过)。
  2. 进程信息:显示当前这个程序的运行进程的信息。每个 Spark 程序都由两种进程组成:一个 Driver 和多个 Executors。Driver 进程负责解析程序,构建 DAG 图,构建 Stage,构建、调度、监控 Task 任务的运行;Executor 进程负责运行程序中的所有 Task 任务。
  3. 存储信息:Storage 部分显示当前这个程序在内存缓存的数据信息。
  4. 配置信息:Environment 显示当前这个程序所有的配置信息。

五、local 和结果文件的数量问题

(一)local 模式并行度

  1. local:使用本地模式,并行度是 1。
  2. local[3]:使用本地模式,并行度是 3,这个并行度最好和 CPU 的核数一致,一般并行度 <= CPU 的核数。
  3. local[*]:并行度 = CPU 的核数。

(二)结果文件数量与 local 模式的关系

        文件的结果经常是 2 个文件,这跟分区数有关系,跟 local = N 也有一定的关系。其规律是 min(N,2),例如如果是 local [1],最后的文件数量就是 1。

        如果在 local 模式下,想要结果文件是 10,可以使用 sc.textFile("../datas/wordcount/data.txt",10) 的方式来设置分区数。

六、总结

        本文详细介绍了 PySpark 本地开发环境的搭建过程,包括 JDK、Hadoop、Anaconda、PySpark 的安装以及 Pycharm 工程的创建。同时,深入讲解了代码编写、本地开发案例(如 WordCount、处理特殊分隔符、读取 hdfs 数据、获取外部变量)、Spark 程序的监控和 local 模式下结果文件数量问题等内容。通过掌握这些知识和技能,读者可以在 Windows 本地环境中高效地进行 PySpark 开发,处理大规模数据,解决实际业务中的数据分析和处理问题。希望本文能为读者在 PySpark 学习和实践的道路上提供有力的帮助,让读者能够更好地利用这个强大的工具来挖掘数据的价值。

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

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

相关文章

基于Python的自然语言处理系列(51):Weight Quantization

浮点数表示简介 浮点数的设计允许表示范围广泛的数值,同时保持一定的精度。浮点数表示的基本公式为: 在深度学习中,常见的浮点数格式有:float32(FP32)、float16(FP16)和bfloat16(BF16)。每种格式的具体特性如下: 格式总位数符号位指数位数尾数位数精度计算成…

c++:vector模拟实现

一、vector成员变量 库里实现用的就是这三个成员变量&#xff0c;咱们实现跟库里一样&#xff0c; namespace myvector {template<class T>class vector{public://vecttor的迭代器是原生指针typedef T* iterator;typedef const T* const_iterator; private:iterator _sta…

【Linux系列】Linux 和 Unix 系统中的`set`命令与错误处理

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

抗疫物资管理:SpringBoot技术应用案例

目 录 摘 要 1 前 言 2 第1章 概述 2 1.1 研究背景 3 1.2 研究目的 3 1.3 研究内容 4 第二章 开发技术介绍 5 2.1相关技术 5 2.2 Java技术 6 2.3 MySQL数据库 6 2.4 Tomcat介绍 7 2.5 Spring Boot框架 8 第三章 系统分析 9 3.1 可行性分析 9 3.1.1 技术可行性 9 3.1.2 经济可行…

机器学习实战(一)机器学习基础

"我不断地告诉大家&#xff0c;未来十年最热门的职业是统计学家。很多人认为我是开玩笑&#xff0c; 谁又能想到计算机工程师会是20世纪90年代最诱人的职业呢&#xff1f;如何解释数据、处理数据、从中抽取价值、展示和交流数据结果&#xff0c;在未来十年将是最重要的职业…

树叶分类竞赛(Baseline)以及kaggle的GPU使用

树叶分类竞赛(Baseline)-kaggle的GPU使用 文章目录 树叶分类竞赛(Baseline)-kaggle的GPU使用竞赛的步骤代码实现创建自定义dataset定义data_loader模型定义超参数训练模型预测和保存结果 kaggle使用 竞赛的步骤 本文来自于Neko Kiku提供的Baseline&#xff0c;感谢大佬提供代码…

奥数与C++小学四年级(第十一题 试商)

参考程序代码&#xff1a; #include <iostream> using namespace std; int main() { int dividend 2023; int count 0; // 余数从0开始遍历到被除数 for (int remainder 0; remainder < dividend; remainder) { int divisor remainder 2; // 计算商 if…

GPT-Sovits-2-微调模型

1. 大致步骤 上一步整理完数据集后&#xff0c;此步输入数据, 微调2个模型VITS和GPT&#xff0c;位置在 <<1-GPT-SoVITS-tts>>下的<<1B-微调训练>> 页面的两个按钮分别执行两个文件: <./GPT_SoVITS/s2_train.py> 这一步微调VITS的预训练模型…

关于前端程序员使用Idea快捷键配置的说明

相信很多前端程序员 转到后端第一件事就是安装Idea然后学习java&#xff0c;在这里面最难的不是java的语法&#xff0c;而是关于快捷键的修改&#xff0c;前端程序员用的最多的估计就是VsCode或者Webstorm&#xff0c;就拿我自己举例我经常使用Vscode&#xff0c;当我写完代码下…

ubuntu运行gazebo导致内存越来越少

1.用vscode看代码会一直有没用的日志缓存&#xff0c;可以删掉&#xff08;文件夹留着&#xff0c;可以把里面的东西删掉&#xff09; 2.运行gazebo的模型会有很多缓存文件&#xff0c;可以删掉 log文件夹非常大

视频智能分析平台LiteAIServer入侵检测算法平台部署行人入侵检测算法:智能安防的新利器

在当今数字化时代&#xff0c;安全防护成为了社会各界高度关注的重要议题。随着人工智能技术的不断发展&#xff0c;视频智能分析平台LiteAIServer 行人入侵检测算法应运而生&#xff0c;为安防领域带来了全新的突破与变革。 视频智能分析平台LiteAIServer 行人入侵检测算法是基…

架构师备考-非关系型数据库

基础理论 CAP 理论 C&#xff08;Consistency&#xff09;一致性。一致性是指更新操作成功并返回客户端完成后&#xff0c;所有的节点在同一时间的数据完全一致&#xff0c;与ACID 的 C 完全不同。A &#xff08;Availability&#xff09;可用性。可用性是指服务一直可用&…

七、k8s快速入门之资源控制器

文章目录 :star: RC:star: Deployment:three: create 和 apply的区别 :star: DaemonSet:star: job&&CronJob ⭐️ RC 1️⃣ 查看版本 kubect api-resource 或 kubect explain rs2️⃣ 编写Yaml文档 [rootmaster ~]# vim pod/rc.yaml apiVersion: extensions/v1beta1…

FreeRTOS移植到STM32F103C8T6(HAL库)

目录 一、将STM32F103ZET6代码变更成STM32F103C8T6 二、 将FreeRTOS码源添加到文件 三、代码更改适配 四、测试 一、将STM32F103ZET6代码变更成STM32F103C8T6 点击魔法棒&#xff0c;点击Device&#xff0c;选择芯片为STM32F103C8T6 进行编译&#xff0c;无报错无警告&am…

Nginx 的 Http 模块介绍(上)

Nginx 的 Http 模块介绍&#xff08;上&#xff09; 1. http 请求 11 个处理阶段介绍 Nginx 将一个 Http 请求分成多个阶段&#xff0c;以模块为单位进行处理。其将 Http请求的处理过程分成了 11 个阶段&#xff0c;各个阶段可以包含任意多个 Http 的模块并以流水线的方式处理…

六西格玛项目助力,手术机器人零部件国产化稳中求胜——张驰咨询

项目背景 XR-1000型腔镜手术机器人是某头部手术机器人企业推出的高端手术设备&#xff0c;专注于微创手术领域&#xff0c;具有高度的精确性和稳定性。而XR-1000型机器人使用的部分核心零部件长期依赖进口&#xff0c;特别是高精度电机、关节执行机构和视觉系统等&#xff0c;…

基于Python爬虫与文本挖掘的网络舆情监控系统【附源码】

基于Python爬虫与文本挖掘的网络舆情监控系统 效果如下&#xff1a; 系统登录界面 注册页面界面 管理员主界面 用户界面 网络舆情管理界面 看板详细页面 系统简介界面 用户主界面 网络舆情界面 研究背景 随着网络空间舆论的日益活跃&#xff0c;其对社会事件的影响愈发显著。…

光影重塑 艺术无界——中央美术学院国际学院与北京曦烽摄影学院联展启幕

10月28日&#xff0c;中央美术学院国际学院与北京曦烽摄影学院联合举办的《重塑》摄影展&#xff0c;在中央美术学院国际学院艺术空间启幕。展览旨在打破传统“时尚摄影”的话语界限&#xff0c;通过镜头展现时尚的更多维度&#xff0c;既关注视觉美感&#xff0c;更深入挖掘时…

【Linux 25】网络套接字 socket 概念

文章目录 &#x1f308; 一、IP 地址概念⭐ 1. IP 地址的作用⭐ 2. 源 IP 地址和目的 IP 地址 &#x1f308; 二、端口号概念⭐ 1. 源端口号和目的端口号⭐ 2. 端口号范围划分⭐ 3. 端口号 VS 进程 ID⭐ 4. 套接字 socket 的概念 &#x1f308; 三、传输层的典型代表协议⭐ 1. …

配置mysql 主主模式 GTID

文章目录 一、前提二、修改my.cnf主1 10.255.131.9主2 10.255.131.10 三、配置主主3.1 配置主 10.255.131.93.2 配置从 10.255.131.103.3 配置主 10.255.131.103.4 配置从 10.255.131.9 四、验证五、同步问题排查以及恢复5.1 查看同步状态5.2 查看同步是否数据一致性&#xff0…