当前位置: 首页 > news >正文

linux kernel iio 架构

linux kernel iio 架构讲解

Linux IIO(Industrial I/O)架构是Linux内核提供的一种用于支持各种类型传感器和数据采集设备的子系统,包括温度、压力、湿度、加速度、光度等多种传感器。

IIO架构的核心是一个通用的IIO子系统,它提供了一组通用的API,可以为各种传感器设备提供数据采集、转换和校准的支持。IIO子系统也提供了一些通用的用户空间工具,可以用于配置、测试和诊断IIO设备。

IIO架构的主要特点包括:

  1. 多种类型传感器和数据采集设备的支持:IIO架构提供了多种传感器和数据采集设备的支持,包括模拟传感器、数字传感器、ADC、DAC等。

  1. 多种物理接口的支持:IIO架构支持多种物理接口,包括SPI、I2C、GPIO、USB等。

  1. 通用的API:IIO子系统提供了一组通用的API,包括设备注册、数据采集、数据转换和数据校准等。

  1. 灵活的设备驱动模型:IIO设备驱动可以被实现为内核模块或者用户空间应用程序,这种灵活的设备驱动模型可以让设备厂商更容易地开发和维护设备驱动。

  1. 具有扩展性:IIO架构可以通过添加新的驱动、过滤器、数据转换器等扩展来支持更多类型的传感器和数据采集设备。

IIO架构的应用非常广泛,包括无线传感器网络、物联网、机器人、自动驾驶等多个领域。

在Linux内核中,IIO子系统的核心代码位于/drivers/iio目录下。如果想要深入了解IIO架构,可以阅读相关文档和源代码,例如/drivers/iio/Documentation目录下的文档。

/drivers/iio/Documentation 详细介绍

/drivers/iio/Documentation目录是Linux内核IIO(Industrial I/O)子系统的文档目录,里面包含了一些详细的文档,用于说明IIO子系统的设计和使用。下面是一些文档的介绍:

  1. ABI文档:该文档介绍了IIO设备和IIO通道的属性,包括名称、数据格式、单位、采样率等。这些属性可以通过/sys/bus/iio/devices目录下的文件进行配置和查询。

  1. Buffer文档:该文档介绍了IIO缓冲区,包括如何配置缓冲区大小、如何将数据写入缓冲区、如何读取缓冲区数据等。

  1. Conversion文档:该文档介绍了IIO数据转换器,包括如何进行数据格式转换、如何进行零点校准、如何进行斜率校准等。

  1. Events文档:该文档介绍了IIO事件,包括如何定义事件、如何注册事件、如何处理事件等。

  1. Poll文档:该文档介绍了IIO设备的轮询方式,包括如何配置轮询间隔、如何读取数据等。

  1. Testing文档:该文档介绍了如何测试IIO设备和IIO驱动程序,包括如何使用内核测试框架、如何使用用户空间测试程序等。

  1. Trigger文档:该文档介绍了IIO触发器,包括如何定义触发器、如何注册触发器、如何启动触发器等。

  1. Debug文档:该文档介绍了IIO调试方法,包括如何使用调试信息、如何分析IIO设备的性能等。

除了上述文档外,/drivers/iio/Documentation目录下还有其他一些文档,如对于特定IIO子系统(如ADC、DAC、温度传感器等)的说明文档、对于IIO设备树绑定的说明文档等。

这些文档提供了非常有用的信息,有助于开发人员理解和使用IIO子系统。同时,还可以从IIO驱动程序的代码中学习到很多有用的技巧和实践经验。如果想要深入了解IIO子系统,建议仔细阅读这些文档和相关代码。

iio buffer 作用

在Linux内核的IIO子系统中,缓冲区(Buffer)是一种用于存储IIO设备采集到的数据的数据结构。IIO设备通常以固定的速率采集数据,并将其存储在缓冲区中。用户可以通过一些接口,例如sysfs和ioctl,来访问这些数据。

IIO缓冲区的作用是提供一种通用的方法,用于管理和存储IIO设备采集到的数据。缓冲区可以存储多个采样点,因此可以在设备中进行数据处理或者后续的应用程序中进行处理。例如,通过IIO缓冲区可以实现以下功能:

  1. 数据处理:IIO缓冲区可以存储一定数量的采样数据,从而可以对数据进行滤波、平滑处理等。

  1. 数据传输:IIO缓冲区可以在内核和用户空间之间传输数据。例如,可以通过sysfs和ioctl接口,从IIO缓冲区中读取数据,然后将其传输到用户空间。

  1. 数据存储:IIO缓冲区可以将采集到的数据存储到内核中的缓冲区中,或者存储到文件系统中。

