Spark核心之01:架构部署、sparkshell、程序模板

spark内存计算框架

在这里插入图片描述

一、主题

  1. spark核心概念
  2. spark集群架构
  3. spark集群安装部署
  4. spark-shell的使用
  5. 通过IDEA开发spark程序

二、要点

1. spark是什么

  • Apache Spark™ is a unified analytics engine for large-scale data processing.

  • spark是针对于大规模数据处理的统一分析引擎

spark是在Hadoop基础上的改进,是UC Berkeley AMP lab所开源的类Hadoop MapReduce的通用的并行计算框架,Spark基于map reduce算法实现的分布式计算,拥有Hadoop MapReduce所具有的优点;但不同于MapReduce的是Job中间输出和结果可以保存在内存中,从而不再需要读写HDFS,因此Spark能更好地适用于数据挖掘与机器学习等需要迭代的map reduce的算法。
spark是基于内存计算框架,计算速度非常之快,但是它仅仅只是涉及到计算,并没有涉及到数据的存储,后期需要使用spark对接外部的数据源,比如hdfs。

2. spark的四大特性

2.1 速度快

在这里插入图片描述

  • 运行速度提高100倍

    • Apache Spark使用最先进的DAG调度程序,查询优化程序和物理执行引擎,实现批量和流式数据的高性能。
  • spark比mapreduce快的2个主要原因

    • 1、基于内存

      (1)mapreduce任务后期再计算的时候,每一个job的输出结果会落地到磁盘,后续有其他的job需要依赖于前面job的输出结果,这个时候就需要进行大量的磁盘io操作。性能就比较低。
      (2)spark任务后期再计算的时候,job的输出结果可以保存在内存中,后续有其他的job需要依赖于前面job的输出结果,这个时候就直接从内存中获取得到,避免了磁盘io操作,性能比较高

    • 2、进程与线程

      spark任务以线程的方式运行在Executor进程中

      (1)mapreduce任务以进程的方式运行在yarn集群中,比如程序中有100个MapTask,一个task就需要一个进程,这些task要运行就需要开启100个进程。
      (2)spark任务以线程的方式运行在进程中,比如程序中有100个MapTask,后期一个task就对应一个线程,这里就不在是进程,这些task需要运行,这里可以极端一点:
      只需要开启1个进程,在这个进程中启动100个线程就可以了。
      进程中可以启动很多个线程,而开启一个进程与开启一个线程需要的时间和调度代价是不一样。 开启一个进程需要的时间远远大于开启一个线程。

2.2 易用性

在这里插入图片描述

  • 可以快速去编写spark程序通过 java/scala/python/R/SQL等不同语言
2.3 通用性

在这里插入图片描述

  • spark框架不在是一个简单的框架,可以把spark理解成一个==生态系统==,它内部是包含了很多模块,基于不同的应用场景可以选择对应的模块去使用
    • sparksql
      • 通过sql去开发spark程序做一些离线分析
    • sparkStreaming
      • 主要是用来解决公司有实时计算的这种场景
    • Mlib
      • 它封装了一些机器学习的算法库
    • Graphx
      • 图计算
2.4 兼容性

在这里插入图片描述

  • spark程序就是一个计算逻辑程序,这个任务要运行就需要计算资源(内存、cpu、磁盘),哪里可以给当前这个任务提供计算资源,就可以把spark程序提交到哪里去运行
    • standAlone
      • 它是spark自带的独立运行模式,整个任务的资源分配由spark集群的老大Master负责
    • yarn
      • 可以把spark程序提交到yarn中运行,整个任务的资源分配由yarn中的老大ResourceManager负责
    • mesos
      • 它也是apache开源的一个类似于yarn的资源调度平台

⭐️3. spark集群架构

