Hive 面试题(五)

news2026/4/2 12:35:37

1. 简述分区表和分桶表的区别 ?

分区表(Partitioned Table)和分桶表(Bucketed Table)都是Hive中用于优化查询性能的数据组织方式,但它们在概念和用途上有所不同:

分区表(Partitioned Table):
  • 定义:分区表是按照表中的某些列的值将数据分割成不同的部分,每个部分称为一个分区。
  • 目的:分区的主要目的是便于管理和优化查询,尤其是对于大型表,可以提高查询效率,因为查询可以仅针对相关分区执行,而无需扫描整个表。
  • 创建:创建分区表时,需要指定分区键,这些键通常是表中的一列或多列。
  • 存储:每个分区在HDFS上有自己的目录结构,数据按照分区键的值被物理分隔开。
  • 查询:查询时可以指定分区条件,Hive仅会读取相关的分区目录,从而减少数据扫描范围。
分桶表(Bucketed Table):
  • 定义:分桶表是将数据均匀地分散到预定数量的桶中,每个桶内的数据根据特定的列(桶列)进行哈希分配。
  • 目的:分桶的主要目的是为了优化诸如JOIN这类需要数据重组的操作,它可以减少数据倾斜和提高JOIN操作的性能。
  • 创建:创建分桶表时,需要指定桶的数量和用于确定桶分配的列(桶列)。
  • 存储:数据在HDFS上按照桶进行存储,每个桶内的数据是有序的,但不同桶之间的数据顺序是不确定的。
  • 查询:在执行JOIN操作时,如果两个表都按照相同的列进行分桶,并且JOIN键与桶列匹配,Hive可以执行Map端的JOIN,从而提高效率。
主要区别:
  • 物理存储:分区表的物理存储是按照分区键的值来分隔的,而分桶表则是按照桶列的哈希值来分配数据到不同的桶中。
  • 查询优化:分区表主要优化了查询时的数据扫描范围,而分桶表主要优化了JOIN操作的性能。
  • 使用场景:分区表适用于数据按时间或某个分类字段自然划分的场景,分桶表适用于需要频繁进行JOIN操作的场景,尤其是当JOIN键与桶列相同时。
  • 数据顺序:分桶表中,每个桶内的数据是有序的,而分区表内的数据顺序取决于数据写入的方式。

总的来说,分区和分桶是两种互补的数据组织方式,它们可以根据不同的查询需求和数据特性来选择使用,以提高Hive表的性能。

2. 简述Hive优化相关措施 ?

Hive 优化是提高查询性能和降低资源消耗的重要手段。以下是一些常见的 Hive 优化措施:

  1. 合理设计表结构

    • 使用合适的分区和分桶策略,可以减少查询时需要扫描的数据量。
    • 选择合适的列式存储格式,如 ORC 或 Parquet,可以提高数据读写效率。
  2. 索引优化

    • 为经常作为查询条件的列创建索引,加快查询速度。
  3. 查询重写

    • 重写查询逻辑,避免不必要的笛卡尔乘积和全表扫描。
    • 使用子查询、连接或其他查询技术来优化数据访问。
  4. 合理使用 MapReduce 参数

    • 调整 MapReduce 作业的配置参数,如 mapreduce.map.memory.mbmapreduce.reduce.memory.mb 等,以优化作业性能。
  5. 使用 Hive 自带的优化器

    • 利用 Hive 的优化器,如谓词下推、列裁剪、分区裁剪等,减少数据的处理量。
  6. 合理设置 Reducer 数量

    • 根据数据量和集群资源合理设置 mapreduce.job.reduces 参数,以优化数据的 Shuffle 和 Sort 过程。
  7. 利用 Hive 内置函数

    • 使用 Hive 内置的函数,如 COUNT(DISTINCT x),可以利用 Hive 的优化措施来提高性能。
  8. 使用合适的 Join 类型

    • 根据数据大小和特性选择合适的 Join 类型,如 Map Join、Bucket Map Join、Skew Join 等。
  9. 资源管理

    • 利用 YARN 的资源管理功能,合理分配内存和 CPU 资源给 Hive 作业。
  10. 物化视图

    • 创建物化视图来存储复杂查询的结果,加快后续查询的速度。
  11. 数据倾斜处理

    • 识别并处理数据倾斜问题,通过调整数据分布或使用特定的 Join 策略来平衡负载。
  12. 统计信息收集

    • 定期运行 ANALYZE TABLE 命令收集表的统计信息,帮助 Hive 优化器做出更好的执行计划。
  13. 避免数据转换

    • 尽量避免在查询中进行复杂的数据转换,这会增加计算负担。
  14. 使用 Tez 或 Spark

    • 考虑使用 Tez 或 Spark 作为 Hive 的执行引擎,它们通常比传统的 MapReduce 更高效。
  15. 监控和调优

    • 使用 Hive 的监控和日志工具来分析查询性能,根据分析结果进行调优。