IIO缓冲区在IIO设备驱动程序中非常重要。驱动程序需要负责缓冲区的分配、初始化和数据的读取和写入。为了避免内存泄漏等问题,驱动程序需要实现正确的缓冲区管理策略。此外,为了提高性能,驱动程序还可以通过一些技巧,如使用双缓冲区或环形缓冲区,来实现高效的数据传输。

iio 缺点

尽管Linux内核的IIO子系统提供了一种通用的方法来管理和访问各种不同类型的传感器和数据转换器,但它也有一些缺点:

  1. 复杂性:IIO子系统相对来说比较复杂,需要开发人员有一定的Linux内核编程经验。此外,IIO子系统的文档也相对较少,对于初学者来说比较难以入门。

  1. 稳定性:IIO子系统的稳定性也有一些问题。由于内核版本的更新和驱动程序的变更,一些IIO设备在不同的内核版本中可能会存在兼容性问题,从而导致设备无法正常工作。

  1. 性能:IIO子系统中的驱动程序通常运行在内核空间中,而数据传输需要涉及到内核和用户空间之间的上下文切换。这可能会导致一些性能问题,特别是在高速采样和大数据量传输的情况下。

  1. 兼容性:IIO子系统并不是所有平台都支持。一些平台可能需要特定的驱动程序和配置才能支持IIO子系统。此外,IIO子系统对于一些特殊的传感器和数据转换器可能并不支持,需要通过编写自定义驱动程序来实现。

虽然IIO子系统有一些缺点,但总体上来说它仍然是一种非常有用的工具,可以帮助开发人员实现各种各样的传感器和数据转换器的驱动程序,并提供了一种通用的方法来访问和管理这些设备。

iio 优点3

以下是Linux内核的IIO子系统的优点:

  1. 通用性:IIO子系统可以支持各种不同类型的传感器和数据转换器。它提供了一种通用的方法来管理和访问这些设备,而不需要针对每种设备编写特定的驱动程序。

  1. 可移植性:IIO子系统可以跨不同的平台进行移植,并且可以在各种不同的嵌入式系统和计算机平台上运行。

  1. 灵活性:IIO子系统提供了各种不同的驱动程序和接口,可以满足各种不同的应用场景。例如,可以通过sysfs和ioctl接口,从IIO设备中读取和写入数据。此外,IIO子系统还支持一些高级功能,例如数据滤波、校准、自校准等。

  1. 高效性:IIO子系统支持高速数据采集和传输,并且可以使用各种不同的技术来提高性能,例如使用DMA传输、使用双缓冲区或环形缓冲区等。

  1. 可扩展性:IIO子系统可以通过编写自定义驱动程序来支持各种不同的传感器和数据转换器。此外,IIO子系统还支持在内核运行时加载和卸载驱动程序。

总的来说,IIO子系统是一个功能强大的工具,可以帮助开发人员实现各种各样的传感器和数据转换器的驱动程序,并提供了一种通用的方法来访问和管理这些设备。它具有可移植性、灵活性、高效性和可扩展性等优点,可以满足各种不同的应用场景。

iio 驱动使用

使用IIO驱动程序的一般流程如下:

  1. 配置内核:首先,需要在内核配置中启用IIO子系统和相关的驱动程序。在内核配置中选择"Device Drivers" -> "Industrial I/O support",并选中需要的驱动程序。

  1. 加载驱动程序:如果驱动程序是内核模块,需要使用modprobe命令加载。例如,要加载AD799X驱动程序,可以执行以下命令:

modprobe ad799x

  1. 配置设备:根据不同的驱动程序和设备类型,需要进行不同的配置。例如,对于AD799X设备,可以通过sysfs接口进行配置。例如,以下命令将配置AD799X设备的采样频率:

echo 2000 > /sys/bus/i2c/devices/i2c-0/0-0048/iio:device0/sampling_frequency

  1. 读取数据:使用sysfs或ioctl接口从设备中读取数据。例如,以下命令将从设备中读取10个采样值:

