Hive数据仓库:架构原理与实践指南

Hive数据仓库:架构原理与实践指南
在这里插入图片描述

Hive数据仓库:架构原理与实践指南

🌟 你好,我是 励志成为糕手 !
🌌 在代码的宇宙中,我是那个追逐优雅与性能的星际旅人。 ✨
每一行代码都是我种下的星光,在逻辑的土壤里生长成璀璨的银河;
🛠️ 每一个算法都是我绘制的星图,指引着数据流动的最短路径; 🔍
每一次调试都是星际对话,用耐心和智慧解开宇宙的谜题。
🚀 准备好开始我们的星际编码之旅了吗?

目录

摘要

Hive作为Apache基金会旗下的开源数据仓库工具,已成为大数据生态系统中不可或缺的重要组件。它通过提供类似SQL的查询语言(HQL),让熟悉关系型数据库的开发者能够轻松处理存储在Hadoop分布式文件系统上的海量数据,无需编写复杂的MapReduce程序。本文将从Hive的基础概念出发,深入探讨其架构设计、核心组件、查询优化策略以及实际应用场景。我们将通过丰富的代码示例和直观的图表,帮助读者全面理解Hive的工作原理,掌握Hive在大数据处理中的最佳实践,以及如何利用Hive解决实际业务中的数据分析难题。无论你是刚刚接触大数据领域的初学者,还是已经有一定经验的数据工程师,本文都将为你提供有价值的Hive学习和使用指南。

一、Hive基础概述

1.1 Hive是什么

Hive是一个基于Hadoop的数据仓库基础设施,它提供了数据的查询、分析和管理功能。Hive最大的特点是支持类SQL的查询语言HQL(Hive Query Language),使得用户可以像操作传统关系型数据库一样操作Hadoop中的数据。

-- Hive中的基本查询示例SELECT department,COUNT(*)as emp_count FROM employees WHERE hire_date >'2023-01-01'GROUPBY department ORDERBY emp_count DESC;

1.2 Hive的发展历程

Hive的诞生可以追溯到2007年,当时Facebook正面临着海量数据处理的挑战。随着社交网络的快速发展,Facebook每天产生的日志数据量呈指数级增长,传统的数据处理工具已经无法满足需求。在这样的背景下,Facebook的工程师团队开始着手开发一种能够在Hadoop之上提供SQL查询能力的工具,这就是Hive的雏形。

2008年,Facebook正式将Hive项目贡献给Apache基金会,使其成为Apache的一个孵化器项目。这一决定标志着Hive从一个公司内部工具向开源社区项目的转变,也为其后续的快速发展奠定了基础。在Apache社区的推动下,Hive吸引了来自Google、Yahoo、LinkedIn等众多公司开发者的参与和贡献。

2010年,经过两年的发展和完善,Hive成功从Apache孵化器毕业,成为Apache基金会的顶级项目(Top-Level Project)。这一里程碑事件进一步提升了Hive在大数据领域的影响力和认可度。同年,Hive 0.7.0版本发布,引入了分区裁剪、列式存储等重要特性,显著提升了查询性能。

2013年,Hive迎来了一次重要的架构变革。Hive 0.13.0版本引入了LLAP(Live Long and Process)技术预览版,这是一种低延迟分析处理引擎,旨在解决Hive在交互式查询场景下的性能瓶颈。与此同时,Hive开始支持除MapReduce之外的执行引擎,如Tez,这为后续支持Spark等更高效的计算引擎奠定了基础。

2015年至2018年是Hive快速发展的时期。在这期间,Hive陆续发布了多个重要版本,引入了物化视图、动态分区、窗口函数等高级特性。特别是Hive 2.0版本,全面增强了对Tez和Spark引擎的支持,使得Hive在性能上有了质的飞跃。同时,Hive社区也开始关注机器学习集成,为数据分析和数据科学工作流提供了更好的支持。

近年来,随着云原生技术的兴起,Hive也在积极适应这一趋势。最新的Hive 4.0版本在容器化部署、云存储集成、安全加固等方面进行了大量改进。尽管面临着来自Spark SQL、Presto等新兴查询引擎的竞争,Hive凭借其成熟稳定的特性、丰富的功能集以及在企业级应用中的广泛部署,仍然在大数据生态系统中占据着重要地位。