通过实施这些优化措施,可以显著提高 Hive 查询的性能,减少执行时间和资源消耗,从而更高效地处理大规模数据。

3. 简述Hive的数据类型 ?

Hive的数据类型分为两大类:原始数据类型和复杂数据类型。

原始数据类型(Primitive Data Types):

这些是Hive中最基础的数据类型,包括:

  1. 整型

    • TINYINT:1字节整数
    • SMALLINT:2字节整数
    • INT:4字节整数
    • BIGINT:8字节整数
  2. 浮点型

    • FLOAT:4字节浮点数
    • DOUBLE:8字节浮点数
    • DECIMALNUMERIC:任意精度的定点数
  3. 字符串类型

    • STRING:字符序列
  4. 二进制类型

    • BINARY:二进制序列
  5. 布尔类型

    • BOOLEAN:逻辑值,TRUEFALSE
  6. 日期和时间类型

    • DATE:日期
    • TIMESTAMP:日期和时间戳
  7. 复杂数字类型(Hive 0.13及以上版本支持):

    • VARCHAR:可变长度的字符串,具有最大长度限制
复杂数据类型(Complex Data Types):

这些数据类型允许用户在Hive中存储更复杂的数据结构:

  1. 数组类型(Array):

    • ARRAY<element_type>:元素类型相同的元素集合
  2. 映射类型(Map):

    • MAP<KEY_TYPE, VALUE_TYPE>:键值对集合,其中键和值具有特定的类型
  3. 结构类型(Struct):

    • STRUCT<name1:Type1, name2:Type2, ...>:具有命名字段的复杂数据结构
  4. 联合类型(Union):

    • UNIONTYPE<type1, type2, ...>:Hive 0.14及以上版本支持,允许字段可以是多种类型之一
特殊数据类型:

除了原始和复杂数据类型,Hive还提供了一些特殊的数据类型,用于处理特定的数据:

  1. VOID类型

    • 用于某些Hive内置函数的返回类型,如COUNT(DISTINCT ...)
  2. INTERVAL类型(Hive 0.13及以上版本支持):

    • 用于表示时间间隔。
使用数据类型时的注意事项:
  • 选择合适的数据类型可以提高查询性能和存储效率。
  • 复杂数据类型为存储和处理结构化或半结构化数据提供了灵活性。
  • 某些函数和操作可能对数据类型的使用有特定的限制。

Hive的数据类型设计得非常灵活,以支持从简单的数值和字符串到复杂的嵌套数据结构的各种数据存储需求。

4. 简述Hive的DDL操作 ?

在 Hive 中,DDL(Data Definition Language,数据定义语言)操作用于定义和管理数据库和表的结构。以下是 Hive DDL 的一些基本操作:

  1. 创建数据库

    CREATE DATABASE IF NOT EXISTS db_name COMMENT 'Database description';
    
  2. 删除数据库

    DROP DATABASE IF EXISTS db_name CASCADE|RESTRICT;
    
  3. 使用数据库

    USE db_name;
    
  4. 创建表

    CREATE TABLE IF NOT EXISTS table_name (
      column1_name column1_datatype,
      column2_name column2_datatype,
      ...
    ) COMMENT 'Table description';
    
  5. 创建外部表

    CREATE EXTERNAL TABLE IF NOT EXISTS external_table_name (
      column1_name column1_datatype,
      column2_name column2_datatype,
      ...
    ) COMMENT 'External table description';
    
  6. 删除表

    DROP TABLE IF EXISTS table_name;
    
  7. 修改表结构

    • 添加列:
      ALTER TABLE table_name ADD COLUMNS (new_column_name new_column_datatype);
      
    • 删除列:
      ALTER TABLE table_name DROP COLUMNS column_name;
      
    • 重命名列:
      ALTER TABLE table_name CHANGE old_column_name new_column_name new_column_datatype;
      
  8. 修改表属性

    ALTER TABLE table_name SET TBLPROPERTIES (property_name=property_value);
    ALTER TABLE table_name UNSET TBLPROPERTIES (property_name);
    
  9. 创建分区表

    CREATE TABLE IF NOT EXISTS partitioned_table_name (
      column_name column_datatype
    ) PARTITIONED BY (partition_column partition_datatype);
    
  10. 添加/删除分区

    • 添加分区:
      ALTER TABLE partitioned_table_name ADD PARTITION (partition_column='partition_value');
      
    • 删除分区:
      ALTER TABLE partitioned_table_name DROP PARTITION (partition_column='partition_value');
      
  11. 重命名表

    ALTER TABLE old_table_name RENAME TO new_table_name;
    
  12. 创建索引

    CREATE INDEX IF NOT EXISTS index_name ON TABLE table_name (column_name) AS 'index_handler_class';
    
  13. 删除索引

    DROP INDEX IF EXISTS index_name ON table_name;
    
  14. 创建视图

    CREATE VIEW IF NOT EXISTS view_name AS SELECT_statement;
    
  15. 删除视图

    DROP VIEW IF EXISTS view_name;
    