cat /sys/bus/iio/devices/iio:device0/in_voltage0_raw

cat /sys/bus/iio/devices/iio:device0/in_voltage1_raw$ ...

  1. 卸载驱动程序:如果不再需要使用驱动程序,可以使用modprobe命令卸载。例如,要卸载AD799X驱动程序,可以执行以下命令:

modprobe -r ad799x

需要注意的是,IIO驱动程序的使用可能因设备类型、驱动程序和应用场景的不同而有所差异。建议查阅相关的文档和示例代码,以便更好地了解如何使用IIO驱动程序。

用户空间使用iio 驱动实例

以下是一个使用IIO驱动程序从用户空间读取传感器数据的示例:

  1. 准备工作:在内核中加载所需的IIO驱动程序,例如ADXL345加速度计驱动程序。

  1. 打开设备文件:使用open系统调用打开IIO设备的设备文件。例如,以下代码将打开ADXL345加速度计的设备文件:

int fd = open("/dev/iio:device0", O_RDONLY);

if (fd < 0) {

perror("open");

exit(1);

}

  1. 读取数据:使用read系统调用从设备文件中读取数据。每次读取的数据量由设备文件所代表的IIO设备决定。例如,以下代码将从设备文件中读取4个16位的加速度计数据:

uint8_t buf[8];

int nbytes = read(fd, buf, sizeof(buf));

if (nbytes < 0) {

perror("read");

exit(1);

}

int16_t x = (buf[1] << 8) | buf[0];

int16_t y = (buf[3] << 8) | buf[2];

int16_t z = (buf[5] << 8) | buf[4];

int16_t temperature = (buf[7] << 8) | buf[6];

上述代码将读取4个16位的加速度计数据,并将其解析为x、y、z轴的加速度和温度。

  1. 处理数据:根据需要,可以对读取的数据进行处理和转换。例如,可以将加速度值转换为实际的物理量。下面是一个简单的示例:

cCopy codefloat x_g = x * 0.0039;

float y_g = y * 0.0039;

float z_g = z * 0.0039;

float temp_c = (temperature - 45) / 5.0;

  1. 关闭设备文件:使用close系统调用关闭设备文件。例如,以下代码将关闭设备文件:

cCopy codeclose(fd);

需要注意的是,上述示例仅演示了如何从用户空间读取IIO设备的数据。在实际应用中,可能需要更复杂的处理和控制逻辑,具体取决于应用场景和设备类型。建议参考相关的文档和示例代码,以便更好地了解如何使用IIO驱动程序。

多个用户空间进程同时获取IIO 驱动数据

多个用户空间进程可以同时获取IIO驱动程序的数据。每个进程都可以通过打开相同的设备文件并使用read系统调用来读取数据。但需要注意的是,IIO驱动程序可能会对设备进行访问控制以确保数据的安全性和完整性。

因此,在多个用户空间进程同时访问IIO设备时,需要进行合适的同步和互斥操作以避免数据冲突和竞争条件。可以使用信号量、互斥量等机制来控制访问IIO设备的进程数量和顺序。

此外,为了提高性能和效率,可以使用IIO缓冲区(IIO buffer)来处理IIO设备的数据。多个进程可以同时访问和使用IIO缓冲区,以实现更高效的数据读取和处理。但是,需要确保在不同的进程之间同步和协调对缓冲区的访问。

IIO 设备驱动时如何保证多用户并发操作正常工作

在IIO设备驱动程序中,可以使用锁和同步机制来保证多用户并发操作的正常工作。以下是一些常用的方法:

  1. 互斥锁:在驱动程序中使用互斥锁来保护共享数据结构的访问。在每个操作期间,进程可以使用锁来排他性地访问共享数据结构,以避免并发冲突。

  1. 信号量:信号量可以用于控制并发访问的数量。例如,在IIO缓冲区中使用信号量来限制同时读取和写入缓冲区的进程数量。

  1. 局部禁用中断:在驱动程序中禁用中断可以防止多个进程并发地访问共享数据结构。这可以使用spin_lock_irqsave和spin_unlock_irqrestore操作来实现。

  1. 多队列:可以使用多个队列来处理并发请求,以提高性能和效率。例如,在IIO设备中使用多个输入输出队列来并行地处理多个数据流。