从最初解决Facebook内部日志分析问题的小工具,到如今成为全球范围内广泛使用的企业级数据仓库解决方案,Hive的发展历程不仅见证了大数据技术的演进,也反映了企业对海量数据处理需求的不断变化和提升。

二、Hive架构设计

2.1 Hive整体架构

Hive的架构设计遵循了分层原则,主要包括用户接口层、服务层、执行引擎层和存储层四个主要部分。

存储层执行引擎层服务层用户接口层HDFSHBaseS3MapReduceTezSparkDriver驱动编译器Compiler优化器Optimizer执行器Executor命令行界面CLIJDBC接口Web UI

图1:Hive架构图 - 展示了Hive的四层架构设计,从用户接口到底层存储的完整数据流

上图展示了Hive的四层架构设计,清晰呈现了数据处理的完整流程。最上层为用户接口层,包含CLI命令行、JDBC接口和Web UI三种交互方式,为用户提供多样化的操作入口。服务层是Hive的核心处理部分,Driver负责接收和协调查询请求,Compiler将HQL转换为执行计划,Optimizer优化查询效率,Executor负责具体执行。执行引擎层提供了多引擎支持,包括传统的MapReduce、高效的Tez以及流行的Spark,实现了计算引擎的灵活切换。最底层是存储层,支持HDFS、HBase和S3等多种存储系统,保证了数据的分布式存储和高可用性。整体架构体现了Hive的高度模块化和良好的扩展性。

2.2 Hive核心组件

Hive的核心组件包括以下几个部分:

  1. Driver:负责接收用户查询,协调各组件工作
  2. Metastore:存储元数据信息,如表结构、分区信息等
  3. Compiler:将HQL编译成执行计划
  4. Optimizer:优化执行计划
  5. Executor:执行优化后的计划

三、Hive数据类型与表结构

3.1 基本数据类型

Hive支持多种数据类型,包括原始类型和复杂类型。

类型类别数据类型描述示例
原始类型TINYINT1字节有符号整数10
原始类型SMALLINT2字节有符号整数1000
原始类型INT4字节有符号整数100000
原始类型BIGINT8字节有符号整数1000000000
原始类型FLOAT单精度浮点数3.14
原始类型DOUBLE双精度浮点数3.1415926
原始类型STRING字符串‘Hello Hive’
原始类型BOOLEAN布尔值TRUE
原始类型TIMESTAMP时间戳‘2023-12-01 10:00:00’
复杂类型ARRAY数组Array(1,2,3)
复杂类型MAP键值对Map<string,int>(‘a’,1,‘b’,2)
复杂类型STRUCT结构体Structname:string,age:int

表1:Hive数据类型对比表 - 展示了Hive支持的主要数据类型及其特点

3.2 表的类型

Hive中的表主要分为以下几种类型:

-- 管理表(内部表)CREATETABLE managed_table ( id INT, name STRING, salary FLOAT)ROW FORMAT DELIMITED FIELDSTERMINATEDBY',';-- 外部表CREATE EXTERNAL TABLE external_table ( id INT, name STRING, salary FLOAT)ROW FORMAT DELIMITED FIELDSTERMINATEDBY',' LOCATION '/user/data/employees';-- 分区表CREATETABLE partitioned_table ( id INT, name STRING ) PARTITIONED BY(department STRING, hire_year INT);-- 分桶表CREATETABLE bucketed_table ( id INT, name STRING )CLUSTEREDBY(id)INTO4 BUCKETS;

1. 管理表(内部表)
管理表是Hive默认创建的表类型,Hive完全控制其生命周期。当删除管理表时,不仅会删除元数据,还会删除存储在HDFS上的实际数据文件。管理表适合临时数据处理或中间计算结果存储,数据生命周期由Hive管理,使用简单但灵活性较低。

2. 外部表
外部表通过EXTERNAL关键字创建,Hive仅管理元数据,不负责实际数据的删除。删除外部表时,只会移除元数据,底层数据文件保持不变。这使得外部表非常适合数据共享场景,可以被多个工具(如Spark、Pig等)共同访问。外部表支持数据的独立性管理,当需要与其他系统共享数据或数据有独立的生命周期时是最佳选择。