这些是 Hive 中常见的 DDL 操作,它们允许用户创建、修改和删除 Hive 中的数据库、表、分区、索引和视图。通过这些操作,用户可以灵活地管理 Hive 数据库中的数据结构。

5. 简述Hive的HSQL转换为MapReduce的过程 ?

Hive的HSQL(Hive SQL)转换为MapReduce的过程是Hive执行查询的核心机制之一。以下是该过程的高级概述:

  1. 解析(Parsing)

    • 用户提交的HiveQL查询首先被解析器(Parser)解析,将字符串形式的查询转换成抽象语法树(AST),这一步主要是对SQL语句进行语法检查。
  2. 语义分析(Semantic Analysis)

    • 解析后的AST被传递给语义分析器,它检查查询的语义正确性,比如表和列的存在性,权限检查等。
  3. 逻辑计划生成(Logical Plan Generation)

    • 通过语义分析的AST被转换成一个逻辑执行计划(Logical Plan),这是一个查询的高层次表示,包含了操作的逻辑顺序和操作类型(如SELECT、JOIN等)。
  4. 逻辑计划优化(Logical Plan Optimization)

    • 逻辑计划通过一系列的优化规则进行优化,以减少资源消耗和提高查询效率。
  5. 物理计划生成(Physical Plan Generation)

    • 优化后的逻辑计划被转换成一个或多个物理执行计划(Physical Plan)。这一步涉及到将逻辑操作转换为可以由Hadoop执行的具体操作。
  6. 生成MapReduce作业(MapReduce Job Generation)

    • Hive的物理计划通常被转换为一个或多个MapReduce作业。这个过程涉及到:
      • 确定MapReduce作业的输入格式和输出格式。
      • 设计Map和Reduce阶段的逻辑,包括数据的读取、处理和输出。
      • 配置作业的资源需求,如内存和CPU。
  7. 提交作业到YARN(Submitting Jobs to YARN)

    • 生成的MapReduce作业被提交到YARN(Yet Another Resource Negotiator),YARN负责资源管理和作业调度。
  8. 执行MapReduce作业(Executing MapReduce Jobs)

    • MapReduce作业在Hadoop集群上执行。Map任务并行处理输入数据,Reduce任务则对Map的输出进行汇总。
  9. 结果处理和返回(Result Processing and Return)

    • 作业执行完成后,结果被处理并返回给用户。对于查询操作,结果集会被发送回Hive客户端。
  10. 作业监控(Job Monitoring)

    • 用户可以通过Hive Web界面或其他监控工具来监控作业的执行状态和进度。

Hive的这一转换过程抽象了底层的MapReduce实现细节,使得用户能够以类似SQL的方式进行数据查询和分析,同时能够利用Hadoop集群的分布式计算能力。随着Hive的发展,除了MapReduce,Hive查询还可以通过Tez或Spark等其他执行引擎来执行,以进一步提高性能。

6. 简述Hive底层与数据库交互原理 ?