总的来说,在IIO设备驱动程序中,应该采用适当的同步和互斥机制来保证多用户并发操作的正确性和可靠性。这样,就可以避免数据冲突和竞争条件,并提高系统的性能和效率。

提供一个参考代码

以下是一个简单的参考代码,演示了如何在IIO设备驱动程序中使用互斥锁来保护共享数据结构的访问:

cCopy code#include<linux/iio/iio.h>#include<linux/mutex.h>structiio_dev *my_dev;

DEFINE_MUTEX(my_mutex); // 定义一个互斥锁staticintmy_read_raw(struct iio_dev *indio_dev,

conststruct iio_chan_spec *chan, int *val, int *val2,

long mask)

{

int ret;

mutex_lock(&my_mutex); // 加锁/* 读取数据并更新共享数据结构 */

ret = iio_read_channel_raw(indio_dev, chan, val, val2, mask);

my_shared_data += *val;

mutex_unlock(&my_mutex); // 解锁return ret;

}

在上述代码中,我们首先定义了一个互斥锁my_mutex。然后,在my_read_raw函数中,我们使用mutex_lock和mutex_unlock操作来分别加锁和解锁my_mutex,以保证共享数据结构的访问在每个操作期间是排他的。

相关文章:

linux kernel iio 架构

linux kernel iio 架构讲解Linux IIO&#xff08;Industrial I/O&#xff09;架构是Linux内核提供的一种用于支持各种类型传感器和数据采集设备的子系统&#xff0c;包括温度、压力、湿度、加速度、光度等多种传感器。IIO架构的核心是一个通用的IIO子系统&#xff0c;它提供了一…...

Socket通信详解

Socket通信详解 文章目录Socket通信详解Socket流程介绍函数介绍编程实例Socket流程介绍 socket通信类似于电话通信&#xff0c;其服务器基本流程就是 Created with Raphal 2.3.0安装电话socket()分配电话号码bind()连接电话线listen()拿起话筒accept()函数介绍 socket() 其中…...

多分类、正则化问题

多分类问题 利用逻辑回归解决多分类问题&#xff0c;假如有一个训练集&#xff0c;有 3 个类别&#xff0c;分别为三角形 &#x1d466; 1&#xff0c;方框&#x1d466; 2&#xff0c;圆圈 &#x1d466; 3。我们下面要做的就是使用一个训练集&#xff0c;将其分成 3 个二…...

史上最全面的软件测试面试题总结(接口、自动化、性能全都有)

目录 思维发散 Linux 测试概念和模型 测试计划与工具 测试用例设计 Web项目 Python基础 算法 逻辑 接口测试 性能测试 总结感谢每一个认真阅读我文章的人&#xff01;&#xff01;&#xff01; 重点&#xff1a;配套学习资料和视频教学 思维发散 一个球&#xff…...

速来~与 Werner Vogels 博士一起探索敏捷性与创新速度一起提升的秘方

Amazon Web Services 的现代应用程序创新一直是 Amazon 公司坚持追求的核心目标。约20年前&#xff0c;我们经历了一次彻底的转型&#xff0c;旨在建立起“发明、发布、再发明、再发布、重新开始、洗牌、再重复”的快速迭代流程。正是此番探索&#xff0c;彻底改变了我们构建应…...

Apache Hadoop、HDFS介绍

目录Hadoop介绍Hadoop集群HDFS分布式文件系统基础文件系统与分布式文件系统HDFS简介HDFS shell命令行HDFS工作流程与机制HDFS集群角色与职责HDFS写数据流程&#xff08;上传文件&#xff09;HDFS读数据流程&#xff08;下载文件&#xff09;Hadoop介绍 用Java语言实现开源 允许…...

python“r e 模块“常见函数详解

正则表达式&#xff1a;英文Regular Expression,是计算机科学的一个重要概念&#xff0c;她使用一种数学算法来解决计算机程序中的文本检索&#xff0c;匹配等问题&#xff0c;正则表达式语言是一种专门用于字符串处理的语言。在很多语言中都提供了对它的支持&#xff0c;re模块…...

【数据结构】二叉树的四种遍历方式——必做题

写在前面学完上一篇文章的二叉树的遍历之后&#xff0c;来尝试下面的习题吧开始做题144. 二叉树的前序遍历 - 力扣&#xff08;LeetCode&#xff09;94. 二叉树的中序遍历 - 力扣&#xff08;LeetCode&#xff09;145. 二叉树的后序遍历 - 力扣&#xff08;LeetCode&#xff09…...