在这里插入图片描述

  • Driver

    • 它会执行客户端写好的main方法,它会构建一个名叫SparkContext对象
      • 该对象是所有spark程序的执行入口
  • Application

    • 就是一个spark的应用程序,它是包含了客户端的代码和任务运行的资源信息
  • ⭐️ClusterManager

  • 它是给程序提供计算资源的外部服务

    • standAlone
      • 它是spark自带的集群模式,整个任务的资源分配由spark集群的老大Master负责
    • yarn
      • 可以把spark程序提交到yarn中运行,整个任务的资源分配由yarn中的老大ResourceManager负责
    • mesos
      • 它也是apache开源的一个类似于yarn的资源调度平台。
  • Master

    • 它是整个spark集群的主节点,负责任务资源的分配
  • Worker

    • 它是整个spark集群的从节点,负责任务计算的节点
  • Executor

    • 它是一个进程,它会在worker节点启动该进程(计算资源)
  • Task

    • spark任务是以task线程的方式运行在worker节点对应的executor进程中

4. spark集群安装部署

  • 事先搭建好zookeeper集群
  • 1、下载安装包

    • https://archive.apache.org/dist/spark/spark-2.3.3/spark-2.3.3-bin-hadoop2.7.tgz
    • spark-2.3.3-bin-hadoop2.7.tgz
  • 2、规划安装目录

    • /kkb/install
  • 3、上传安装包到服务器

  • 4、解压安装包到指定的安装目录

    • tar -zxvf spark-2.3.3-bin-hadoop2.7.tgz -C /kkb/install
  • 5、重命名解压目录

    • mv spark-2.3.3-bin-hadoop2.7 spark
  • 6、修改配置文件

    • 进入到spark的安装目录下对应的conf文件夹

      • vim spark-env.sh ( mv spark-env.sh.template spark-env.sh)

        #配置java的环境变量
        export JAVA_HOME=/kkb/install/jdk1.8.0_141
        #配置zk相关信息
        export SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER  -Dspark.deploy.zookeeper.url=node01:2181,node02:2181,node03:2181  -Dspark.deploy.zookeeper.dir=/spark"
        
      • vim slaves ( mv slaves.template slaves)

        #指定spark集群的worker节点
        node02
        node03
        
  • 7、分发安装目录到其他机器

    scp -r /kkb/install/spark node02:/kkb/install
    scp -r /kkb/install/spark node03:/kkb/install
    
  • 8、修改spark环境变量

    • vim /etc/profile

      export SPARK_HOME=/kkb/install/spark
      export PATH=$PATH:$SPARK_HOME/bin:$SPARK_HOME/sbin
      
  • 9、分发spark环境变量到其他机器

    scp /etc/profile node02:/etc
    scp /etc/profile node03:/etc
    
  • 10、让所有机器的spark环境变量生效

    • 在所有节点执行
      • source /etc/profile

5. spark集群的启动和停止

5.1 启动
  • 1、先启动zk
  • 2、启动spark集群
    • 可以在任意一台服务器来执行(条件:需要任意2台机器之间实现ssh免密登录)
      • $SPARK_HOME/sbin/start-all.sh
      • 在哪里启动这个脚本,就在当前该机器启动一个Master进程
      • 整个集群的worker进程的启动由slaves文件
    • 后期可以在其他机器单独在启动master
      • $SPARK_HOME/sbin/start-master.sh

⭐️⭐️

(1) 如何恢复到上一次活着master挂掉之前的状态?
	在高可用模式下,整个spark集群就有很多个master,其中只有一个master被zk选举成活着的master,其他的多个master都处于standby,同时把整个spark集群的元数据信息通过zk中节点进行保存。

	后期如果活着的master挂掉。首先zk会感知到活着的master挂掉,下面开始在多个处于standby中的master进行选举,再次产生一个活着的master,这个活着的master会读取保存在zk节点中的spark集群元数据信息,恢复到上一次master的状态。整个过程在恢复的时候经历过了很多个不同的阶段,每个阶段都需要一定时间,最终恢复到上个活着的master的转态,整个恢复过程一般需要1-2分钟。