Hive 的设计允许它在 Hadoop 生态系统之上提供类似于 SQL 的数据查询功能。Hive 的底层与数据库交互的原理主要涉及以下几个方面:

  1. Hive 架构

    • Hive 架构包括一个编译器、一个优化器、一个执行引擎和存储管理器。
    • 用户通过 HiveQL(一种类似于 SQL 的查询语言)与 Hive 交互。
  2. HiveQL 解析

    • 当用户提交一个 HiveQL 查询时,Hive 的编译器首先解析这个查询。
    • 编译器将 HiveQL 语句转换为一个或多个逻辑查询计划。
  3. 逻辑查询计划优化

    • Hive 的优化器对逻辑查询计划进行优化,以减少查询的复杂性和资源消耗。
    • 优化步骤包括谓词下推、列裁剪、分区裁剪等。
  4. 物理查询计划生成

    • 优化后的逻辑查询计划被转换成物理查询计划。
    • 物理查询计划定义了如何在 Hadoop 集群上执行查询。
  5. MapReduce 作业生成

    • Hive 将物理查询计划转换为一个或多个 MapReduce 作业。
    • 这些作业被提交到 YARN(Yet Another Resource Negotiator)进行资源管理和作业调度。
  6. 数据存储

    • Hive 表的数据存储在 Hadoop 分布式文件系统(HDFS)中。
    • 数据可以存储为文本文件、SequenceFile 或其他 Hadoop 支持的文件格式。
  7. 元数据存储

    • Hive 使用自己的元数据存储,称为 Metastore,来存储有关表结构、分区信息等元数据。
    • Metastore 可以是关系型数据库,如 MySQL、PostgreSQL 等。
  8. 执行引擎

    • Hive 的执行引擎负责执行 MapReduce 作业。
    • 执行引擎管理数据的读取、处理和写入。
  9. 与 Hadoop 生态系统集成

    • Hive 与 Hadoop 生态系统中的其他组件紧密集成,如 HDFS、YARN、MapReduce 等。
    • 这种集成使得 Hive 能够利用 Hadoop 的分布式计算能力。
  10. 结果存储和检索

    • 查询结果可以存储在 Hive 表中,或者以文件形式输出到 HDFS。
    • 用户可以通过 HiveQL 查询结果,或者使用其他工具(如 Hadoop fs 命令)访问这些数据。
  11. 交互式查询

    • 用户可以与 Hive 交互式地执行查询,通过 Hive CLI(命令行界面)或 Hive Web UI(Web 用户界面)。

通过这些原理,Hive 实现了在 Hadoop 上的 SQL 类似的数据查询和管理功能,使得用户能够处理和分析大规模数据集。

7. 简述ORC、Parquet等列式存储的优点 ?

列式存储格式,如ORC(Optimized Row Columnar)和Parquet,是为Hadoop生态系统优化的存储格式,它们专门设计用于提高大型数据分析和查询的性能。以下是列式存储格式的一些主要优点:

  1. 查询性能提升

    • 当查询只涉及表的部分列时,列式存储可以显著提高I/O效率,因为只需读取和处理查询所需的列。
  2. 压缩优化

    • 列式存储格式通常具有更好的压缩率,因为相同数据类型的数据存储在一起,压缩算法可以更有效地工作。
  3. 预测式读取

    • 由于数据按列存储,磁盘I/O操作可以预测性地进行,减少了磁盘寻道时间和旋转延迟。
  4. 内存效率

    • 列式存储格式在内存中通常更高效,因为它们允许仅将需要的列加载到内存中。
  5. 支持复杂数据类型

    • 列式存储格式支持嵌套的数据类型(如复杂对象和数组),这对于存储半结构化或JSON数据非常有用。
  6. 统计和索引信息

    • 列式存储格式通常包含列的统计信息,这有助于查询优化器生成更高效的查询计划。
  7. 向量化查询执行

    • 列式存储格式天然支持向量化查询执行,即一次性处理一列的多个值,而不是单行的单个值,这可以显著提高CPU利用率。
  8. 更新和删除操作

    • 虽然列式存储格式在更新和删除操作上不如行式存储高效,但它们通过其他方式(如使用Delta文件或事务支持)提供了这些功能。
  9. 跨平台兼容性

    • 列式存储格式如Parquet是跨平台的,可以被不同的数据处理框架(如Hive、Spark、Pig、Impala等)读取和写入。
  10. 多版本并发控制(MVCC)

    • 某些列式存储格式支持MVCC,这使得它们能够支持高并发的数据访问模式。
  11. ACID兼容性

    • 列式存储格式正在不断发展,以支持ACID(原子性、一致性、隔离性、持久性)事务。
  12. 数据倾斜优化

    • 由于数据是按列存储的,列式存储格式可以减少数据倾斜的问题,因为数据可以更均匀地分布。