Nginx使用“逻辑与”配置origin限制,修复CORS跨域漏洞

目录1.漏洞报告2.漏洞复现3.Nginx 修复3.1 添加请求头3.2 配置origin限制2.3 调整origin限制1.漏洞报告 漏洞名称&#xff1a; CORS 跨域漏洞等级&#xff1a; 中危漏洞证明&#xff1a; Origin从任何域名都可成功访问&#xff0c;未做任何限制。漏洞危害&#xff1a; 因为同源…...

Laravel框架02:路由与控制器

Laravel框架02&#xff1a;路由与控制器一、路由配置文件二、路由参数三、路由别名四、路由群组五、控制器概述六、控制器路由七、接收用户输入一、路由配置文件 以web网页路由文件为例&#xff1a; 默认根路由 路由定义格式Route::请求方式(请求的URL, 匿名函数或控制响应的方…...

【POJ 2418】Hardwood Species 题解(映射)

描述 阔叶树是一种植物群&#xff0c;具有宽阔的叶子&#xff0c;结出果实或坚果&#xff0c;通常在冬天休眠。 美国的温带气候造就了数百种阔叶树种的森林&#xff0c;这些树种具有某些生物特征。例如&#xff0c;虽然橡树、枫树和樱桃都是硬木树&#xff0c;但它们是不同的物…...

React组件之间的通信方式总结(下)

