基于Docker和YARN的大数据环境部署实践最新版

news2025/6/2 7:38:35

基于Docker和YARN的大数据环境部署实践

目的

本操作手册旨在指导用户通过Docker容器技术,快速搭建一个完整的大数据环境。该环境包含以下核心组件:

  • Hadoop HDFS/YARN(分布式存储与资源调度)
  • Spark on YARN(分布式计算)
  • Kafka(消息队列)
  • Hive(数据仓库)
  • JupyterLab(交互式开发环境)

通过清晰的步骤说明和验证方法,读者将掌握:

  1. 容器网络的搭建(Weave)
  2. Docker Compose编排文件编写技巧
  3. 多组件协同工作的配置要点
  4. 集群扩展与验证方法

整体架构

spark-submit
资源分配
执行任务
生产/消费
读写数据
元数据查询
Jupyter
RM
NM1
DN1
Kafka
Spark
HDFS
Hive
MySQL

组件功能表

组件名称功能描述依赖服务端口配置数据存储
Hadoop NameNodeHDFS元数据管理9870 (Web UI), 8020Docker卷: hadoop_namenode
Hadoop DataNodeHDFS数据存储节点NameNode9864 (数据传输)本地卷或Docker卷
YARN ResourceManager资源调度与管理NameNode8088 (Web UI), 8032
YARN NodeManager单个节点资源管理ResourceManager8042 (Web UI)
Spark (YARN模式)分布式计算框架YARN ResourceManager集成在YARN中
JupyterLab交互式开发环境Spark, YARN8888 (Web UI)本地目录挂载
Kafka分布式消息队列ZooKeeper9092 (Broker)Docker卷:kafka_data、kafka_logs
Hive数据仓库服务HDFS, MySQL10000 (HiveServer2)MySQL存储元数据
MySQL存储Hive元数据3306Docker卷: mysql_data
ZooKeeper分布式协调服务(Kafka依赖)2181Docker卷:zookeeper_data

关键交互流程

  1. 数据存储

    • HDFS通过NameNode管理元数据,DataNode存储实际数据。
    • JupyterLab通过挂载本地目录访问数据,同时可读写HDFS。
  2. 资源调度

    • Spark作业通过YARN ResourceManager申请资源,由NodeManager执行任务。
  3. 数据处理

    • Kafka接收实时数据流,Spark消费后进行实时计算。
    • Hive通过HDFS存储表数据,元数据存储在MySQL。

环境搭建步骤

1. 容器网络准备(Weave)

# 安装Weave网络插件
sudo curl -L git.io/weave -o /usr/local/bin/weave
sudo chmod +x /usr/local/bin/weave
# 启动Weave网络
weave launch
# 验证网络状态
weave status
#在其他节点上运行
weave launch 主节点IP

2. Docker Compose编排文件

创建 docker-compose.yml,核心配置如下:

version: "3.8"