(2) 在master的恢复阶段对任务的影响?

   a)对已经运行的任务是没有任何影响
   	  由于该任务正在运行,说明它已经拿到了计算资源,这个时候就不需要master。
   	  
   b) 对即将要提交的任务是有影响
   	  由于该任务需要有计算资源,这个时候会找活着的master去申请计算资源,由于没有一个活着的master,该任务是获取不到计算资源,也就是任务无法运行。
5.2 停止
  • 在处于active Master主节点执行

    • $SPARK_HOME/sbin/stop-all.sh
  • 在处于standBy Master主节点执行

    • $SPARK_HOME/sbin/stop-master.sh

6. spark集群的web管理界面

  • 当启动好spark集群之后,可以访问这样一个地址
    • http://master主机名:8080
    • 可以通过这个web界面观察到很多信息
      • 整个spark集群的详细信息
      • 整个spark集群总的资源信息
      • 整个spark集群已经使用的资源信息
      • 整个spark集群还剩的资源信息
      • 整个spark集群正在运行的任务信息
      • 整个spark集群已经完成的任务信息

在这里插入图片描述

7. 初识spark程序

⭐️7.1 普通模式提交 (指定活着的master地址)
bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://node01:7077 \
--executor-memory 1G \
--total-executor-cores 2 \
examples/jars/spark-examples_2.11-2.3.3.jar \
10

####参数说明
--class:指定包含main方法的主类
--master:指定spark集群master地址
--executor-memory:指定任务在运行的时候需要的每一个executor内存大小
--total-executor-cores: 指定任务在运行的时候需要总的cpu核数

⭐️7.2 高可用模式提交 (集群有很多个master)
bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://node01:7077,node02:7077,node03:7077 \
--executor-memory 1G \
--total-executor-cores 2 \
examples/jars/spark-examples_2.11-2.3.3.jar \
10

spark集群中有很多个master,并不知道哪一个master是活着的master,即使你知道哪一个master是活着的master,它也有可能下一秒就挂掉,这里就可以把所有master都罗列出来
--master spark://node01:7077,node02:7077,node03:7077

后期程序会轮训整个master列表,最终找到活着的master,然后向它申请计算资源,最后运行程序。

8. spark-shell使用

8.1 运行spark-shell --master local[N] 读取本地文件进行单词统计
  • –master local[N]

    • local 表示程序在本地进行计算,跟spark集群目前没有任何关系
    • N 它是一个正整数,表示使用N个线程参与任务计算
    • local[N] 表示本地采用N个线程计算任务
  • spark-shell --master local[2]

    • 默认会产生一个SparkSubmit进程
    sc.textFile("file:///home/hadoop/words.txt").flatMap(x=>x.split(" ")).map(x=>(x,1)).reduceByKey((x,y)=>x+y).collect
    
    sc.textFile("file:///home/hadoop/words.txt").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).collect
    
8.2 运行spark-shell --master local[N] 读取HDFS上文件进行单词统计
  • spark整合HDFS

    • 在node01上修改配置文件
      • vim spark-env.sh
    export HADOOP_CONF_DIR=/kkb/install/hadoop-2.6.0-cdh5.14.2/etc/hadoop
    
    • 分发到其他节点
    scp spark-env.sh node02:/kkb/install/spark/conf
    scp spark-env.sh node03:/kkb/install/spark/conf
    
  • spark-shell --master local[2]

    sc.textFile("/words.txt").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).collect
    
    sc.textFile("hdfs://node01:8020/words.txt").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).collect
    
8.3 运行spark-shell 指定集群中活着master 读取HDFS上文件进行单词统计
  • spark-shell --master spark://node01:7077 --executor-memory 1g --total-executor-cores 4

    • –master spark://node01:7077
      • 指定活着的master地址
    • –executor-memory 1g
      • 指定每一个executor进程的内存大小
    • –total-executor-cores 4
      • 指定总的executor进程cpu核数
    sc.textFile("hdfs://node01:8020/words.txt").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).collect
    
    //实现读取hdfs上文件之后,需要把计算的结果保存到hdfs上
    sc.textFile("/words.txt").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).saveAsTextFile("/out")
    

