搜索
当前位置: 秒秒彩官网 > 读入原语 >

Beam系列之-Runner 开发指南

gecimao 发表于 2019-07-07 22:50 | 查看: | 回复:

  本指南将介绍如何实现新的Runner程序,目标人群是有一个数据处理系统,并希望使用它来执行Beam管道的开发者。本指南从基础出发,帮助您评估未来的工作。接着,后续部分越来越详细,可以用作整个开发过程中的参考资料。

  如果您有一个数据处理引擎,它可以非常容易地处理操作图。您希望将它与Beam生态系统集成,以支持其他语言,出色的事件时间处理和连接器库。你需要知道核心词汇:

  这些概念可能非常类似于处理引擎的概念。由于beam的设计是用于跨语言操作和可重用的转换库,因此有一些特殊的特性值得强调。

  在Beam中,PTransform可以是五个原语之一,也可以是封装子图的复合变换。原语是:

  在实现Runner时,这些是您需要实现的操作。复合转换对Runner可能重要,也可能不重要。如果你暴露一个UI,维护一些复合结构将使pipeline更容易让用户理解。但无论是否使用复合转换处理结果一致。

  PCollection是一个无序的元素包。你的Runner将负责存储这些元素。PCollection的一些主要方面需要注意:

  它们来源于批处理和流处理的直觉,但两者在Beam中是统一的,并且有界和无界的集合可以在同一Pipeline中共存。如果你的Runner只能支持有界的的PCollection,则需要拒绝包含无界PCollection的管道。如果您的Runner只针对流,那么在我们的支持代码中有适配器可以将所有内容转换为API要求的无界数据。

  当您对某个存储系统执行基本连接器时,该连接器负责提供初始时间戳。您的Runner将需要传递和聚合时间戳。如果时间戳不重要,就像某些批处理作业中的元素不表示事件一样,用最小值来表示时间戳,通常通俗地称为“负无穷大”。

  Watermarks有一个假定,“我们将永远看不到将来时间的元素”。数据源负责生成Watermarks。当处理、合并和分区PCollections时,Runner需要实现Watermarks传播。

  当Watermarks前进到“无穷大”时,PCollection的内容就完成了。通过这种方式,你会发现一个无边界的pcollection是有限的。

  PCollection中的每个元素都驻留在一个窗口中。没有元素驻留在多个窗口(两个元素可以相等,但它们的窗口不同);

  当从外部世界读取元素时,它们将到达全局窗口。当它们被写到外部世界时,它们被有效地放回到全局窗口中(任何不从这个角度看的写转换都可能会有数据丢失的风险)。

  每个窗口有个最大时间戳,当Watermarks超过此时间戳加上用户指定的允许延迟时,窗口将过期。与过期窗口相关的所有数据都可以随时丢弃。

  在Beam中,用户的管道可以用Runner语言以外的语言编写。Beam不要求Runner可以实际反序列化用户数据。因此,Beam模型主要在编码的数据上运行——“just bytes”。每个pcollection都有一个声明的元素编码,称为coder。coder有一个标识编码的URN,并且可能有附加的子coder(例如,列表的coder可能包含列表元素的coder)。特定于语言的序列化技术可以使用,并且经常使用,但有一些通用的键格式(如键-值对和时间戳),因此Runner可以理解它们。

  每个PCollection都有一个窗口化策略,窗口化策略是分组和触发操作的基本信息规范。

  下面我们将在讨论窗口原语(它设置了窗口化策略)和GroupByKey原语(它的行为受窗口化策略控制)时详细讨论。

  Beam有七种用户自定义函数(UDF)。Beam Pipeline可能包含以Runner以外的语言编写的UDF,甚至同一管道中包含多种语言(请参阅运行程序API),因此定义与语言无关(请参阅Fn API)。

  WindowFn-在窗口中放置元素并合并窗口(用于Window和GroupBykey)

  Source-发出从外部源读取的数据,包括并行机制的初始化和动态拆分(用于Read)。

  ViewFn-将物化PCollection适配到特定接口(用于旁路输入)

  WindowMappingFn-将一个元素的窗口转换到另一个窗口,并指定结果窗口过去的范围(用于旁路输入)

  Coder-编码用户数据;有些coder有标准格式,并非真正的UDF。

  “runner”一词多用,它通常指的是持有Beam Pipeline并且以某种方式执行它的软件,也指你编写的翻译pipeline 的代码,它还包括为你的处理引擎定制的操作,有时候指的是全栈。

  Runner仅有一个方法run(Pipeline)。从这里开始,我将经常在我们的API中使用代码字体作为专有名词,虽然这些标识符并非所有SDK中都一致。

  run(Pipeline)方法应该是异步的,在PipelineResult里的results它通常是你的数据处理引擎的作业描述符,提供检查任务状态、取消任务以及等待任务终止的方法。

  除了编码和持久化数据(这可能是您的引擎已经以某种方式完成的),您需要做的大部分工作是实现Beam原语。本节详细介绍了每个原语,包括您需要知道的可能不明显的内容以及提供了哪些支持代码。

  这些原语是为pipeline作者而不是Runner作者的利益而设计的。每个代表不同的概念操作模式(外部IO、按元素、分组、开窗、联合),而不是特定的实现决策。同一个原语可能需要非常不同的实现,这取决于用户如何实例化它。例如,使用状态或计时器的ParDo可能需要键分区,具有推测性触发的GroupByKey可能需要更昂贵或更复杂的实现,并且对有界和无界数据的读取完全不同。

  没关系!你不必一次完成所有的任务,甚至可能有一些功能对你的Runner来说根本没有意义。我们在Beam站点上维护一个能力矩阵,这样您就可以告诉用户您支持什么。当您收到pipeline时,您应该遍历它,并确定是否可以执行找到的每个DoFn。如果无法在pipeline中执行某些DoFn(或者如果Runner缺少任何其他要求),则应拒绝pipeline。在您的原生的环境中,这可能看起来像抛出了一个UnsupportedOperationException。为了跨语言的可移植性,Runner API RPCs将明确说明这一点。

  ParDo原语描述了PCollection的元素转换。ParDo是最复杂的原语,它是描述每个元素处理的地方。除了非常简单的操作(如来自函数式编程的标准map或flatMap),ParDo还支持多个输出、侧输入、初始化、刷新、拆卸和状态处理。

  应用于每个元素的UDF称为DoFn。DoFn的确切API可能因语言/SDK而异,但通常遵循相同的模式,因此我们可以用伪代码来讨论它。我也经常提到Java支持代码,因为我熟悉它,并且我们当前和将来的大多数Runner都是基于Java的。

  为了正确起见,DoFn应该表示一个面向元素的函数,但实际上它是一个长期存在的对象,它以称为bundles的小组处理元素。

  你的Runner可以决定在一个包中包含多少元素以及哪些元素,甚至可以在处理过程中动态地决定当前bundle已经“结束”。如何处理一个bundle与DoFn生命周期的其余部分联系在一起。

  通常尽可能大的bundle能提供吞吐量,从而使初始化和结束成本分摊到许多元素上。但是,如果您的数据是以流的形式到达的,那么您将希望终止一个包以实现适当的延迟,因此包可能只是几个元素。

  虽然每个语言的SDK都可以自由地做出不同的决定,但是Python和Java SDKs共享一个具有以下阶段的DoFn的生命周期的API。但是,如果你选择直接执行DoFn以提高性能或单语言的简单性,那么您的Runner需要负责实现以下序列:

  Setup-在执行任何其他操作之前对每个DoFn实例调用一次;这在Python SDK中没有实现,用户只需进行延迟初始化即可解决问题。

  StartBundle-作为初始化对每个bundle调用一次(实际上,延迟初始化几乎总是等价的,而且效率更高,但是为了用户的简单性,这个钩子仍然存在)

  ProcessElementOnTimer-为每个元素和计时器激活调用

  FinishBundle-基本上是“flush”;在实际处理的元素之前需要调用

  Teardown-释放跨bundle资源;由于失败,调用此资源可能是最大的努力。

  这些都在Java Runner的实现中大量使用。通过Fn API进行的调用可能表现为DoFnRunner的另一个实现,尽管它所做的远不止运行DoFn。

  旁路输入是PCollection窗口的全局视图。这将它与一次处理一个元素的主输入区分开来。SDK/用户充分准备了一个PCollection,Runner将其具体化,然后Runner将其提供给DoFn。您将需要实现的是检查为侧输入请求的物化,并适当地准备它,以及当DoFn读取旁路输入时的相应交互。

  如果您正在使用上面的某个DoFnRunner类,那么允许它们请求侧输入的接口是SideInputReader。它是从旁路输入和窗口到值的简单映射。DoFnRunner将使用WindowMappingFn执行映射,以请求适当的窗口,这样您就不用担心调用这个UDF了。当使用Fn API时,它也将是映射窗口的SDK工具。

  构建SideInputReader的一个简单但不一定是最佳方法是使用状态后端。在我们的Java支持代码中,这被称为StateInternals并且您可以构建一个SideInputHandler它将使用你的StateInternals具体化一个PCollection为合适的旁路输入视图,然后然后在特定的旁路输入和窗口请求时产生该值。

  当需要一个侧输入,但是侧输入没有与给定窗口相关联的数据时,该窗口中的元素必须延迟,直到侧输入有一些数据。上面提到的PushBackSideInputDoFnRunner用于实现这一点。

  当ParDo包含状态和计时器时,它在Runner上的执行通常是非常不同的。参阅此处所述内容之外的全部详细信息。状态和计时器按键和窗口进行分区。你可能需要或想要显式地shuffle数据以支持这一点。

  我们提供StatefulDoFnRunner来帮助状态清理。非面向用户的接口StateInternals通常由Runner实现,然后Beam支持代码可以使用它来实现面向用户的状态。

  可拆分的DoFn是ParDo和Read的泛化和组合。它是按元素处理的,其中每个元素都具有与有界源或无界源相同的“拆分”功能。这使您能够更好地处理,例如你要读取名称存在PCollection中的每个大文件,之类的情况。以前它们必须是pipeline中的静态数据,或者以不可分割的方式读取。

  GroupByKey操作(有时简称为gbk)按键和窗口对键值对PCollection进行分组,根据PCollection的触发配置发送结果。它比简单地将元素按照相同的键放在一起要复杂得多,并且使用了PCollection窗口策略中的许多字段。

  对与键和窗口,你的Runner将它们视为“just bytes”。因此,您需要以与按这些字节分组一致的方式进行分组,即使您对涉及的类型有一些特殊的了解。

  您正在处理的元素将是键值对,您需要提取键值。因此,键值对的格式被标准化,并在所有SDK中共享。关于二进制格式的文档,Java中看KvCoder或者Python中看TupleCoder。

  除了按键分组之外,你的Runner还必须按元素的窗口对其进行分组。WindowFn可以声明它根据每个键合并窗口。例如,如果相同键的会话窗口重叠,则它们将被合并。因此,Runner必须在分组期间调用WindowFn的merge方法。

  Java代码库包含用于实现完全GroupByKey操作的一种特别常见的方法的支持代码:首先按照键分组,然后按照窗口分组。对于合并窗口,这基本上是必需的,因为合并是按键进行的。

  过期窗口的数据可以随时删除,应在GroupByKey处删除。如果您使用的是GroupAlsoByWindow,则在执行此转换之前。如果在GroupByKeyOnly之前删除数据,则可以减少数据的无序移动,但只能安全地对未合并的窗口执行,因为出现过期的窗口可能合并为未过期的窗口。

  输入PCollection的触发器和累积模式指定从GroupByKey操作发出输出的时间和方式。在Java中,在GroupAlsoByWindow实现、ReduceFnRunner和TriggerStateMachine中有很多执行触发器的支持代码,这是一种很明显的方法,可以将所有触发器作为一个事件驱动的机器在元素和计时器上实现。

  当从多个输入生成聚合输出时,GroupByKey操作必须为组合选择时间戳。为此,首先,Windowfn有机会移动时间戳-这是为了确保watermarks不会阻止诸如滑动窗口之类的窗口的进展(详细信息在本文档之外)。然后,需要组合移动的时间戳-这是由TimestampCombiner指定的,它可以选择其输入的最小值或最大值,也可以忽略输入并选择窗口的结尾。

  窗口原语应用WindowFn UDF将每个输入元素放入其输出PCollection的一个或多个窗口中。请注意,窗口原语还通常为PCollection配置窗口化策略的其他方面,但是Runner收到的完全构造的图已经为每个PCollection提供了完整的窗口化策略。

  要实现这个原语,你需要在每个元素上调用提供的WindowFn,它将为该元素返回一些窗口集,并成为输出PCollection的一部分。

  “窗口”只是具有“最大时间戳”的第二个分组键。它可以是任意的用户定义类型。WindowFn为窗口类型提供编码器。

  Beam的支持代码提供了WindowedValue,它是多个窗口中一个元素的压缩表示。您可能需要使用这个,或者您自己的压缩表示。请记住,它只是同时表示多个元素;没有在多个窗口中的元素这样的东西。

  对于全局窗口中的值,您可能希望使用一个更进一步的压缩表示,它根本不需要包括窗口。

  将来,如果增强ParDo的功能以允许输出到新窗口,则可以作为ParDo来实现此原语,从而使其退役。

  您可以实现这个原语来从外部系统读取数据。这些API经过精心设计以实现高效的并行执行。从无边界源读取与从有边界源读取有点不同。

  BoundedSource是有限数据的数据源,例如日志文件的静态集合或数据库表。它的功能是:

  BoundedSource当前不汇报watermark。大多数情况下,从一个有界数据源读取数据可以以完全无序的方式进行并行处理,因此watermark不是十分有用处。因此,在整个读取过程中,来自有界读取的输出PCollection的watermark应保持在最小时间戳(否则数据可能会丢失),并在所有数据耗尽时前进到最大时间戳。

  这个简单-它用PCollection的一个有限集作为输入,并输出它们的并集,同时保持窗口的完整性。

  还要注意,没有要求所有集合的coder都是相同的。如果你的Runner想要这样做(为了避免冗长的重新编码),你必须自己去执行。或者您可以将快速路径作为优化实现。

  Combine(按键)是一个总是被Runner专门处理的复合转换,它对PCollection的元素应用关联和交换操作符。此复合不是原语。它是以ParDo和GroupByKey的形式实现的,因此Runner不需要处理它就可以工作——但是它确实携带了一些您可能希望用于优化的附加信息:关联交换操作符,即CombineFn。

  当您收到来自用户的管道时,需要对其进行翻译。这是一个您将使用的API教程。

  通常,保持翻译简单的最好方法是在翻译之前更改pipeline。你可能会进行一些更改:

  Beam Java SDK和Python SDK具有Runner验证测试套件。配置可能比本文档发展得更快,因此请检查其他Beam Runner的配置。但请注意,我们有测试,您可以很容易地使用它们!使用Gradle 基于Java语言的Runner为了启用这些测试,你可以扫描SDK依赖关系,以查找JUnit类别ValidatesRunner的测试。

  无论您的Runner是否与SDK(如Java)相同的语言,如果您希望SDK的用户(如Python)使用它,你将希望提供一个楔子从其他SDK调用它。

  配置的机制是PipelineOptions一个与普通Java对象完全不同的接口。忘记你所知道的,遵循规则,PipelineOptions会对你很好。你必须为你的Runner实现一个子接口,它具有与配置选项对应名称的getters和setters方法,如:

  在python sdk中,代码的注册不是自动的。因此,在创建新的Runner时,几乎没有什么需要记住的。

  我们完全欢迎您在实用程序代码的语言中使用SDK,或者为相同语言的UDF提供bundle处理的优化实现。

  要执行这样一个与SDK无关的管道,您需要支持Fn API。UDF作为函数的规范(通常只是特定语言的不透明序列化字节)以及可以执行它的环境的规范(本质上是特定的SDK)嵌入到管道中。到目前为止,这个规范应该是承载sdk的Fn API线束的Docker容器的URI。

  pipeline的独立于语言的定义是通过protocol buffers模式描述的,下面介绍以供参考。但您的Runner不应该直接操作protobuf消息。相反,Beam 代码库提供了处理管道的工具程序,这样你就不需要知道pipeline是否已经被序列化或传输,也不需要知道它可能是用什么语言编写的。

  只通过这些类检查transform,您的运行程序将不依赖于Java SDK的细节。

  Runner API是Beam 模型中概念的具体表现形式,作为protocol buffers 模式。即使您不应该直接操作这些信息,了解组成pipeline的规范数据也是很有帮助的。

  大多数API与高级描述完全相同;您可以开始实现一个Runner,而不必了解所有低级细节。

  Runner API对你来说最重要的一点是它是一个独立于语言的Beam pipeline定义。你可能总是通过一个特定的SDK的支持代码进行交互,该支持代码用合理的惯用API包装这些定义,但请始终注意,这是规范,任何其他数据不一定是pipeline固有的,但可能是特定于SDK的丰富功能(或bug!).

  Pipeline中的UDF可以为任何Beam SDK编写,甚至同一pipeline中包含多种Beam SDK。因此,我们将从这里开始,采用自下而上的方法来理解UDF的protocol buffers定义,然后再回到更高级别(通常是显而易见的)记录定义。

  跨语言可移植性的核心是FunctionSpec。这是一个与语言无关的函数规范,在通常的编程意义上,该规范包括副作用等。、

  当一个用FunctionSpec表示一个UDF时,通常只有序列化它的SDK才能保证理解它。在这种情况下,它总是带有一个能够理解和执行该函数的环境。这由SdkFunctionSpec表示。

  在Runner API中,许多对象是通过引用存储的。这里的environment_id是一个指针,位于pipeline的本地,由序列化它的SDK组成,可以取消引用以生成实际的环境proto。

  到目前为止,环境应该是可以执行指定的UDF的SDK工具包的Docker容器规范。

  原始转换的有效负载只是其规范的原型序列化。与其在这里复制它们的完整代码,我只突出显示重要的部分,以展示它们是如何组合在一起的。

  值得再次强调的是,虽然您可能不会直接与这些有效负载交互,但它们是转换固有部分的唯一数据。

  ParDo转换在SdkFunctionSpec中携带其DoFn,然后为其其他特性(侧输入、状态声明、计时器声明等)提供独立于语言的规范。

  Combine不是原语。但是,非原语完全能携带额外信息来进行更好的优化。Combine转换携带的最重要的东西是SdkFunctionSpec记录中的CombineFn。为了有效地进行所需的优化,还需要了解中间积累器的coder,因此它也携带了这个coder的一个引用。

  如果是一个复合的PTransform,则它可能具有子transform,在这种情况下,由于子transform定义了它的行为,因此可以省略FunctionSpec。

  输入和输出PCollections是无序的,由本地名称引用。SDK决定这个名称是什么,因为它很可能嵌入到序列化的UDF中。

  这是一个非常有趣的proto。编码程序是一个参数化函数,它只能被特定的SDK理解,因此是一个SdkFunctionSpec,但也可能有组件coder可以完全定义它。例如,ListCoder只是一种元格式,而ListCoder(VarIntCoder)是一种完全指定的格式。

  虽然你的语言的SDK可能会使你无法直接接触到Runner API protos,但你可能需要为Runner实现适配器,以便将其暴露给其他语言。因此,本节将介绍你可能会直接与之交互的proto。

  现有的Runner方法调用将被表示为RPCs的具体方式尚未实现为proto。这个RPC层可以使用Python SDK来构建一个pipeline,并将它发送到用Java编写的一个Runner上。预计一个小Python 垫片将与Java进程或托管Runner API的服务进行通信。

  当前这个API中的两个核心功能是获取作业状态和取消作业。它很可能会演变,例如,被泛化为支持排出作业(停止读取输入,让watermark无限)。当前,验证我们的测试框架有益于(但不完全依赖于)在此通道上查询度量信息。

  ApacheBeam是统一批处理(Batch)模式和数据流(Stream)处理模式的标准.在大数据各种框架中,比如进行批处理的MapReduce,实时流处理的Flink,以及SQL交互的SparkSQ...博文来自:29DCH的博客

  MapReduce的缺点:1.开发 wordcount程序复杂 只支持map和reduce方法 执行效率低下 以作业连方式串起来执行 打包2.运行速度:  map输出写到磁盘,reduce写到hdfs...博文来自:慧有未来

  1.简介简单地说,ApacheBeam是一个实时处理、流处理的大数据框架,由GoogleDataFlow贡献给Apache基金会孵化而来。2.应用场景以下为应用场景的几个例子:1.Beam可以用于ET...博文来自:AndyCat的知识库

  uCOS-III应用开发指南--基于STM32F103系列,适合初学操作系统的新手下载,讲解详细,质量高清,欢迎下载

  【开发指南】M6G2C系列核心板软件开发指南_V1.05 (1) 第十六章串口编程 博客地址:

  本参考手册向应用程序开发人员提供关于如何使用 STM32F05xxx 微控制器的内存和外设所涉及的全部信息

  网上看了别人都在谈Beam,你说咱们作为技术人员技术也得紧跟着时代不是,所以也开始利用业余时间研究Beam。咱不是大神,不能啥都一看就会,所以一天一天来,这个也就作为笔记吧。废话不多说,进入主题,按照...博文来自:MOON

  BEAM是基于MimbleWimble协议开发的加密货币,采用PoW共识,致力于解决比特币在扩展性和私密性上的不足,在国内外都备受关注。2019年1月3日晚上10点,各大矿池开始上线开挖。BEAM...博文来自:hui2310的博客

  你知道被认为继MapReduce、GFS、BigQuery等之后,Google在大数据处理领域对开源社区的又一大贡献是哪个项目吗?答案是ApacheBeam。事实上,“Beam”这个项目名称已经很清楚...博文来自:dashenghuahua的博客

  Beam 是基于MimbleWimble协议开发的加密货币,采用PoW共识,致力于解决比特币在扩展性和私密性上的不足,在国内外都备受关注。Beam主网预计于北京时间今天(2019年1月3日)晚上22...博文来自:hui2310的博客

  BEAM这个币最近被很多人所关注,也有很多人提出了有关这个币的问题,下面笔者将自己知道的情况说出来,和各位矿工们一起交流一下。BEAM,这个币官方的公告里面,宣称并没有预售、预挖,什么都没有,...博文来自:lolojess的博客

  关于ApacheBeam实战指南系列文章随着大数据2.0时代悄然到来,大数据从简单的批处理扩展到了实时处理、流处理、交互式查询和机器学习应用。近年来涌现出诸多大数据应用组件,如HBase、Hive、K...博文来自:jiawoxuexi的博客

  [野火]《i.MXRT库开发实战指南》更新了,欢迎下载。完成lt;自己写库—构建库函数雏形gt;章节,告诉大家什么是固件库,教会大家官方的固件库是怎么从寄存器映射开始,再到寄存器...博文来自:karaxiaoyu的专栏

  本文参考ApacheBeam官方编程手册在默认情况下,ApacheBeam是不分窗的,也就是采用GlobalWindow,而如果同时也不设置自定义的触发器,那么Beam会在所有数据都收集到之后才开始对...博文来自:huang1433的博客

  机器学习(二十三)——BeamSearch,NLP机器翻译常用评价度量,模型驱动vs数据驱动...博文来自:antkillerfarm的专栏

  我的个人博客网站上线啦!所有文章都搬到新地址了,点击围观吧!hello~,如果erlang源码被意外删除只留下编译后的beam文件的时候怎么办?如果源码能还原也就大事化了,如果不能就懵了?都有手误的是...博文来自:活着离开这世界

  维特比算法输入序列为词,输出序列为POS,采用HMM为例介绍维特比算法这里HMM假设当前的输出只和上一时刻的输出状态相关。迭代公式如下:amp;amp;amp;#x03C0;(t,i,j)=...博文来自:yiqingyang2012的专栏

  nfcbeam文件分享失败的问题单处理,有在源码中加自己的日志,查找问题的日志也提供给大家,方便查看...博文来自:红旺永福

  解码是seq2seq模型的常见问题,常用方法有贪心搜索(GreedySearch)集束搜索(BeamSearch)。简单贪心搜索From[1]如图,Decoder根据Encoder的中间语义编码向量c...博文来自:藏知阁

  在数学之美中曾介绍维特比算法,其根据自然语言句子生成的特性,利用动态规划方法,找到生成的最大可能性句子。但其同样存在弊端,如如果字典的长度非常大的话,那么查找的状态将会非常多,影响效率。而在句子生成中...博文来自:心之所向

  大数据时代中,数据从简单的批处理,扩展到实时处理、流处理。起初的MapReduce处理模式早已独木难支。此外,大数据处理技术也是百花齐放,如HBase、Hive、Kafka、Spark、Flink等,...博文来自:william_jm~一个人的学习之旅

  概要介绍了深度优先和广度优先的搜索方法基本概念open表保存未访问过的路径close表保存访问过的路径,防止进入一个死循环。具体算法从某一个开始节点访问所有的可到达的顶点在很多场景下非常有用,例如下图...博文来自:风云的专栏

  ApacheBeam是一种大数据处理标准,由谷歌于2016年创建。它提供了一套统一的DSL用以处理离线和实时数据,并能在目前主流的大数据处理平台上使用,包括Spark、Flink、以及谷歌自身的商业套...博文来自:张吉的博客

  一:BEAM是什么BEAM是尝试实现MimbleWimble的新币种,它是从C++从头开始写的。和Grin相比较,Grin的代币总量是无限的,而BEAM的代币具有有限的供应及周期性报酬减半。BEAM具...博文来自:weixin_44059302的博客

  最近在修改Android7.0原生平台的一些bug,其中有关AndroidBeam传输文件的一些问题还是蛮多的。所以特地找时间总结下曾经踏过的坑。1.传输的文件名包含中文时,导致传输失败。2.传输的文...博文来自:RoidCoder的个人博客

  Whatbeam是对于整列天线电磁波传播的一种样式。一个天线的时候,电磁波的辐射方向是360度传播的,但是一个天线阵列可以实现电磁波单方向传播。天线个数越多,电磁波传播方向越集中。Why5G采用了be...博文来自:atbjss的博客

  jquery/js实现一个网页同时调用多个倒计时(最新的)nn最近需要网页添加多个倒计时. 查阅网络,基本上都是千遍一律的不好用. 自己按需写了个.希望对大家有用. 有用请赞一个哦!nnnn//jsn...博文来自:Websites

  最近比较有空,大四出来实习几个月了,作为实习狗的我,被叫去研究Docker了,汗汗!nnDocker的三大核心概念:镜像、容器、仓库n镜像:类似虚拟机的镜像、用俗话说就是安装文件。n容器:类似一个轻量...博文来自:我走小路的博客

  本篇文章是根据我的上篇博客,给出的改进版,由于时间有限,仅做了一个简单的优化。相关文章:将excel导入数据库2018年4月1日,新增下载地址链接:点击打开源码下载地址十分抱歉,这个链接地址没有在这篇...博文来自:Lynn_Blog

本文链接:http://k-mood.com/duruyuanyu/513.html
随机为您推荐歌词

联系我们 | 关于我们 | 网友投稿 | 版权声明 | 广告服务 | 站点统计 | 网站地图

版权声明:本站资源均来自互联网,如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

Copyright @ 2012-2013 织梦猫 版权所有  Powered by Dedecms 5.7
渝ICP备10013703号  

回顶部