ps:内部表是hive默认创建的表,也就是说他的数据存储在hive的数据仓库默认路径下;这里hive负责管理表的数据和元数据,包括增删改查等。如果当我们删除内部表,其表内的数据也会被删除。
与之对应的是外部表——是在hive中定义的表,但表的数据存储在hive之外比如HDFS上的指定路径或者其他存储路径中;hive只管理外部表的元数据。如果删除外部表时仅删除其元数据,实际数据则原封不动。我们需要注意一下两者的区别。

3. 分区表
分区表通过PARTITIONED BY子句创建,可以将数据按照指定列的值进行逻辑划分和物理隔离存储。每个分区对应HDFS上的一个子目录,查询时可以通过分区裁剪大幅减少扫描的数据量,显著提升查询性能。分区表适合具有明显分区特征的数据,如按时间、地区、部门等维度组织的数据。但需注意合理设计分区粒度,避免分区过多导致的"小文件问题"。

4. 分桶表
分桶表通过CLUSTERED BY子句创建,将数据按照指定列的哈希值分散到多个桶中。每个桶对应一个文件,数据被均匀分布,有利于高效的采样和连接操作。特别是在JOIN操作中,分桶可以实现桶级别的并行连接,显著减少数据Shuffle。分桶表适合需要频繁进行JOIN操作或需要高效随机抽样的场景,但需要确保数据正确地分桶写入。

四、Hive查询语言HQL

4.1 数据定义语言(DDL)

HQL的DDL语句用于创建、修改和删除数据库对象。

-- 创建数据库CREATEDATABASEIFNOTEXISTS company_db;-- 使用数据库USE company_db;-- 创建表CREATETABLE employees ( id INT, name STRING, age INT, department STRING, salary FLOAT)ROW FORMAT DELIMITED FIELDSTERMINATEDBY',' STORED AS TEXTFILE;-- 修改表ALTERTABLE employees ADDCOLUMNS(address STRING);-- 删除表DROPTABLEIFEXISTS temp_employees;

4.2 数据操作语言(DML)

HQL的DML语句用于数据的导入、导出和查询。

-- 加载数据LOADDATALOCAL INPATH '/path/to/data.txt'INTOTABLE employees;-- 插入数据INSERTINTO employees VALUES(1,'张三',30,'技术部',15000.0);-- 动态分区插入INSERT OVERWRITE TABLE employees_partitioned PARTITION(department, hire_year)SELECT id, name, salary, department,year(hire_date)as hire_year FROM employees_staging;-- 导出数据INSERT OVERWRITE DIRECTORY '/user/output/employees'SELECT*FROM employees WHERE department ='技术部';

4.3 数据查询语言(DQL)

HQL的DQL语句用于数据查询。

-- 基本查询SELECT*FROM employees;-- 条件查询SELECT name, salary FROM employees WHERE age >25;-- 分组聚合SELECT department,AVG(salary)as avg_salary,MAX(salary)as max_salary FROM employees GROUPBY department HAVING avg_salary >10000;-- 多表连接SELECT e.name, d.department_name, d.manager FROM employees e JOIN departments d ON e.department_id = d.id;

4.4 SQL和HQL的差异

不难看出,HQL其实和数据库语言SQL在很多地方都挺像的(我之前一直以为两者是同一个东西)所以在这里我来讲讲他们的区别:

首先,两者的运行环境与执行机制完全不同。SQL主要在传统关系型数据库中执行,查询直接操作存储在数据库管理系统中的结构化数据;而HQL是为分布式计算环境设计的,Hive会将HQL语句转换为MapReduce、Tez或Spark等分布式计算任务,在Hadoop集群上执行,这种设计使其能够有效处理TB甚至PB级的海量数据。

其次,数据存储方式也有很大差异。SQL数据库使用专有的存储格式,数据通常存储在数据库管理系统控制的文件中;而HQL依赖Hadoop的存储系统(如HDFS),数据以文件形式存储,可以采用多种格式(如TextFile、ORC、Parquet等),支持更灵活的数据存储策略和格式选择。

在事务支持方面,传统SQL数据库通常支持完整的ACID(原子性、一致性、隔离性、持久性)事务,能够保证数据操作的可靠性;而Hive最初设计为批处理系统,对事务支持有限,虽然Hive 0.14版本后引入了事务支持,但主要针对INSERT-ONLY场景,完整事务处理能力仍不如传统数据库成熟。