services:
  # ZooKeeper
  zookeeper-1:
    image: bitnami/zookeeper:3.8.0
    privileged: true  #使用二进制文件安装的docker需要开启特权模式,每个容器都需要开启该模式
    container_name: zookeeper-1
    hostname: zookeeper-1
    ports:
      - "2181:2181"
    environment:
      - ALLOW_ANONYMOUS_LOGIN=yes
      - TZ=Asia/Shanghai
    volumes:
      - zookeeper_data:/bitnami/zookeeper
    networks:
      - bigdata-net
    dns:
      - 172.17.0.1
    restart: always
    logging:
      driver: "json-file"
      options:
        max-size: "100m"
        max-file: "7"

  # Kafka
  kafka-1:
    image: bitnami/kafka:3.3.1
    container_name: kafka-1
    hostname: kafka-1
    environment:
      - KAFKA_BROKER_ID=1
      - KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper-1:2181
      - ALLOW_PLAINTEXT_LISTENER=yes
      - TZ=Asia/Shanghai
    ports:
      - "9092:9092"
    volumes:
      - kafka_data:/bitnami/kafka    # Kafka数据持久化
      - kafka_logs:/kafka-logs  # 独立日志目录
    depends_on:
      - zookeeper-1
    networks:
      - bigdata-net
    dns:
      - 172.17.0.1
    restart: always
    logging:
      driver: "json-file"
      options:
        max-size: "100m"
        max-file: "7"

  # Hadoop HDFS
  hadoop-namenode:
    image: bde2020/hadoop-namenode:2.0.0-hadoop3.2.1-java8
    container_name: hadoop-namenode
    hostname: hadoop-namenode
    environment:
      - CLUSTER_NAME=bigdata
      - CORE_CONF_fs_defaultFS=hdfs://hadoop-namenode:8020
      - HDFS_CONF_dfs_replication=2
      - TZ=Asia/Shanghai
    ports:
      - "9870:9870"
      - "8020:8020"
    networks:
      - bigdata-net
    dns:
      - 172.17.0.1
    volumes:
      - hadoop_namenode:/hadoop/dfs/name
    restart: always

  hadoop-datanode:
    image: bde2020/hadoop-datanode:2.0.0-hadoop3.2.1-java8
    container_name: hadoop-datanode
    hostname: hadoop-datanode
    environment:
      - CORE_CONF_fs_defaultFS=hdfs://hadoop-namenode:8020
      - HDFS_CONF_dfs_replication=2
      - TZ=Asia/Shanghai
    depends_on:
      - hadoop-namenode
    networks:
      - bigdata-net
    dns:
      - 172.17.0.1
    restart: always
    logging:
      driver: "json-file"
      options:
        max-size: "100m"
        max-file: "7"

  # YARN
  hadoop-resourcemanager:
    image: bde2020/hadoop-resourcemanager:2.0.0-hadoop3.2.1-java8
    container_name: hadoop-resourcemanager
    hostname: hadoop-resourcemanager
    ports:
      - "8088:8088"  # YARN Web UI
    environment:
      - CORE_CONF_fs_defaultFS=hdfs://hadoop-namenode:8020
      - YARN_CONF_yarn_resourcemanager_hostname=hadoop-resourcemanager
      - TZ=Asia/Shanghai
    depends_on:
      - hadoop-namenode
    networks:
      - bigdata-net
    dns:
      - 172.17.0.1
    restart: always
    logging:
      driver: "json-file"
      options:
        max-size: "100m"
        max-file: "7"

  hadoop-nodemanager:
    image: bde2020/hadoop-nodemanager:2.0.0-hadoop3.2.1-java8
    container_name: hadoop-nodemanager
    hostname: hadoop-nodemanager
    environment:
      - CORE_CONF_fs_defaultFS=hdfs://hadoop-namenode:8020
      - YARN_CONF_yarn_resourcemanager_hostname=hadoop-resourcemanager
      - TZ=Asia/Shanghai
    depends_on:
      - hadoop-resourcemanager
    networks:
      - bigdata-net
    dns:
      - 172.17.0.1
    volumes:
      - ./hadoop-conf/yarn-site.xml:/etc/hadoop/yarn-site.xml  # 挂载主节点的Hadoop配置文件,用于上报内存与cpu核心数
    restart: always
    logging:
      driver: "json-file"
      options:
        max-size: "100m"
        max-file: "7"

  # Hive
  hive:
    image: bde2020/hive:2.3.2
    container_name: hive
    hostname: hive
    environment:
      - HIVE_METASTORE_URI=thrift://hive:9083
      - SERVICE_PRECONDITION=hadoop-namenode:8020,mysql:3306
      - TZ=Asia/Shanghai
    ports:
      - "10000:10000"
      - "9083:9083"
    depends_on:
      - hadoop-namenode
      - mysql
    networks:
      - bigdata-net
    dns:
      - 172.17.0.1
    restart: always
    logging:
      driver: "json-file"
      options:
        max-size: "100m"
        max-file: "7"

  # MySQL
  mysql:
    image: mysql:8.0
    container_name: mysql
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=metastore
      - TZ=Asia/Shanghai
    ports:
      - "3306:3306"
    networks:
      - bigdata-net
    dns:
      - 172.17.0.1
    volumes:
      - mysql_data:/var/lib/mysql
    restart: always
    logging:
      driver: "json-file"
      options:
        max-size: "100m"
        max-file: "7"

  # JupyterLab(集成Spark on YARN)
  jupyter:
    image: jupyter/all-spark-notebook:latest
    container_name: jupyter-lab
    environment:
      - JUPYTER_ENABLE_LAB=yes
      - TZ=Asia/Shanghai
      - SPARK_OPTS="--master yarn --deploy-mode client"  # 默认使用YARN模式
      - HADOOP_CONF_DIR=/etc/hadoop/conf  # 必须定义
      - YARN_CONF_DIR=/etc/hadoop/conf    # 必须定义
    ports:
      - "8888:8888"
    volumes:
      - ./notebooks:/home/jovyan/work
      - /path/to/local/data:/data
      - ./hadoop-conf:/etc/hadoop/conf  # 挂载Hadoop配置文件,./hadoop-conf代表在docker-compose.yml同目录下的hadoop-conf
    networks:
      - bigdata-net
    dns:
      - 172.17.0.1
    depends_on:
      - hadoop-resourcemanager
      - hadoop-namenode
    restart: always
    logging:
      driver: "json-file"
      options:
        max-size: "100m"
        max-file: "7"