由于这些优点,列式存储格式在大数据处理和分析领域变得越来越流行,特别是在需要处理大规模数据集的场景中。

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

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

相关文章

SpringBoot+Vue学生作业管理系统【附:资料➕文档】

前言&#xff1a;我是源码分享交流Coding&#xff0c;专注JavaVue领域&#xff0c;专业提供程序设计开发、源码分享、 技术指导讲解、各类项目免费分享&#xff0c;定制和毕业设计服务&#xff01; 免费获取方式--->>文章末尾处&#xff01; 项目介绍047&#xff1a; 【…

使用OpenPCDet训练与测试多传感器融合模型BEVFusion,OPenPCdet代码架构介绍

引言 在自动驾驶领域&#xff0c;多传感器融合技术是一种常见的方法&#xff0c;用于提高感知系统的准确性和鲁棒性。其中&#xff0c;BevFusion是一种流行的融合方法&#xff0c;可以将来自不同传感器的数据进行融合&#xff0c;生成具有丰富信息的鸟瞰图&#xff08;BEV&…

应用广义线性模型二|二响应广义线性模型

系列文章目录 文章目录 系列文章目录一、二响应模型的不同表达方式和响应函数二、二响应模型的性质&#xff08;一&#xff09;二响应变量的条件数学期望与方差&#xff08;二&#xff09;二响应模型参数的极大似然估计&#xff08;三&#xff09;二响应模型的优势 三、二响应模…

vue2 中如何使用 render 函数编写组件

vue2 中如何使用 render 函数编写组件 render 基础语法createElement返回值&#xff1a;VNode参数处理样式和类组件 propsHTML 特性和 DOM 属性处理事件插槽指令v-model 指令其他属性 使用 render 封装一个输入框其他问题参考 vue 提供了声明式编写 UI 的方式&#xff0c;即 vu…

Java+Spring boot+MYSQL 技术开发的UWB室内外高精度一体化融合定位系统源码 UWB技术定位系统应用场景

JavaSpring bootMYSQL 技术开发的UWB室内外高精度一体化融合定位系统源码 UWB技术定位系统应用场景 系统聚焦基于UWB(超宽带)技术的底层定位网络和定位算法&#xff0c;通过对定位分站、定位标签、定位引擎的硏发&#xff0c;实现高精度定位网络&#xff0c;获取高精度定位结果…

翻译《The Old New Thing》- Why isn’t there a SendThreadMessage function?

Why isnt there a SendThreadMessage function? - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20081223-00/?p19743 Raymond Chen 2008年12月23日 为什么没有 SendThreadMessage 函数&#xff1f; 简要 文章讨论了 Windows 中不存在 Sen…

用QT6、QML、FFMPEG写一个有快进功能的影音播放程序

程序如图&#xff1a; 开发环境在ubuntu下&#xff0c;如果改windows下&#xff0c;也就改一下cmakelists.txt。windows下如何配置ffmpeg以前的文章有写&#xff0c;不再重复。 源程序如下&#xff1a; GitHub - wangz1155/ffmpegAudioThread: 用qt6&#xff0c;qml&#xff…

深度图的方法实现加雾,Synscapes数据集以及D455相机拍摄为例

前言 在次之前&#xff0c;我们已经做了图像加雾的一些研究&#xff0c;这里我们将从深度图的方法实现加雾展开细讲 图像加雾算法的研究与应用_图像加雾 算法-CSDN博客 接下来将要介绍如何使用深度图像生成雾效图像的方法。利用Synscapes数据集&#xff0c;通过读取EXR格式的…

Linux☞进程控制

在终端执行命令时&#xff0c;Linux会建立进程&#xff0c;程序执行完&#xff0c;进程会被终止&#xff1b;Linux是一个多任务的OS,允许多个进程并发运行&#xff1b; Linxu中启动进程的两种途径&#xff1a; ①手动启动(前台进程(命令gedit)...后台进程(命令‘&’)) ②…

重构大学数学基础_week04_从点积理解傅里叶变换

这周我们来看一下傅里叶变换。傅里叶变换是一种在数学和许多科学领域中广泛应用的分析方法&#xff0c;它允许我们将信号或函数从其原始域&#xff08;通常是时间域或空间域&#xff09;转换到频域表示。在频域中&#xff0c;信号被表示为其组成频率的幅度和相位&#xff0c;这…

