透明流和批处理

uqdfh47h  于 2021-06-24  发布在  Storm
关注(0)|答案(2)|浏览(321)

我对流式处理和批处理的世界还是相当陌生的,我试图理解一些概念和语言。令人钦佩的是,我的问题的答案很可能众所周知,很容易找到,甚至在这里回答了一百次,但我没有找到它。
背景:
我在一个大的科学项目(核聚变研究)中工作,我们在实验过程中产生了大量的测量数据。这些数据大多是以纳秒时间戳标记的样本流,其中样本可以是任何内容,从单个的by adc值,通过这样的数组,通过深度结构化数据(从1位布尔到64位双精度浮点,多达数百个条目),到原始高清视频帧,甚至是字符串文本消息。如果我对常用术语理解正确的话,我将把我们的数据视为“表格数据”。
我们主要使用自制的软件解决方案,从简单的在线(流)分析数据采集(如缩放、子采样等)到我们自己的数据采集、管理和访问设施。
考虑到操作的规模和维护所有这些实现的努力,我们正在研究为我们的更多任务使用标准框架和工具的可能性。
我的问题是:
特别是在这一阶段,我们面临着对实时/在线/实时数据以及对“历史”数据的“事后”离线/批量分析越来越多的模拟(自动和手动)数据分析的需求。在本文中,我试图了解现有的分析框架如spark、flink、storm等(可能由kafka、pulsar等消息队列支持)是否以及如何支持一个场景,其中
数据流入平台/框架,附加一个标识符,如url或id等
该平台与集成或外部存储器交互,以保存与标识符相关联的流数据(数年)
分析过程现在可以透明地查询/分析由标识符和任意(打开或关闭)时间窗口处理的数据,并且该框架提供用于分析的数据批/样本,无论是来自后端存储还是来自数据采集的实时数据
简单地将在线数据流到存储器中并从中查询似乎没有选择,因为我们需要原始和分析的数据来进行实时监控和实验的实时反馈控制。另外,让用户以不同的方式查询实时输入信号或存储中的历史批次也不理想,由于我们的物理学家大多不是数据科学家,我们希望远离这些“技术细节”,理想情况下,应该使用完全相同的算法来分析新的实时数据和以前实验中存储的旧数据。
网站说明:
我们讨论的是每秒10千兆位范围内的peek数据负载,它以秒到分钟的长度不断增加,这能由候选者处理吗?
我们使用的是纳秒分辨率的时间戳,甚至考虑到皮卡-如果我没有正确理解,这对可能的候选名单造成了一些限制?
如果有人能理解我的问题,并能为我解释一下这个主题,我将不胜感激:-)
非常感谢和亲切的问候,贝波

pexxcrt2

pexxcrt21#

请允许我添加以下关于apachepulsar如何帮助解决您的一些需求的建议。值得深思。
数据流入平台/框架,附加了一个标识符,如url或id等
您可能想看看pulsar函数,它允许您编写简单的函数(用java或python)来执行发布到主题的每个消息。它们非常适合这种类型的数据扩充用例。
该平台与集成或外部存储器交互,以保存与标识符相关联的流数据(数年)
pulsar最近添加了分层存储,允许您在s3、azure blob store或google云存储中保留事件流。这将允许您将数据保存在廉价可靠的数据存储中多年
分析过程现在可以透明地进行

4xrmg8kj

4xrmg8kj2#