性能特性上也存在明显区别。SQL查询在优化良好的关系型数据库中响应速度快,适合OLTP(在线事务处理)场景;而HQL查询由于需要转换成分布式任务,启动开销大,响应时间较长,但在处理大规模数据集的OLAP(在线分析处理)场景中表现出色。

功能特性方面,HQL扩展了一些适合大数据处理的特性,如分区表、分桶表、复杂数据类型(数组、映射、结构体)等;同时,HQL也缺少SQL中的某些功能,如对临时表的支持不如SQL灵活,早期版本不支持行级更新和删除操作,以及某些高级索引功能。此外,HQL在设计上更注重扩展性,可以通过用户自定义函数(UDF)、序列化/反序列化器(SerDe)等机制进行功能扩展,以适应大数据处理的多样化需求。

五、Hive执行计划与优化

5.1 查看执行计划

理解Hive的执行计划对于性能优化至关重要。

-- 查看执行计划EXPLAINSELECT department,AVG(salary)as avg_salary FROM employees GROUPBY department;-- 查看扩展执行计划EXPLAINEXTENDEDSELECT department,AVG(salary)as avg_salary FROM employees GROUPBY department;

5.2 查询优化策略

Hive查询优化是提升性能的关键。以下是一些常用的优化策略:

1. 分区裁剪与列裁剪:分区裁剪是Hive查询优化中最基础也最有效的手段之一。通过在WHERE子句中指定分区条件,可以避免扫描所有分区数据,只读取与查询相关的分区。同样,列裁剪要求SELECT语句只包含必要的列,而不是使用SELECT *,这样可以减少数据传输量和I/O操作。在处理TB级数据时,这两种优化可以将查询时间缩短到原来的几十分之一。

2. 谓词下推:谓词下推是将过滤条件尽可能早地应用到数据处理流程中。Hive会自动将WHERE子句中的条件下推到Map阶段执行,这样可以尽早过滤掉不需要的数据,减少Map阶段输出的数据量和后续阶段的数据传输量。特别是在处理JOIN操作时,谓词下推可以显著提高性能。

3. Map端聚合:对于聚合查询(如COUNT、SUM、AVG等),启用Map端聚合可以大大减少数据传输量。通过设置hive.map.aggr=true,可以在Map阶段先对数据进行部分聚合,然后再传输到Reduce阶段进行最终计算。这对于数据倾斜的场景尤为有效,可以减少网络传输压力和Reduce阶段的计算负载。

4. 选择合适的文件格式:Hive支持多种文件格式,如TextFile、SequenceFile、ORC、Parquet等。在生产环境中,强烈推荐使用列式存储格式,如ORC或Parquet,这些格式提供了更好的压缩率和查询性能。ORC格式特别适合Hive查询,可以提供高达70%的压缩率,并支持复杂类型和索引。

这个在实践的时候可以注意一下。文本文件格式(TextFile)是以文本形式存储数据,一般在数据的导入或导出还有临时数据分析这种需要快速查看或者处理原数据时,无需其他解析步骤即可快速查看,很方便但查询性能较低;如果在建数仓需要提高查询性能时可以采用列式存储格式——orc或者parquet等。以orc为例,就是我之前建数仓的首选格式,支持ACID事务、轻量级索引和高效的批量读写操作。此外还有其他的存储格式,这里做个扩展。

在这里插入图片描述

原文在这里哈:大数据开发(Hive面试真题)

5. 动态分区和分桶优化:合理使用动态分区可以简化ETL流程,但需要注意设置适当的分区数量,避免"小文件问题"。对于JOIN操作频繁的表,分桶可以实现桶级别的连接,大幅减少数据Shuffle。设置hive.optimize.bucketmapjoin=true可以启用桶表的Map端连接优化。

执行阶段优化阶段任务执行逻辑计划优化物理计划优化用户提交查询语法解析语义分析逻辑计划生成物理计划生成执行计划生成

图2:Hive查询执行流程图 - 展示了从查询提交到任务执行的完整过程,突出显示了优化阶段

六、Hive函数详解

6.1 内置函数

Hive提供了丰富的内置函数,包括数学函数、字符串函数、日期函数等。