一、写一个时钟 用 react 写一个每秒都可以更新一次的时钟 import React from react import ReactDOM from react-domfunction tick() {let ele <h1>{ new Date().toLocaleTimeString() }</h1>// Objects are not valid as a React child (found: Sun Aug 04 20…...

【RabbitMQ笔记07】消息队列RabbitMQ七种模式之Publisher Confirms发布确认模式

这篇文章&#xff0c;主要接收消息队列RabbitMQ七种模式之Publisher Confirms发布确认模式。 目录 一、消息队列 1.1、发布确认模式 1.2、案例代码 &#xff08;1&#xff09;引入依赖 &#xff08;2&#xff09;编写生产者【消息确认--单条确认】 &#xff08;3&#xf…...

【华为OD机试模拟题】用 C++ 实现 - IPv4 地址转换成整数(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 去重求和(2023.Q1) 文章目录 最近更新的博客使用说明IPv4 地址转换成整数题目输入输出示例一输入输出说明示例一输入输出说明Code使用说明 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,...

闭包与高阶函数

文中内容均来自于曾探《JavaScript设计模式与开发实践》的学习笔记。闭包作用域变量的作用域&#xff0c;就是指变量的有效范围。局部变量、全局变量。变量的搜索是从内到外而非从外到内的。变量的生命周期对于全局变量莱索&#xff0c;全局变量的生命周期是永久的&#xff0c;…...

人工智能轨道交通行业周刊-第35期(2023.2.20-2.26)

本期关键词&#xff1a;重庆智慧轨道、智能运维主机、标准轨距、地方铁路公报、景深、机器视觉应用 1 整理涉及公众号名单 1.1 行业类 RT轨道交通人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网上榜铁路视点ITS World轨道交通联盟VSTR铁路与城市轨道交通Rai…...

快慢指针判断链表是否有环

快慢指针判断链表是否有环 单链表有可能存在环&#xff0c;有些情况下要判断一个单链表是否有环。数组的有个快慢指针的方法&#xff0c;其实单链表和数组有相似的地方&#xff0c;可以使用快慢指针的方法。具体做法如下&#xff1a; 首先创建两个指针&#xff0c;它们初始时…...

《MongoDB入门教程》第26篇 聚合统计之$max/$min表达式

本文将会介绍两个 MongoDB 表达式&#xff0c;返回一组数据中最大值的 $max 表达式&#xff0c;以及返回一组数据中最小值的 $min 表达式。 $max 表达式 $max 表达式用于返回一组数据中的最大值&#xff0c;语法如下&#xff1a; { $max: <expression> }$max 表达式在…...

FPGA纯verilog解码SDI视频 纯逻辑资源实现 提供2套工程源码和技术支持

目录1、前言2、硬件电路解析SDI摄像头Gv8601a单端转差GTX解串SDI解码VGA时序恢复YUV转RGB图像输出FDMA图像缓存HDMI输出3、工程1详解&#xff1a;无缓存输出4、工程2详解&#xff1a;缓存3帧输出5、上板调试验证并演示6、福利&#xff1a;工程代码的获取1、前言 FPGA实现SDI视…...

JVM篇之垃圾回收

一.如何判断对象可以回收 1.引用计数法 只要一个对象被其他变量所引用&#xff0c;就让它的计数加1&#xff0c;被引用了两次就让它的计数变成2&#xff0c;当这个变量的计数变成0时&#xff0c;就可以被垃圾回收&#xff1b; 弊端&#xff1a;当出现如下图的情况&#xff0…...

尝试用程序计算Π(3.141592653......)

文章目录1. π\piπ2. 用微积分来计算π\piπ2.1 原理2.2 代码2.3 结果2.4 分析1. π\piπ π\piπ的重要性或者地位不用多说&#xff0c;有时候还是很好奇&#xff0c;精确地π\piπ值是怎么计算出来的。研究π\piπ的精确计算应该是很多数学家计算机科学家努力的方向&#xf…...

【异常检测三件套】系列3--时序异常检测综述

写在前面: 异常检测共包含3个内容,从多个方面剖析异常检测方法,本文为第三篇。过往内容请查看以下链接: 【异常检测三件套】系列1--14种异常检测算法https://blog.csdn.net/allein_STR/article/details/128114175?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%…...

关于SAP 错误日志解析

有时候启动或操作sap会出现故障&#xff0c;只是察看sap用户当前目录下的日志文件可能不得要领&#xff0c;此时有必要察看work目录下的一些trace. 以Linux系统为例&#xff0c;其他的也差不多。 instance说明 如下 DVEBMGS?? ABAP Central Instance D?? …...

java:自定义变量加载到系统变量后替换shell模版并执行shell

这里的需求前提是&#xff0c;在项目中进行某些操作前&#xff0c;需要在命令后对shell配置文件的进行修改&#xff08;如ip、port&#xff09;&#xff0c;这个对于用户是不友好的&#xff0c;需要改为用户页面输入ip、port&#xff0c;后台自动去操作修改配置&#xff1b;那么…...

Redis高级删除策略与数据淘汰

第二章&#xff1a;Redis高级 学习目标 目标1&#xff1a;能够说出redis中的数据删除策与略淘汰策略 目标2&#xff1a;能够说出主从复制的概念&#xff0c;工作流程以及场景问题及解决方案 目标3&#xff1a;能够说出哨兵的作用以及工作原理&#xff0c;以及如何启用哨兵 …...

社畜大学生的Python之pandas学习笔记,保姆入门级教学

接上期&#xff0c;上篇介绍了 NumPy&#xff0c;本篇介绍 pandas。 目录 pandas 入门pandas 的数据结构介绍基本功能汇总和计算描述统计处理缺失数据层次化索引 pandas 入门 Pandas 是基于 Numpy 构建的&#xff0c;让以 NumPy 为中心的应用变的更加简单。 Pandas是基于Numpy…...

20_FreeRTOS低功耗模式

目录 低功耗模式简介 STM32低功耗模式 Tickless模式详解 Tickless模式相关配置 实验源码 低功耗模式简介 很多应用场合对于功耗的要求很严格,比如可穿戴低功耗产品、物联网低功耗产品等。 一般MCU都有相应的低功耗模式,裸机开发时可以使用MCU的低功耗模式。 FreeRTOS也…...

Hive的使用方式

操作Hive可以在Shell命令行下操作&#xff0c;或者是使用JDBC代码的方式操作 针对命令行这种方式&#xff0c;其实还有两种使用 第一个是使用bin目录下的hive命令&#xff0c;这个是从hive一开始就支持的使用方式 后来又出现一个beeline命令&#xff0c;它是通过HiveServer2服…...

Flume三大核心组件

Flume的三大核心组件&#xff1a; Source&#xff1a;数据源 Channel&#xff1a;临时存储数据的管道 Sink&#xff1a;目的地 Source&#xff1a;数据源&#xff1a;通过source组件可以指定让Flume读取哪里的数据&#xff0c;然后将数据传递给后面的 channel Flume内置支持读…...

数据结构(六)二叉树

一、树形结构概念树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。它具有以下的特点&#xff1a;1、有一个…...