9. 通过IDEA开发spark程序

  • 构建maven工程,添加pom依赖

     <dependencies>
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-core_2.11</artifactId>
            <version>2.3.3</version>
        </dependency>
    </dependencies>
    
    
     <build>
            <sourceDirectory>src/main/scala</sourceDirectory>
            <testSourceDirectory>src/test/scala</testSourceDirectory>
            <plugins>
                <plugin>
                    <groupId>net.alchim31.maven</groupId>
                    <artifactId>scala-maven-plugin</artifactId>
                    <version>3.2.2</version>
                    <executions>
                        <execution>
                            <goals>
                                <goal>compile</goal>
                                <goal>testCompile</goal>
                            </goals>
                            <configuration>
                                <args>
                                    <arg>-dependencyfile</arg>
                                    <arg>${project.build.directory}/.scala_dependencies</arg>
                                </args>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-shade-plugin</artifactId>
                    <version>2.4.3</version>
                    <executions>
                        <execution>
                            <phase>package</phase>
                            <goals>
                                <goal>shade</goal>
                            </goals>
                            <configuration>
                                <filters>
                                    <filter>
                                        <artifact>*:*</artifact>
                                        <excludes>
                                            <exclude>META-INF/*.SF</exclude>
                                            <exclude>META-INF/*.DSA</exclude>
                                            <exclude>META-INF/*.RSA</exclude>
                                        </excludes>
                                    </filter>
                                </filters>
                                <transformers>
                                    <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                        <mainClass></mainClass>
                                    </transformer>
                                </transformers>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
     </build>
    
  • 创建 src/main/scala 和 src/test/scala 目录

在这里插入图片描述

9.1 利用scala语言开发spark程序实现单词统计–本地运行
  • 代码开发
package com.kaikeba

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

//todo: 利用scala语言开发spark程序实现单词统计
object WordCount {
  def main(args: Array[String]): Unit = {
    //1、构建sparkConf对象 设置application名称和master地址
    val sparkConf: SparkConf = new SparkConf().setAppName("WordCount").setMaster("local[2]")

    //2、构建sparkContext对象,该对象非常重要,它是所有spark程序的执行入口
    // 它内部会构建  DAGScheduler和 TaskScheduler 对象
    val sc = new SparkContext(sparkConf)

    //设置日志输出级别
    sc.setLogLevel("warn")

    //3、读取数据文件
    val data: RDD[String] = sc.textFile("E:\\words.txt")

    //4、 切分每一行,获取所有单词
    val words: RDD[String] = data.flatMap(x=>x.split(" "))

    //5、每个单词计为1
    val wordAndOne: RDD[(String, Int)] = words.map(x => (x,1))

    //6、相同单词出现的1累加
    val result: RDD[(String, Int)] = wordAndOne.reduceByKey((x,y)=>x+y)

    //按照单词出现的次数降序排列  第二个参数默认是true表示升序,设置为false表示降序
    val sortedRDD: RDD[(String, Int)] = result.sortBy( x=> x._2,false)

    //7、收集数据打印
    val finalResult: Array[(String, Int)] = sortedRDD.collect()
    finalResult.foreach(println)


    //8、关闭sc
    sc.stop()

  }
}

9.2 利用scala语言开发spark程序实现单词统计–集群运行
  • 代码开发
package com.kaikeba
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

//todo: 利用scala语言开发spark程序实现单词统计
object WordCountOnSpark {
  def main(args: Array[String]): Unit = {
    //1、构建sparkConf对象 设置application名称
    val sparkConf: SparkConf = new SparkConf().setAppName("WordCountOnSpark")

    //2、构建sparkContext对象,该对象非常重要,它是所有spark程序的执行入口
    // 它内部会构建  DAGScheduler和 TaskScheduler 对象
    val sc = new SparkContext(sparkConf)

    //设置日志输出级别
    sc.setLogLevel("warn")

    //3、读取数据文件
    val data: RDD[String] = sc.textFile(args(0))

    //4、 切分每一行,获取所有单词
    val words: RDD[String] = data.flatMap(x=>x.split(" "))

    //5、每个单词计为1
    val wordAndOne: RDD[(String, Int)] = words.map(x => (x,1))

    //6、相同单词出现的1累加
    val result: RDD[(String, Int)] = wordAndOne.reduceByKey((x,y)=>x+y)

    //7、把计算结果保存在hdfs上
    result.saveAsTextFile(args(1))

    //8、关闭sc
    sc.stop()

  }
}
  • 打成jar包提交到集群中运行
spark-submit \
--master spark://node01:7077,node02:7077 \
--class com.kaikeba.WordCountOnSpark \
--executor-memory 1g  \
--total-executor-cores 4 \
original-spark_class01-1.0-SNAPSHOT.jar \
/words.txt  /out
9.3 利用java语言开发spark程序实现单词统计–本地运行
  • 代码开发
package com.kaikeba;

import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.FlatMapFunction;
import org.apache.spark.api.java.function.Function2;
import org.apache.spark.api.java.function.PairFunction;
import scala.Tuple2;

import java.util.Arrays;
import java.util.Iterator;
import java.util.List;

//todo: 利用java语言开发spark的单词统计程序
public class JavaWordCount {
    public static void main(String[] args) {
        //1、创建SparkConf对象
        SparkConf sparkConf = new SparkConf().setAppName("JavaWordCount").setMaster("local[2]");

        //2、构建JavaSparkContext对象
        JavaSparkContext jsc = new JavaSparkContext(sparkConf);

        //3、读取数据文件
        JavaRDD<String> data = jsc.textFile("E:\\words.txt");

        //4、切分每一行获取所有的单词   scala:  data.flatMap(x=>x.split(" "))
        JavaRDD<String> wordsJavaRDD = data.flatMap(new FlatMapFunction<String, String>() {
            public Iterator<String> call(String line) throws Exception {
                String[] words = line.split(" ");
                return Arrays.asList(words).iterator();
            }
        });

        //5、每个单词计为1    scala:  wordsJavaRDD.map(x=>(x,1))
        JavaPairRDD<String, Integer> wordAndOne = wordsJavaRDD.mapToPair(new PairFunction<String, String, Integer>() {
            public Tuple2<String, Integer> call(String word) throws Exception {
                return new Tuple2<String, Integer>(word, 1);
            }
        });

        //6、相同单词出现的1累加    scala:  wordAndOne.reduceByKey((x,y)=>x+y)
        JavaPairRDD<String, Integer> result = wordAndOne.reduceByKey(new Function2<Integer, Integer, Integer>() {
            public Integer call(Integer v1, Integer v2) throws Exception {
                return v1 + v2;
            }
        });

        //按照单词出现的次数降序 (单词,次数)  -->(次数,单词).sortByKey----> (单词,次数)
        JavaPairRDD<Integer, String> reverseJavaRDD = result.mapToPair(new PairFunction<Tuple2<String, Integer>, Integer, String>() {
            public Tuple2<Integer, String> call(Tuple2<String, Integer> t) throws Exception {
                return new Tuple2<Integer, String>(t._2, t._1);
            }
        });

        JavaPairRDD<String, Integer> sortedRDD = reverseJavaRDD.sortByKey(false).mapToPair(new PairFunction<Tuple2<Integer, String>, String, Integer>() {
            public Tuple2<String, Integer> call(Tuple2<Integer, String> t) throws Exception {
                return new Tuple2<String, Integer>(t._2, t._1);
            }
        });

        //7、收集打印
        List<Tuple2<String, Integer>> finalResult = sortedRDD.collect();

        for (Tuple2<String, Integer> t : finalResult) {
            System.out.println("单词:"+t._1 +"\t次数:"+t._2);
        }

        jsc.stop();

    }
}

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

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

相关文章

Sparsely-Gated Mixture-of-Experts Layer (MoE)论文解读与Pytorch代码实现

MoE解析 阅读论文&#xff1a;https://arxiv.org/pdf/1701.06538 OUTRAGEOUSLY LARGE NEURAL NETWORKS:THE SPARSELY-GATED MIXTURE-OF-EXPERTS LAYER 本文介绍了一种名为Sparsely-Gated Mixture-of-Experts Layer (MoE) 的神经网络组件&#xff0c;旨在通过条件计算&#xf…

线性模型 - 支持向量机

支持向量机&#xff08;SVM&#xff09;是一种用于分类&#xff08;和回归&#xff09;的监督学习算法&#xff0c;其主要目标是找到一个最佳决策超平面&#xff0c;将数据点分为不同的类别&#xff0c;并且使得分类边界与最近的数据点之间的间隔&#xff08;margin&#xff09…

利用STM32TIM自制延迟函数实验

一、实验目的 掌握STM32定时器&#xff08;TIM&#xff09;的工作原理及配置方法学习使用HAL库实现微秒级/毫秒级延时函数理解定时器中断服务程序的编写规范 二、实验原理 ​定时器基础&#xff1a; STM32定时器包含向上计数器、向下计数器、中心对齐模式通过预分频器&#x…

mac安装环境

minconda https://docs.anaconda.net.cn/miniconda/install/ 注意在下载下来应该有100多兆&#xff0c;太大了应该是完整版&#xff0c;我们不需要 jdk 镜像网站下载设置环境变量&#xff1a; 终端&#xff1a;sudo vim ~/.zshrc # JDK Config JAVA_HOME/Library/Java/Java…

视觉图像坐标转换

1. 透镜成像 相机的镜头系统将三维场景中的光线聚焦到一个平面&#xff08;即传感器&#xff09;。这个过程可以用小孔成像模型来近似描述&#xff0c;尽管实际相机使用复杂的透镜系统来减少畸变和提高成像质量。 小孔成像模型&#xff1a; 假设有一个理想的小孔&#xff0c;…

计算机毕业设计SpringBoot+Vue.js景区民宿预约系统(源码+文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

【LeetCode: SQL专题 : SQL132 每个题目和每份试卷被作答的人数和次数 + 合并查询】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

动态内容加载的解决方案:Selenium与Playwright对比故障排查实录

方案进程 2024-09-01 09:00 | 接到亚航航班数据采集需求 2024-09-01 11:30 | 首次尝试使用Selenium遭遇Cloudflare验证 2024-09-01 14:00 | 切换Playwright方案仍触发反爬机制 2024-09-01 16:30 | 引入爬虫代理IPUA轮换策略 2024-09-02 10:00 | 双方案完整实现并通过压力测试故…

不同规模企业如何精准选择AI工具: DeepSeek、Grok 和 ChatGPT 三款主流 AI 工具深度剖析与对比

本文深入探讨了最近国内外主流的 DeepSeek、Grok 和 ChatGPT 三款主流 AI 工具的技术细节、性能表现、应用场景及局限性&#xff0c;并从技术能力、功能需求、成本预算、数据安全和合规以及服务与支持五个关键维度&#xff0c;详细分析了不同规模企业在选择 AI 工具时的考量因素…

利用 Python 爬虫进行跨境电商数据采集

1 引言2 代理IP的优势3 获取代理IP账号4 爬取实战案例---&#xff08;某电商网站爬取&#xff09;4.1 网站分析4.2 编写代码4.3 优化代码 5 总结 1 引言 在数字化时代&#xff0c;数据作为核心资源蕴含重要价值&#xff0c;网络爬虫成为企业洞察市场趋势、学术研究探索未知领域…

【数据挖掘】Matplotlib

Matplotlib 是 Python 最常用的 数据可视化 库之一&#xff0c;在数据挖掘过程中&#xff0c;主要用于 数据探索 (EDA)、趋势分析、模式识别 和 结果展示。 &#x1f4cc; 1. Matplotlib 基础 1.1 安装 & 导入 # 如果未安装 Matplotlib&#xff0c;请先安装 # pip instal…

使用Java构建高效的Web服务架构

使用Java构建高效的Web服务架构 随着互联网技术的飞速发展&#xff0c;Web服务在现代应用中扮演着至关重要的角色。尤其是在企业级应用中&#xff0c;如何构建一个高效、可扩展且易维护的Web服务架构&#xff0c;成为了开发者和架构师面临的一项重要挑战。Java作为一种成熟、稳…

数据库MySQL,在终端输入后,提示不是内部命令等

【解决问题】mysql提示不是内部或外部命令&#xff0c;也不是可运行的程序 一般这种问题是因为没有在系统变量里面添加MySQL的可执行路径 以下是添加可执行路径的方法&#xff1a; 第一步&#xff1a;winR输入services.msc 然后找到MySQL&#xff0c;右击属性并复制MySQL的可执…

LabVIEW正弦信号处理:FFT与最小二乘拟合的参数提取

问题一&#xff1a;LabVIEW能否对采集的正弦力信号进行快速傅里叶变换&#xff08;FFT&#xff09;&#xff0c;并得到幅值和相位结果&#xff1f; 答案&#xff1a; 可以。LabVIEW通过内置信号处理工具包提供完整的FFT分析功能&#xff0c;具体实现如下&#xff1a; FFT分析流…

Hive-05之查询 分组、排序、case when、 什么情况下Hive可以避免进行MapReduce

一、目标 掌握hive中select查询语句中的基本语法掌握hive中select查询语句的分组掌握hive中select查询语句中的join掌握hive中select查询语句中的排序 二、要点 1. 基本查询 注意 SQL 语言大小写不敏感SQL 可以写在一行或者多行关键字不能被缩写也不能分行各子句一般要分行…

React:B站评论demo,实现列表渲染、删除按钮显示和功能实现、导航栏渲染切换及高亮显示、评论区的排序

功能要求&#xff1a; 1、渲染评论列表 2、删除评论功能&#xff1a;只显示自己评论的删除按钮&#xff1b;点击删除按钮&#xff0c;删除当前评论&#xff0c;列表中不再显示。 3、渲染导航Tab&#xff08;最新 | 最热&#xff09;和其 高亮实现 4、评论排序功能实现&…

ST表解决RMQ问题

引入 给定你一个长度为n的数组a&#xff0c;再给你q次询问&#xff0c;每次询问给定你一个区间[L,R]&#xff0c;让你求a数组中L~R中的最大值/最小值 我们利用常规算法求时很显然会超时&#xff0c;以此我们需要一个数据结构——ST表来解决 ST表 ST表是一个类似于线段树的东…

[数据结构] - - - 链表

一、定义 链表&#xff1a;是一种常见的线性数据结构&#xff0c;它通过一组节点&#xff08;Node&#xff09;来存储数据&#xff0c;每个节点包含两部分&#xff1a;数据域和指针域。 1.1 链表的基本概念 节点&#xff08;Node&#xff09;&#xff1a;链表的最小单元&#…

Linux的动态库与静态库

目录 动静态库的基本原理 认识动静态库 动静态库各自的特征 静态库 动态库 动静态库与内存 静态库的加载方式 动态库的加载方式 加载到物理内存的细节 静态库的打包与使用 打包 使用 动态库的打包与使用 打包 使用 我以前写的一篇文章中就用网吧与在宿舍自己组装电…

图漾PercipioIPTool软件使用

文章目录 前期准备1.PercipioIPTool软件1.1 更改网络适配器1.2 更改自动获取IP1.3设置静态IP 前期准备 1.一根超五类及其以上规格网线&#xff08;cat5e、cat6…&#xff09; 2.相机&#xff0c;配套网线和IO线 3.配套软件PercipioViewer或者PercipioIPTool软件(Windows环境使…