volumes:
  hadoop_namenode:
  mysql_data:
  zookeeper_data:
  kafka_data:
  kafka_logs:
  hadoop-nodemanager:
  

networks:
  bigdata-net:
    external: true
    name: weave

Hadoop配置文件

yarn-site.xml:

<configuration>
  <property>
    <name>yarn.resourcemanager.hostname</name>
    <value>hadoop-resourcemanager</value>
  </property>
  <property>
    <name>yarn.resourcemanager.address</name>
    <value>hadoop-resourcemanager:8032</value>
  </property>
  <property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
  </property>
</configuration>

core-site.xml:

<configuration>
  <property>
    <name>fs.defaultFS</name>
    <value>hdfs://hadoop-namenode:8020</value>
  </property>
</configuration>

将这两个文件放置到hadoop-conf目录下。

3. 启动服务

# 启动容器
docker-compose up -d

# 查看容器状态
docker-compose ps

4. 验证服务是否可用

验证HDFS
(1) 访问HDFS Web UI
  • 操作:浏览器打开 http://localhost:9870

  • 预期结果

    Overview 页面显示HDFS总容量。

    Datanodes 显示至少1个活跃节点(对应 hadoop-datanode 容器)。

(2) 命令行操作HDFS
docker exec -it hadoop-namenode bash
# 创建测试目录
hdfs dfs -mkdir /test
# 上传本地文件
echo "hello hdfs" > test.txt
hdfs dfs -put test.txt /test/
# 查看文件
hdfs dfs -ls /test
#解除安全模式
hdfs dfsadmin -safemode leave
  • 预期结果:成功创建目录、上传文件并列出文件。

如图所示:
在这里插入图片描述


** 验证YARN**
(1) 访问YARN ResourceManager Web UI
  • 操作:浏览器打开 http://localhost:8088
  • 预期结果
    • Cluster Metrics 显示总资源(如内存、CPU)。
    • Nodes 显示至少1个NodeManager(对应 hadoop-nodemanager 容器)。