STM32F103C8T6基于HAL库完成uC/OS-III多任务程序

一、在STM32CubeMX中建立工程 配置RCC 配置SYS 配置PC13为GPIO_Output 配置USART1 生成代码 二、获取uC/OS-III源码 官网下载地址&#xff1a;Micrium Software and Documentation - Silicon Labs 网盘下载&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;lzjl 三、复…

反射型xss靶场练习

反射型xss危害小&#xff0c;这里使用的xss靶场是常用的xss靶场&#xff1a;xss-labs。 当我们完成弹窗后就通过该关卡&#xff0c;说该关卡存在xss的一个漏洞并且可以解析js代码。 第一关&#xff1a; 这里没有过滤我们输入的代码&#xff1a;直接将js代码放在js代码中&a…

SpringBoot图书管理系统【附:资料➕文档】

前言&#xff1a;我是源码分享交流Coding&#xff0c;专注JavaVue领域&#xff0c;专业提供程序设计开发、源码分享、 技术指导讲解、各类项目免费分享&#xff0c;定制和毕业设计服务&#xff01; 免费获取方式--->>文章末尾处&#xff01; 项目介绍048&#xff1a; 图…

springboot中路径默认配置与重定向/转发所存在的域对象

今天在写项目的时候&#xff0c;突然发现引用js的时候路径不匹配&#xff0c;让我再次对路径问题产生了疑问&#xff0c;通过查阅springboot官网可以发现&#xff0c;在springboot中查找静态资源的时候&#xff0c;会默认在static、public、resources下查找&#xff0c;官网中也…

C++面向对象程序设计 - 字符串流

文件流是以外存文件为输入输出对象的数据流&#xff0c;字符串流不是以外存文件为输入输出的对象&#xff0c;而以内存中用户定义的字符数组&#xff08;字符串&#xff09;为输入输出的对象&#xff0c;即将数据输出到内存中的字符数组&#xff0c;或者从字符数组&#xff08;…

【NI国产替代】PCIe 高速采集卡, 8 位双通道数字化仪器,采集卡最高采样率高达 5 GS/s 模拟带宽高达 500 MHz

• 8 位双通道数字化仪器 • 最高采样率高达 5 GS/s • 模拟带宽高达 500 MHz • 采用 PCIe 3.0 x 8 接口 • 基于 Xilinx Kintex UltraScale, XCKU040 • 提供硬件、FPGA、软件定制服务 高速采集卡是一款 8 位双通道数字化仪器&#xff0c;采集卡最高采样率高达 5 GS/s 模…

【python报错】list indices must be integers or slices, not tuple

【Python报错】list indices must be integers or slices, not tuple 在Python中&#xff0c;列表&#xff08;list&#xff09;是一种常用的数据结构&#xff0c;用于存储一系列的元素。当你尝试使用不支持的索引类型访问列表元素时&#xff0c;会遇到list indices must be in…

【教学类-36-07】20240608动物面具(通义万相)-A4大小7图15手工纸1图

背景需求&#xff1a; 风变的AI对话大师一年到期了&#xff0c;也没有看到续费的按钮。不能使用它写代码了。 MJ早就用完了&#xff0c;最后480次&#xff0c;我担心信息课题会用到它生图&#xff0c;所以不敢用。 最近探索其他类似MJ的免费出图工具——找到了每天给50张免费图…

DIO控制卡,IRIG-B码卡,PCI-E总线接口卡,百兆数据采集卡

DIO控制卡 ● 4路继电器输出&#xff08;5A250VAC&#xff09; ● 4路开关量输入&#xff08;24VDC&#xff09; ● 1路IDE接口 ● 端口浪涌保护 IRIG-B码卡 ● 1路IRIG-B对时接口&#xff08;RS485/光纤&#xff09; ● 1路IEEE1588 V2对时接口&#xff08;RJ45/光纤&#…

linux本地搭建dns

不需要图形化界面 使用的是dnsmasq&#xff0c;配置简单 1.安装 deb系列linux apt-get install dnsmasqrhat系列linux yum install dnsmasq2.编辑配置文件 vi /etc/dnsmasq.conf设置主dns服务器&#xff0c;比如现有公用的的114.114.114.114 8.8.8.8这类的 server8.8.8.8…