-- 数学函数SELECT ABS(-10),ROUND(3.14159,2), POWER(2,10);-- 字符串函数SELECT CONCAT('Hello',' ','Hive'), LENGTH('Hive'), SUBSTR('Hive',1,2);-- 日期函数SELECTCURRENT_DATE(), DATE_ADD('2023-12-01',30),YEAR('2023-12-01');-- 条件函数SELECT id, name,CASEWHEN salary >15000THEN'高薪'WHEN salary >10000THEN'中高薪'ELSE'普通'ENDas salary_level FROM employees;

6.2 自定义函数(UDF)

当内置函数无法满足需求时,可以开发自定义函数。

packagecom.example.hive.udf;importorg.apache.hadoop.hive.ql.exec.UDF;importorg.apache.hadoop.io.Text;publicclassStringReverseextends UDF {publicTextevaluate(Text input){if(input ==null)returnnull;String reversed =newStringBuilder(input.toString()).reverse().toString();returnnewText(reversed);}}

七、Hive的实际应用场景

7.1 日志分析

Hive常用于分析大规模日志数据,如服务器日志、应用日志等。

-- 分析网站访问日志SELECTdate,COUNT(*)as total_visits,COUNT(DISTINCT ip)as unique_visitors,SUM(CASEWHEN status_code =200THEN1ELSE0END)as success_visits,SUM(CASEWHEN status_code >=400THEN1ELSE0END)as error_visits FROM web_logs WHEREdate>='2023-12-01'ANDdate<='2023-12-31'GROUPBYdateORDERBYdate;

7.2 数据仓库构建

Hive是构建数据仓库的理想工具,可以处理TB甚至PB级的数据。