我不认为任何人可以说“是的,frameworkx肯定可以处理您的工作负载”,因为这在很大程度上取决于您对消息处理的需求,例如关于消息传递的可靠性,以及如何对数据流进行分区。
您可能对基准测试DistributedStreamProcessingEngines感兴趣。本文使用的是几年前的storm/flink/spark版本(看起来它们是在2016年发布的),但也许作者愿意让您使用他们的基准来评估这三个框架的更新版本?
流式分析的一个非常常见的设置是:数据源->kafka/pulsar->分析框架->长期数据存储。这使处理与数据摄取分离,并允许您像重新处理新的历史数据一样进行处理。
我认为你的第一步应该是看看你是否可以通过Kafka/脉冲星获得你需要的数据量。或者手动生成一个测试集,或者从您的生产环境中获取一些您认为具有代表性的数据,看看是否可以以您需要的吞吐量/延迟通过kafka/pulsar。
记住要考虑对数据进行分区。如果某些数据流可以独立处理(即排序无关紧要),则不应将它们放在同一分区中。例如,可能没有理由混合传感器测量和视频馈送流。如果你能将你的数据分成独立的数据流,你就不太可能在kafka/pulsar和分析框架中遇到瓶颈。单独的数据流还可以让您更好地并行分析框架中的处理,因为您可以在不同的机器上运行例如视频馈送和传感器处理。
一旦您知道是否可以通过kafka/pulsar获得足够的吞吐量,就应该为这3个框架中的每一个编写一个小示例。首先,我只需要接收并丢弃来自kafka/pulsar的数据,这会让您尽早知道kafka/pulsar->分析路径中是否存在瓶颈。之后,您可以扩展示例,对示例数据执行一些有趣的操作,例如,像您在生产中可能希望执行的操作那样执行一些处理。
您还需要考虑数据流需要哪种处理保证。一般来说,您将为保证至少一次或恰好一次处理而支付性能惩罚。对于某些类型的数据(例如视频源),偶尔丢失消息是可以的。一旦确定了所需的保证,就可以适当地配置分析框架(例如,在storm中禁用acking),并尝试对测试数据进行基准测试。
只是想更明确地回答你的一些问题:
实时数据分析/监控用例听起来很适合storm/flink系统。把它直接连接到Kafka/脉冲星上,然后做任何你需要的分析,听起来好像对你有用。
重新处理历史数据将取决于您需要执行何种查询。如果您只需要一个时间间隔+id,那么您可以使用kafka加上一个过滤器或适当的分区来实现这一点。kafka允许您在特定的时间戳开始处理数据,如果您的数据是按id进行分区的,或者您将其作为分析的第一步进行过滤,那么您可以在提供的时间戳开始处理数据,并在时间窗口外点击消息时停止处理。这只适用于你感兴趣的时间戳是当消息被添加到Kafka的时候。我也不相信Kafka在它生成的时间戳上支持低于毫秒的分辨率。
如果您需要执行更高级的查询(例如,您需要查看传感器生成的时间戳),您可以使用cassandra或elasticsearch或solr作为永久数据存储。您还需要研究如何将这些系统中的数据返回到您的分析系统中。例如,我相信spark附带了一个用于从elasticsearch读取数据的连接器,而elasticsearch提供了一个用于storm的连接器。你应该检查你的数据存储/分析系统组合是否存在这样一个连接器,或者愿意自己编写。
编辑:详细回答你的评论。
我不知道kafka或pulsar支持用户指定的时间戳,但可以肯定的是,它们都支持。我看不出脉冲星支持亚毫秒时间戳?
你所描述的想法肯定能得到Kafka的支持。
您需要的是能够在特定的时间戳启动kafka/pulsar客户机,并向前读取。脉冲星似乎还不支持这一点,但Kafka支持。
您需要保证,当您将数据写入分区时,它们按时间戳的顺序到达。这意味着不允许您(例如)首先写入带有时间戳10的消息1,然后写入带有时间戳5的消息2。
如果你能确保你写的消息,以便Kafka,你所描述的例子将工作。然后你可以说“从时间戳开始‘昨晚午夜’”,Kafka就会从那里开始。当实时数据进入时,它将接收数据并将其添加到日志的末尾。当consumer/analytics框架读取了从上一个午夜到当前时间的所有数据后,它将开始等待新的(实时)数据到达,并在数据到达时对其进行处理。然后,您可以在分析框架中编写自定义代码,以确保它在到达时间戳为“明晚”的第一条消息时停止处理。
关于对亚毫秒时间戳的支持,我不认为kafka或pulsar会支持它,但是你可以很容易地解决它。只需将次毫秒时间戳作为自定义字段放入消息中。当您想从时间戳9ms 10ns开始时,您要求kafka从9ms开始,并使用分析框架中的过滤器删除9ms到9ms 10ns之间的所有消息。

相关问题