(2) 提交测试作业到YARN
# 进入Jupyter容器提交Spark作业
docker exec -it jupyter-lab bash
# 提交Spark Pi示例作业
spark-submit --master yarn --deploy-mode client --class org.apache.spark.examples.SparkPi /usr/local/spark/examples/jars/spark-examples_*.jar 10
  • 预期结果
    • 作业输出中包含 Pi is roughly 3.14
    • 在YARN Web UI (http://localhost:8088) 中看到作业状态为 SUCCEEDED

如图所示:
在这里插入图片描述

若是出现报错:Permission denied: user=jovyan, access=WRITE, inode=“/user”:root:supergroup:drwxr-xr-x

报错原因:

当前运行 Spark 的用户是:jovyan(Jupyter 默认用户);

Spark 提交任务后,会自动尝试在 HDFS 上创建目录 /user/jovyan

但是:这个目录不存在,或者 /user 目录不允许 jovyan 写入;

所以 HDFS 拒绝创建临时目录,导致整个作业提交失败;

解决方法

创建目录并赋权

进入NameNode 容器:

docker exec -it hadoop-namenode bash

然后执行 HDFS 命令:

hdfs dfs -mkdir -p /user/jovyan
hdfs dfs -chown jovyan:supergroup /user/jovyan

这一步允许 jovyan 用户有权写入自己的临时目录。

提示:可以先执行 hdfs dfs -ls /user 看是否有 jovyan 子目录。


最后:再次执行 spark-submit 后,可以看到

  1. 控制台打印:

    Submitting application application_xxx to ResourceManager
    
  2. YARN 8088 页面:

    • 出现作业记录;
    • 状态为 RUNNINGFINISHED
验证Spark on YARN(通过JupyterLab)
(1) 访问JupyterLab
  • 操作:浏览器打开 http://localhost:8888,使用Token登录(通过 docker logs jupyter-lab 获取Token)。
  • 预期结果:成功进入JupyterLab界面。
(2) 运行PySpark代码

在Jupyter中新建Notebook,执行以下代码:

from pyspark.sql import SparkSession
spark = SparkSession.builder \
    .appName("jupyter-yarn-test") \
    .getOrCreate()

# 测试Spark Context
print("Spark Version:", spark.version)
print("YARN Cluster Mode:", spark.sparkContext.master)

# 读取HDFS文件
df = spark.read.text("hdfs://hadoop-namenode:8020/test/test.txt")
df.show()

# 读取数据
local_df = spark.read.csv("/data/example.csv", header=True)  # 替换为实际文件路径
local_df.show()
  • 预期结果
    • 输出Spark版本和YARN模式(如 yarn)。
    • 成功读取HDFS文件并显示内容 hello hdfs
    • 成功读取CSV文件(需提前放置测试文件)。

如图所示:
在这里插入图片描述

验证Hive
(1) 创建Hive表并查询
#使用docker cp命令将jdbc驱动放入容器内部,示例:
docker cp mysql-connector-java-8.0.12.jar 容器ID或容器名称:/opt/hive/lib
docker exec -it hive bash
#重新初始化 Hive Metastore
schematool -dbType mysql -initSchema --verbose
#查询MetaStore运行状态
ps -ef | grep MetaStore
# 启动Hive Beeline客户端
beeline -u jdbc:hive2://localhost:10000 -n root

//驱动下载链接:https://downloads.mysql.com/archives/c-j/

若是执行上述命令报错,可以按照以下步骤来进行更改

1、配置hive-site.xml文件:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?><!--
   Licensed to the Apache Software Foundation (ASF) under one or more
   contributor license agreements.  See the NOTICE file distributed with
   this work for additional information regarding copyright ownership.
   The ASF licenses this file to You under the Apache License, Version 2.0
   (the "License"); you may not use this file except in compliance with
   the License.  You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
--><configuration>
<property>
        <name>javax.jdo.option.ConnectionURL</name>
        <value>jdbc:mysql://192.168.0.78:3306/metastore_db?createDatabaseIfNotExist=true</value>
        <description>JDBC connect string for a JDBC metastore</description>
    </property>

    <property>
        <name>javax.jdo.option.ConnectionDriverName</name>
        <value>com.mysql.cj.jdbc.Driver</value>
    </property> 
         
    <property>
        <name>javax.jdo.option.ConnectionUserName</name>
        <value>root</value>
    </property>
             
    <property>
        <name>javax.jdo.option.ConnectionPassword</name>
        <value>root</value>
    </property>
    
    <!-- Metastor-->rash
    <property> 
        <name>hive.metastore.uris</name>
        <value>thrift://localhost:9083</value>
    </property>

    <property>
        <name>hive.metastore.warehouse.dir</name>
        <value>/user/hive/warehouse</value>
    </property>
    <property>
        <name>hive.server2.thrift.bind.host</name>
        <value>0.0.0.0</value>
    </property>

    <property>
        <name>hive.server2.thrift.port</name>
        <value>10000</value>
    </property>

</configuration>

//将此配置使用docker cp命令拷贝至hive容器内的/opt/hive/conf目录下。

2、配置core-site.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License. See accompanying LICENSE file.
-->

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

<configuration>
<property><name>fs.defaultFS</name><value>hdfs://hadoop-namenode:8020</value></property>
</configuration>

//hadoop-namenode容器IP可以在宿主机执行weave ps 命令获取,配置文件修改完毕后通过docker cp命令将文件拷贝至hive容器内的/opt/hadoop-2.7.4/etc/hadoop目录与/opt/hive/conf目录。

启动metastore

#在hive容器内部执行
hive --service metastore &

启动hiveserver2

#在hive容器内部执行(执行此命令需要先关闭hadoo-namenode的安全模式)
hive --service hiveserver2 --hiveconf hive.root.logger=DEBUG,console

执行HQL:

CREATE TABLE test_hive (id INT, name STRING);
INSERT INTO test_hive VALUES (1, 'hive-test');
SELECT * FROM test_hive;
  • 预期结果:输出 1, hive-test
(2) 验证MySQL元数据
docker exec -it mysql mysql -uroot -proot
use metastore_db;
SELECT TBL_NAME FROM TBLS;
  • 预期结果:显示 test_hive 表名。

如图所示:
在这里插入图片描述

验证Kafka
(1) 生产与消费消息
docker exec -it kafka-1 bash
# 创建主题
kafka-topics.sh --create --topic test-topic --bootstrap-server localhost:9092
# 生产消息
echo "hello kafka" | kafka-console-producer.sh --topic test-topic --bootstrap-server localhost:9092
# 消费消息(需另开终端)
kafka-console-consumer.sh --topic test-topic --from-beginning --bootstrap-server localhost:9092
  • 预期结果:消费者终端输出 hello kafka

如图所示:
在这里插入图片描述

** 验证本地数据挂载**

在JupyterLab中:

  1. 左侧文件浏览器中检查 /home/jovyan/work(对应本地 ./notebooks 目录)。
  2. 检查 /data 目录是否包含本地挂载的文件(例如 /path/to/local/data 中的内容)。
子节点设置
version: "3.8"

services:
  # HDFS DataNode 服务
  hadoop-datanode:
    image: bde2020/hadoop-datanode:2.0.0-hadoop3.2.1-java8
    privileged: true  #使用二进制文件安装的docker需要开启特权模式,每个容器都需要开启该模式
    container_name: hadoop-datanode-2  # 子节点容器名称唯一(例如按编号命名)
    hostname: hadoop-datanode-2
    environment:
      - CORE_CONF_fs_defaultFS=hdfs://hadoop-namenode:8020  # 指向主节点NameNode
      - HDFS_CONF_dfs_replication=2
      - TZ=Asia/Shanghai
    networks:
      - bigdata-net
    dns:
      - 172.17.0.1
    volumes:
      - ./hadoop-conf:/etc/hadoop/conf  # 挂载主节点的Hadoop配置文件
    restart: always
#    extra_hosts:
#      - "hadoop-namenode:10.32.0.32"
    logging:
      driver: "json-file"
      options:
        max-size: "100m"
        max-file: "5"

  # YARN NodeManager 服务
  hadoop-nodemanager:
    image: bde2020/hadoop-nodemanager:2.0.0-hadoop3.2.1-java8
    privileged: true  #使用二进制文件安装的docker需要开启特权模式,每个容器都需要开启该模式
    container_name: hadoop-nodemanager-2  # 子节点容器名称唯一
    hostname: hadoop-nodemanager-2
    environment:
      - YARN_CONF_yarn_resourcemanager_hostname=hadoop-resourcemanager  # 指向主节点ResourceManager
      - CORE_CONF_fs_defaultFS=hdfs://hadoop-namenode:8020
      - TZ=Asia/Shanghai
    networks:
      - bigdata-net
    dns:
      - 172.17.0.1
    volumes:
      - ./hadoop-conf/yarn-site.xml:/etc/hadoop/yarn-site.xml  # 挂载主节点的Hadoop配置文件,用于上报内存与cpu核心数
    depends_on:
      - hadoop-datanode  # 确保DataNode先启动(可选)
    restart: always
    logging:
      driver: "json-file"
      options:
        max-size: "100m"
        max-file: "5"

# 共享网络配置(必须与主节点一致)
networks:
  bigdata-net:
    external: true
    name: weave  # 使用主节点创建的Weave网络

yarn配置文件

<configuration>
  <property>
    <name>yarn.resourcemanager.hostname</name>
    <value>hadoop-resourcemanager</value>
  </property>
  <property>
    <name>yarn.resourcemanager.address</name>
    <value>hadoop-resourcemanager:8032</value>
  </property>
  <property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
  </property>
  <property>
    <name>yarn.nodemanager.resource.memory-mb</name>
    <value>4096</value>
  </property>
  <property>
    <name>yarn.nodemanager.resource.cpu-vcores</name>
    <value>8</value>
  </property>
</configuration>

Ps:内存大小和cpu核心数需要按照实际情况填写。
#######################################################################################
今日推荐
小说:《异种的营养是牛肉的六倍?》
简介:【异种天灾】+【美食】+【日常】 变异生物的蛋白质是牛肉的几倍? 刚刚来到这个世界,刘笔就被自己的想法震惊到了。 在被孢子污染后的土地上觉醒了神厨系统,是不是搞错了什么?各种变异生物都能做成美食吗? 那就快端上来罢! 安全区边缘的特色美食饭店,有点非常规的温馨美食日常。
在这里插入图片描述

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

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

相关文章

【大模型】Bert

一、背景与起源 上下文建模的局限&#xff1a;在 BERT 之前&#xff0c;诸如 Word2Vec、GloVe 等词向量方法只能给出静态的词表示&#xff1b;而基于单向或浅层双向 LSTM/Transformer 的语言模型&#xff08;如 OpenAI GPT&#xff09;只能捕捉文本从左到右&#xff08;或右到…

3 分钟学会使用 Puppeteer 将 HTML 转 PDF

需求背景 1、网页存档与文档管理 需要将网页内容长期保存或归档为PDF,确保内容不被篡改或丢失,适用于法律文档、合同、技术文档等场景。PDF格式便于存储和检索。 2、电子报告生成 动态生成的HTML内容(如数据分析报告、仪表盘)需导出为PDF供下载或打印。PDF保留排版和样…

速通《Sklearn 与 TensorFlow 机器学习实用指南》

1.机器学习概览 1.1 什么是机器学习 机器学习是通过编程让计算机从数据中进行学习的科学。 1.2 为什么使用机器学习&#xff1f; 使用机器学习&#xff0c;是为了让计算机通过数据自动学习规律并进行预测或决策&#xff0c;无需显式编程规则。 1.3 机器学习系统的类型 1.…

Ubuntu 下搭建ESP32 ESP-IDF开发环境,并在windows下用VSCode通过SSH登录Ubuntu开发ESP32应用

Ubuntu 下搭建ESP32 ESP-IDF开发环境&#xff0c;网上操作指南很多&#xff0c;本来一直也没有想过要写这么一篇文章。因为我其实不太习惯在linux下开发应用&#xff0c;平时更习惯windows的软件操作&#xff0c;只是因为windows下开发ESP32的应用编译时太慢&#xff0c;让人受…

NodeMediaEdge接入NodeMediaServer

如何使用NME接入NMS 简介 NodeMediaEdge是一款部署在监控摄像机网络前端中&#xff0c;拉取Onvif或者rtsp/rtmp/http视频流并使用rtmp/kmp推送到公网流媒体服务器的工具。 通过云平台协议注册到NodeMediaServer后&#xff0c;可以同NodeMediaServer结合使用。使用图形化的管理…

【Java基础-环境搭建-创建项目】IntelliJ IDEA创建Java项目的详细步骤

在Java开发的世界里&#xff0c;选择一个强大的集成开发环境&#xff08;IDE&#xff09;是迈向高效编程的第一步。而IntelliJ IDEA无疑是Java开发者中最受欢迎的选择之一。它以其强大的功能、智能的代码辅助和简洁的用户界面&#xff0c;帮助无数开发者快速构建和部署Java项目…

PHP7+MySQL5.6 查立得源码授权系统DNS验证版

# PHP7MySQL5.6 查立得源码授权系统DNS验证版 ## 一、系统概述 本系统是一个基于PHP7和MySQL5.6的源码授权系统&#xff0c;使用DNS TXT记录验证域名所有权&#xff0c;实现对软件源码的授权保护。 系统支持多版本管理&#xff0c;可以灵活配置不同版本的价格和下载路径&#…

【QQ音乐】sign签名| data参数加密 | AES-GCM加密 | webpack (下)

1.目标 网址&#xff1a;https://y.qq.com/n/ryqq/toplist/26 我们知道了 sign P(n.data)&#xff0c;其中n.data是明文的请求参数 2.webpack生成data加密参数 那么 L(n.data)就是密文的请求参数。返回一个Promise {<pending>}&#xff0c;所以L(n.data) 是一个异步函数…

3D虚拟工厂

1、在线体验 3D虚拟工厂在线体验 vue3three.jsblender 2、功能介绍 1. 全屏显示功能2. 镜头重置功能3. 企业概况信息模块4. 标签隐藏/显示功能5. 模型自动旋转功能6. 办公楼分层分解展示7. 白天/夜晚 切换8. 场景资源预加载功能9. 晴天/雨天/雾天10. 无人机视角模式11. 行人…

http传输协议的加密

创建目录存放签证 [rootserver100 ~]# mkdir /etc/nginx/certs [rootserver100 ~]# openssl req -newkey rsa:2048 -nodes -sha256 -keyout /etc/nginx/certs/timinglee.org.key -x509 -days 365 -out /etc/nginx/certs/timinglee.org.crt ..................................…

半导体晶圆制造洁净厂房的微振控制方案-江苏泊苏系统集成有限公司

半导体晶圆制造洁净厂房的微振控制方案-江苏泊苏系统集成有限公司 微振控制在现行国家标准《电子工业洁净厂房设计规范》GB50472中有关微振控制的规定主要有&#xff1a;洁净厂房的微振控制设施的设计分阶段进行&#xff0c;应包括设计、施工和投产等各阶段的微振测试、厂房建…

常见压缩算法性能和压缩率对比 LZ4 LZO ZSTD SNAPPY

网传压缩算法对比表 算法压缩率压缩速度解压速度支持流式压缩适用场景LZ4低极快极快是实时数据压缩、日志压缩、内存缓存等Zstandard高快快是文件压缩、网络传输、数据库备份等Brotli很高中等快是静态资源压缩&#xff08;HTML、CSS、JS&#xff09;等LZO低极快快是嵌入式系统…

Spring Boot 应用中实现配置文件敏感信息加密解密方案

Spring Boot 应用中实现配置文件敏感信息加密解密方案 背景与挑战 &#x1f6a9;一、设计目标 &#x1f3af;二、整体启动流程 &#x1f504;三、方案实现详解 ⚙️3.1 配置解密入口&#xff1a;EnvironmentPostProcessor3.2 通用解密工具类&#xff1a;EncryptionTool 四、快速…

【TTS】基于GRPO的流匹配文本到语音改进:F5R-TTS

论文地址&#xff1a;https://arxiv.org/abs/2504.02407v3 摘要 我们提出了F5R-TTS&#xff0c;这是一种新颖的文本到语音(TTS)系统&#xff0c;它将群体相对策略优化(GRPO)集成到基于流匹配的架构中。 通过将流匹配TTS的确定性输出重新表述为概率高斯分布&#xff0c;我们的方…

动态规划-152.乘积最大子数组-力扣(LeetCode)

一、题目解析 根据示例nums数组中存在负数&#xff0c;下面分析时需注意 二、算法原理 1、状态表示 此时f[i]表示&#xff1a;以i位置为结尾的所有子数组中的最大乘积&#xff0c;但是由于nums中存在负数&#xff0c;所以还需要g[i]表示&#xff1a;以i位置为结尾的所有子数组…

1-1 初探Dart编程语言

Dart 是 Google 最初开发的一种开源编程语言&#xff0c;适用于客户端与服务端开发。它配套提供 Dart SDK&#xff0c;其中包含 Dart 编译器、Dart 虚拟机&#xff08;Dart VM&#xff09;以及一个名为 dart2js 的工具&#xff0c;可将 Dart 脚本转换为 JavaScript&#xff0c;…

搭建最新版开源监控平台SigNoz踩的坑

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权并注明出处。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 一、前言 SigNoz 是一款开源应用程序性能监控工具&#xff0c;在往期相关文章&#xff08;文末有链接&#xff09;中…

无人机多人协同控制技术解析

一、运行方式 无人机多人点对点控制通常采用以下两种模式&#xff1a; 1. 主从控制模式 指定一个主控用户拥有最高优先级&#xff0c;负责飞行路径规划、紧急操作等关键指令&#xff1b;其他用户作为观察者&#xff0c;仅能查看实时画面或提交辅助指令&#xff0c;需经主…

【东枫科技】KrakenSDR 测向快速入门指南

本快速入门指南旨在帮助您使用运行在 Raspberry Pi 4/5 或 Orange Pi 5B (OPI5B)&#xff08;带 WiFi 型号&#xff09;上的 KrakenSDR 尽快连接到测向应用程序。不过&#xff0c;请务必阅读本手册的其余部分&#xff0c;以了解无线电测向的工作原理。 你需要什么 本指南假设…

【Redis】hash

Hash 哈希 几乎所有的主流编程语言都提供了哈希&#xff08;hash&#xff09;类型&#xff0c;它们的叫法可能是哈希、字典、关联数组、映射等。在 Redis 中&#xff0c;哈希类型指值本身又是一个键值对结构&#xff0c;形如 key “key”, value {{field1, value1}, …{field…