%%{init: {‘theme’: ‘default’, ‘themeVariables’: {‘primaryColor’: ‘#95a5a6’, ‘secondaryColor’: ‘#27ae60’, ‘tertiaryColor’: ‘#34495e’}}}%%

客户端HiveServer2MetastoreHDFS执行引擎提交HQL查询获取元数据返回元数据生成执行计划提交执行任务读取数据返回数据数据处理返回结果返回查询结果客户端HiveServer2MetastoreHDFS执行引擎

图3:Hive查询执行时序图 - 展示了Hive各组件在查询执行过程中的交互流程

八、Hive性能调优实战

8.1 配置优化

合理的配置参数设置可以显著提升Hive的性能。

-- 设置Map任务数量SET mapreduce.job.maps=10;-- 设置Reduce任务数量SET mapreduce.job.reduces=5;-- 启用Map端聚合SET hive.map.aggr=true;-- 启用推测执行SET mapreduce.map.speculative=true;SET mapreduce.reduce.speculative=true;-- 设置并行执行SET hive.exec.parallel=true;SET hive.exec.parallel.thread.number=16;

8.2 存储格式选择

选择合适的存储格式对性能影响很大。

%%{init: {‘theme’: ‘default’, ‘themeVariables’: {‘pieColors’: [‘#e74c3c’, ‘#3498db’, ‘#2ecc71’, ‘#f39c12’, ‘#9b59b6’]}}}%%

45%30%15%5%5%Hive存储格式使用占比ORCParquetTextFileSequenceFileRCFile

图4:Hive存储格式使用占比图 - 展示了不同存储格式在Hive中的使用比例,ORC和Parquet是最常用的高效存储格式

总结与展望

Hive作为大数据生态系统中的重要基石,自2008年开源以来,已成为企业级数据仓库解决方案的首选工具之一。通过本文的全面介绍,我们系统地了解了Hive的基础概念、灵活的架构设计、丰富的表类型支持以及高效的查询优化策略。Hive凭借其SQL兼容性强、易于使用、可扩展性高等特点,成功解决了传统数据库在处理PB级数据时的性能瓶颈,为海量数据的批处理和分析提供了可靠支撑。

从技术发展趋势来看,Hive正朝着更高效、更智能、更云原生的方向演进。一方面,执行引擎的多元化(MapReduce、Tez、Spark)使其能够适应不同场景的性能需求;另一方面,Hive 4.0引入的ACID事务完善支持、物化视图优化、动态分区增强等特性,使其在实时性和交互性方面有了显著提升。未来,随着云原生架构的普及,Hive将进一步优化其在云环境中的部署和管理体验,简化资源调度和扩缩容机制。

参考链接

  1. Apache Hive官方文档
  2. Hive编程指南(中文版)
  3. Hive性能调优实战
  4. Hive与SparkSQL性能对比
  5. Hive最佳实践指南

关键词标签

#Hive #数据仓库 #大数据 #HQL #性能优化

Read more

previous preparation error: The developer disk image could not be unmounted on the device;An unknow

这个错误: previous preparation error: The developer disk image could not be unmounted on the device; An unknown error message 'internalError'; was from the device. 是 Xcode 在真机运行 / 调试时挂载 Developer Disk Image (DDI) 失败的典型情况,主要原因是 设备调试环境卡住或残留。 1️⃣ 主要原因 1. 之前调试挂载的 Developer Disk Image 没被正确卸载 * 比如上次调试时直接拔了线,或者设备崩溃/重启了。 2. Xcode

By Ne0inhk
FPGA开发常用软件盘点:Vivado、Quartus、ModelSim全面对比

FPGA开发常用软件盘点:Vivado、Quartus、ModelSim全面对比

在FPGA开发过程中,EDA工具(Electronic Design Automation) 是工程师的生产力核心。不同厂商的FPGA芯片通常配套不同的开发工具,但在项目实践中,很多工程师往往会接触多种EDA软件。 本文将带你系统梳理三款FPGA开发中最常用的软件:Vivado、Quartus、ModelSim,从功能、适用场景、优缺点等多个维度进行全面对比,助你快速入门并合理选择。 一、Vivado —— Xilinx官方旗舰开发平台 1. 基本简介 Vivado是Xilinx(现为AMD)推出的综合性FPGA开发环境,主要面向7系列、UltraScale、Versal等高端FPGA器件。 它集成了综合、布局布线、时序分析、仿真、硬件调试等完整流程,是Xilinx FPGA开发的首选工具。 2. 核心功能 * RTL综合与实现:支持Verilog、VHDL和SystemVerilog,自动进行逻辑优化与布局布线。 * IP Integrator:可视化模块连接工具,适合SoC级设计。 * 仿真与调试:内置Vivado Simulator,也可外接ModelSim进行

By Ne0inhk

直播效率工具如何提升互动体验:神奇弹幕机器人全功能指南

直播效率工具如何提升互动体验:神奇弹幕机器人全功能指南 【免费下载链接】Bilibili-MagicalDanmaku【神奇弹幕】哔哩哔哩直播万能场控机器人,弹幕姬+答谢姬+回复姬+点歌姬+各种小骚操作,目前唯一可编程机器人 项目地址: https://gitcode.com/gh_mirrors/bi/Bilibili-MagicalDanmaku 直播间互动效率低下?场控人手不足导致观众流失?试试这款可编程直播助手——神奇弹幕机器人,它能让你轻松实现弹幕智能管理、自动互动响应和个性化内容推送,全方位提升直播专业度。作为目前唯一支持自定义脚本的B站直播辅助工具,它将帮助主播从繁琐的重复工作中解放出来,专注于内容创作与观众互动。 1. 为什么选择可编程直播助手? 在直播行业竞争日益激烈的今天,高效的场控工具已成为主播的核心竞争力。传统人工场控不仅需要投入大量人力成本,还难以应对高并发互动场景。神奇弹幕机器人通过模块化设计,将直播互动流程自动化、智能化,让单人主播也能打造出专业团队级别的直播效果。 主播视角的实时互动控制面板,可快速调整直播标题、封面等核心设置 核心价值对

By Ne0inhk
无人机避障——Mid360+Fast-lio感知建图+Ego-planner运动规划(胎教级教程)

无人机避障——Mid360+Fast-lio感知建图+Ego-planner运动规划(胎教级教程)

电脑配置:Xavier-nx、ubuntu 18.04、ros melodic 激光雷达:Livox_Mid-360 结果展示:左边Mid360+Fast-lio感知建图,右边Ego-planner运动规划 1、读取雷达数据并显示 无人机避障——感知篇(采用Livox-Mid360激光雷达获取点云数据显示)-ZEEKLOG博客 看看雷达数据话题imu以及lidar两个话题  2、读取雷达数据并复现fast-lio  无人机避障——感知篇(采用Mid360复现Fast-lio)-ZEEKLOG博客 启动fast-lio,确保话题有输出   由于此处不需要建图,因此不打开rviz,launch文件如下修改: <launch> <!-- Launch file for Livox MID360 LiDAR --> <arg name="rviz&

By Ne0inhk