对于流和批处理的世界,我仍然是非常新的,并且试图理解概念和描述。诚然,我的问题的答案是众所周知的,很容易找到,甚至在这里回答了一百次,但我找不到它。
背景:
我在一个大型的科学项目(核聚变研究)中工作,在实验运行期间,我们正在生产大量的测量数据。这些数据大多是带有纳秒时间戳的样本流,其中样本可以是从一个ADC值到一个这样的数组,通过深度结构化数据(多达数百个条目,从1位布尔到64位双精度浮动)到原始高清视频帧甚至字符串文本消息。如果我正确理解常用的术语,我将把我们的数据视为“表格数据”,在大多数情况下。
我们主要使用自制的软件解决方案,从数据采集到简单的在线(流)分析(如缩放、次采样等)到我们自己的数据收集、管理和访问设施。
鉴于操作的规模和维护所有这些实现的努力,我们正在研究使用标准框架和工具执行更多任务的可能性。
我的问题是:
特别是在这一阶段,我们面临着越来越多的对实时/在线/实时数据以及“历史”数据的脱机/批量分析的软化(自动化和手动)数据分析的需要。在这篇奋进号中,我试图了解现有的分析框架,如星火、Flink、Storm等(可能是由Kafka、Pulsar、.等消息队列支持的)。可以支持一个场景,其中
简单地将在线数据流到存储和查询中似乎没有选择,因为我们需要原始和分析的数据来进行实时监控和实时反馈控制实验。此外,让用户以不同的方式查询实时输入信号或存储的历史批次也不是理想的,因为我们的物理学家大多不是数据科学家,我们希望远离这些“技术细节”,而且理想的是,应该使用相同的算法来分析新的实时数据和以前实验中存储的旧数据。
Sitenotes:
如果有人能理解我的问题,并为我阐明这一主题,我将非常高兴:)
非常感谢和亲切的问候,碧波
发布于 2019-03-14 08:41:28
我认为没有人能说“是的,framework绝对可以处理您的工作负载”,因为这在很大程度上取决于您在消息处理中需要什么,例如关于消息传递的可靠性,以及如何对数据流进行分区。
您可能对BenchmarkingDistributedStreamProcessingEngines感兴趣。这篇论文使用的是几年前的Storm/Flink/Spark版本(看起来像是在2016年发布的),但也许作者愿意让你使用他们的基准来评估这三个框架的更新版本?
流分析的一个非常常见的设置是去数据源-> Kafka/Pulsar ->分析框架->长期数据存储。这使处理与数据摄取分离,并允许您像处理历史数据一样重新处理历史数据,就好像它是新的。
我认为你的第一步应该是看看你是否可以通过Kafka/Pulsar获得你需要的数据量。要么手动生成测试集,要么从生产环境获取一些您认为具有代表性的数据,看看是否可以在所需的吞吐量/延迟时通过Kafka/Pulsar进行测试。
记住要考虑对数据进行分区。如果可以独立处理某些数据流(例如,排序并不重要),则不应该将它们放在相同的分区中。例如,可能没有理由混合传感器测量和视频输入流。如果您可以将数据分离到独立的流中,那么在Kafka/Pulsar和分析框架中,您都不太可能遇到瓶颈。单独的数据流还将允许您更好地并行化分析框架中的处理,因为您可以在不同的机器上运行例如视频馈送和传感器处理。
一旦您知道是否可以通过Kafka/Pulsar获得足够的吞吐量,就应该为这3个框架中的每个框架编写一个小示例。首先,我会接收并丢弃来自Kafka/Pulsar的数据,这应该会让你提前知道卡夫卡/脉冲星->分析路径中是否存在瓶颈。在此之后,您可以扩展该示例,以便对示例数据执行一些有趣的操作,例如,执行一些类似于您在生产中可能要做的处理。
您还需要考虑数据流需要哪些类型的处理保证。通常,您将支付至少一次或准确一次处理保证性能的惩罚。对于某些类型的数据(例如视频提要),偶尔丢失消息是可以的。一旦确定了所需的保证,就可以适当地配置分析框架(例如禁用Storm中的acking ),并尝试对测试数据进行基准测试。
为了更明确地回答你的一些问题:
实时数据分析/监视用例听起来很适合Storm/Flink系统。把它直接连接到Kafka/Pulsar,然后做任何你需要的分析,听起来可能对你有用。
历史数据的重新处理将取决于您需要执行什么样的查询。如果您只需要一个时间间隔+ id,您可能需要使用Kafka加上过滤器或适当的分区。Kafka允许您在特定的时间戳上开始处理,如果您的数据是由id分区的,或者将其作为分析中的第一步,您可以从提供的时间戳开始,当您在时间窗口外单击消息时停止处理。这只有当你感兴趣的时间戳是当信息被添加到卡夫卡时才适用。我也不相信卡夫卡支持低于毫秒的决议,它产生的时间戳。
如果您需要执行更高级的查询(例如,您需要查看由传感器生成的时间戳),您可以考虑使用卡桑德拉、弹性搜索或索尔作为永久数据存储。您还需要研究如何将这些系统的数据返回到您的分析系统中。例如,我相信Spark提供了一个连接器,用于从Elasticsearch读取,而Elasticsearch则为Storm提供了一个连接器。您应该检查数据存储/分析系统组合中是否存在这样的连接器,或者愿意编写自己的连接器。
编辑:详细说明以回答您的评论。
我不知道Kafka或Pulsar支持用户指定的时间戳,但可以肯定的是,它们是两者都有 做。但我不认为普尔萨尔支持亚毫秒的时间戳?
卡夫卡肯定会支持你所描述的想法。
您需要的是能够在特定的时间戳上启动Kafka/Pulsar客户端,并向前阅读。脉冲星似乎还不支持这一点,但卡夫卡支持。
您需要保证,当您将数据写入分区时,它们会按照时间戳的顺序到达。这意味着您不允许使用时间戳10编写第一条消息1,然后用时间戳5编写消息2。
如果你能确保你写的信息,以便卡夫卡,你所描述的例子将有效。然后你可以说“从时间戳开始‘昨晚午夜’”,卡夫卡将从那里开始。当实时数据进入时,它将接收它并将其添加到日志的末尾。当使用者/分析框架读取了从上个午夜到当前时间的所有数据时,它将开始等待新的(实时)数据的到来,并在它进来时进行处理。然后,您可以在分析框架中编写自定义代码,以确保它在到达带有时间戳的“明晚”的第一条消息时停止处理。
关于支持亚毫秒时间戳,我不认为卡夫卡或普尔萨尔会支持它的盒子,但你可以合理地轻松地解决它。只需将子毫秒时间戳作为自定义字段放在消息中即可。当您想在例如时间戳9ms 10 ask开始时,请Kafka从9 9ms开始,并在分析框架中使用过滤器将所有消息从9ms到9ms 10 ask之间删除。
发布于 2019-04-26 15:28:39
请允许我添加以下建议,说明Apache如何帮助满足您的一些需求。作为思考的食物。
数据正在流/流到平台/框架中,并附加了一个标识符,如URL或ID之类的
您可能想看看 脉冲星函数,它允许您编写简单的函数(用Java或Python),在发布到主题的每个消息上执行这些函数。它们非常适合于这种类型的数据增强用例.。
该平台与集成或外部存储交互,以持久化与标识符相关联的流数据(数年)。
Pulsar最近添加了 分层存储,允许您在S3、Azure或Google存储中保留事件流。这将使您能够将数据保存在廉价和可靠的数据存储区中数年。
分析过程现在可以透明地查询/分析由标识符和任意(打开或关闭)时间窗口处理的数据,该框架支持数据批/样本,用于从后端存储或从数据采集中实时进入分析。
Apache Pulsar还在Presto查询引擎中添加了 集成 ,它允许您在给定的时间内查询数据(包括分层存储的数据),并将其放入一个主题中进行处理.。
https://stackoverflow.com/questions/55147517
复制相似问题