当前位置: 首页 > 网络应用技术

基于冰山的大量存储实践的字节跳动

时间:2023-03-09 12:45:15 网络应用技术

  当前行业中特征存储的总体过程主要分为以下四个步骤:

  功能存储的总体过程

  基于上述问题,我们总结了业务方的几个需求:

  在字节的整体体系结构中,顶层是业务层,包括绝大多数字节线,例如Douyin,头条新闻,小说;

  在下面,我们使用平台层为商务同学提供简单易用的UI和访问控制;

  在框架层中,我们将Spark用作特征处理框架(包括预处理和离线功能研究等)。Bytes开发的Primus作为培训框架;

  在格式层,我们选择镶木材料作为文件格式,将冰山作为格式。

  底层是调度程序纱线和K8S和存储HDFS。

  下面我们关注格式层的详细介绍。

  为了满足商业团体提到的六个需求,我们想到的第一件事是通过镶木木的格式降低类别的存储成本,可以使用保存的空间来存储原始功能。同一时间,由于可以将镶木木选择推到存储层,因此它只能在训练过程中读取所需的功能,从而降低训练过程中背部序列的成本,并提高训练速度。

  但是,引入了其他问题以使用镶木。原始存储基于Protobuf定义的半结构数据。无需提前定义模式。在使用Parquet之后,当功能是新的和消除的时,架构的更新是一个难以求解的问题。Parquet不支持数据回填。如果您想填写几年的历史数据,则需要全额阅读数据,添加新列表,然后全部写回数据。一方面,将下注大量计算资源。在另一个Handoverwrite操作中,由于更换文件,当前的培训任务失败了。

  为了解决这些问题,我们介绍了冰山以支持模式演变,特征回填以及并发阅读和写作。

  冰山是大型数据集的开源格式。它具有模式演化,隐藏分区和分区演化,事务,MVCC和计算存储引擎解耦的特征。这些特征符合我们的所有需求。因此,我们选择了冰山。

  总体冰山是一个分层的结构,快照层存储了当前表的所有快照。清单列表层存储了每个快递照片中包含的清单云数据。清单层,存储较低的数据文件元数据;底部数据文件是实际的数据文件。通过这样的多层结构,冰山可以支持上述特征,包括模型演变。

  让我们介绍冰山如何一一支持这些功能。

  在同时阅读方面,冰山是基于快照阅读的。将为冰山的每个操作生成新的快照,这不会影响正在阅读的快照,从而确保阅读和写作不会彼此影响。

  在同时写作方面,冰山采用乐观和并发的方式。它使用HDFS MV的原子语义来确保只能成功编写一个语义,并将检查其他并发写作是否存在冲突。如果没有冲突,请下一步写。

  冰山的模型进化原理

  我们知道,冰山元数据和帕quet元数据都有列,并且中间的映射关系由ID字段执行。

  例如,在上面的左图中,冰山和镶木木有三列,对应于ID 1、2和3。然后,最终的读取数据框架是ABC的ABC三列,ABC具有ID 1、2和3的ABC。parquet.t也是ABC三列,但是此B -column ID不是Parquet中B列的ID,因此在最终的实际数据中,B列B为空值。

  如上图所示,牛方法的功能背面通过回填任务读取原始快速照片中的所有数据,然后将其写入新列表,然后将其写入新数据文件,然后生成新快照。

  该方法的缺点是,尽管我们只需要编写一列数据,但我们需要读取所有总体数据,然后再写回去,不仅浪费了很多计算资源来编码整个parquet文件,还浪费大量读取完整数据,并浪费了大量存储资源来存储重复的ABC列。

  因此,我们基于开源冰山制定了MOR的回填方案。

  如上图所示,在MOR解决方案中,我们仍然需要一个回填任务来读取原始数据文件,但是在这里我们只读取所需的字段。计算逻辑,然后“回填任务”仅读取A的数据,并且仅包含D列的更新文件是在Snapshot2中编写的。当新列出的数量中,我们还需要将更新文件合并回数据文件。

  为此,我们还提供了紧凑的逻辑,即读取旧数据文件并更新文件,然后合并到单独的数据文件中。

  MOR的原理如上所述。假设有一个由两个数据文件组成的逻辑数据框。现在您需要填写冷内容。我们将编写一个包含冷的更新文件,以便SnapShot2中的逻辑数据帧将包含ABCD四列。

  与牛的方法相比,读写所有列的量,MOR的优点是仅读取所需的列,而仅编写更新的列。阅读和写作放大没有问题。计算节省了很多资源,并且阅读和写作的IO也大大减少了。与牛方法相比,每头牛双倍增加一倍。MOR只需要存储新的添加剂,这也极大地避免了浪费存储资源。

  考虑到绩效的费用,我们需要定期压实。压实是一个相对较重的操作,相当于牛。但是,压实是一个异步过程,可以在多个MOR之后进行补充。然后,可以将压实成本摊销给多个MOR。例如,从原始的10倍到当前的2x减少了10个牛和10个MOR + 1压实。

  MOR的实施成本很高,但这可以通过良好的设计和大量测试来解决。

  对于模型培训,由于大多数模型培训仅需要自己的列,因此大量的在线模型不需要遵循MOR的逻辑,这可以说基本上没有费用。而且一些研究模型通常只需要在不阅读其他更新文件的情况下读取自己的更新文件,因此,整体上读取的额外资源并没有增加太多。

  从行更换为冰山后,我们还对培训进行了很多优化。

  在我们的原始体系结构中,分布式培训框架没有分析实际的数据内容,而是直接以行形式将数据传输到培训师,并且教练在内部执行反序列化和选择。

  原始体系结构

  引入冰山后,当我们想获得选择的CPU和IO收入时,我们需要将选择列表列入存储层。为了确保下游培训师无法感知,在培训框架,我们选择了选择回序,并将其构造到原始的行格式中,并将其发送到下游教练。以原始的序列化序列化的一层。

  这导致迁移到冰山,整体训练速度变慢,资源也增加了。

  专栏作家重建

  为了提高训练速度,我们通过阅读阅读方式直接阅读冰山数据,并将其发送给培训师。此步骤提高了训练速度,并降低了某些资源的消耗。

  矢量化阅读

  为了达到最佳效果,我们与培训设备团队合作,直接修改训练设备的内部,以便培训师可以直接识别箭头数据,以便我们可以实现从训练设备的末端到箭头格式,使我们只需要开始,后序列化变成了箭头,并且随后的操作完全基于箭头,从而减少了序列化和返回的开销,进一步提高了训练速度并降低了资源消耗。

  箭

  最后,我们实现了最初的目标,并实现了离线功能工程的能力。

  就存储成本而言,通常将其降低40%以上;以相同的训练速度,CPU降低了13%,网络IO降低了40%。

  将来,我们计划支持以下4个功能:

  策划基础架构批处理团队继续招募,包括Spark,Ray,ML和其他方向,支持所有业务线,大规模的数据和业务方案正在等待您探索。