<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Apache Uniffle Blog</title>
        <link>https://uniffle.apache.org/zh-CN/blog</link>
        <description>Apache Uniffle Blog</description>
        <lastBuildDate>Fri, 21 Jul 2023 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>zh-CN</language>
        <item>
            <title><![CDATA[Uniffle - New chapter for the shuffle in the cloud native era]]></title>
            <link>https://uniffle.apache.org/zh-CN/blog/2023/07/21/Uniffle - New chapter for the shuffle in the cloud native era</link>
            <guid>https://uniffle.apache.org/zh-CN/blog/2023/07/21/Uniffle - New chapter for the shuffle in the cloud native era</guid>
            <pubDate>Fri, 21 Jul 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[<!--]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorWithStickyNavbar_LWe7" id="项目背景">项目背景<a href="#项目背景" class="hash-link" aria-label="项目背景的直接链接" title="项目背景的直接链接">​</a></h2><p>Shuffle 是分布式计算框架用来衔接上下游任务数据重分布的过程，是计算框架中最为重要的一个环节，Shuffle 的性能和稳定性会对计算框架产生直接的影响。然而随着对云原生架构探索，传统的 Shuffle 方案也暴露了诸多问题。</p><p>在云原生架构中，也会同时应用存算分离以及混部等技术。计算节点磁盘相对容量较小，IO 性能较差，CPU 和 IO 资源相对不平衡。计算节点也可能因为混部的原因，被高优先级的作业所抢占。</p><p>传统的 Shuffl 方案，Shuffle 节点与计算节点耦合在一起，但是由于计算节点与 Shuffle 节点对于磁盘资源，内存资源，CPU资源，节点稳定性的需求不同，难以对他们根据资源需求进行独立扩容。
将计算节点和 Shuffle 节点分离后，计算节点将Shuffle状态托管到Shuffle节点后，也同样让计算节点的状态更轻量化，在计算节点被抢占时可以减少作业的重算。</p><p>由于计算节点和 Shuffle 节点解耦，同时也降低了计算节点对磁盘规格的需求，可以增加可接入的计算节点数量。</p><p>对于大的 Shuffle 作业在云原生架构下会对本地磁盘磁盘造成比较大的压力，会造成计算节点磁盘容量不足等问题，同时也会产生比较多磁盘随机 IO，影响大 Shuffle 作业的性能和稳定性。</p><p>业界对新的 Shuffle 技术探索有包括 Google 的 BigQuery，百度 DCE Shuffle，Facebook 的 Cosco Shuffle，Uber Zeus Shuffle，阿里 Celeborn Shuffle 等诸多实践。
各个系统有着自身对于各自场景不同的取舍。Uniffle 从性能，正确性，稳定性，成本四个方面的入手，想要打造快准稳省的云原生 Remote Shuffle Service。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="架构设计">架构设计<a href="#架构设计" class="hash-link" aria-label="架构设计的直接链接" title="架构设计的直接链接">​</a></h2><p><img loading="lazy" alt="架构设计" src="/zh-CN/assets/images/architecture-7834d0c01ac53efa9d174f422dce53c7.png" width="2933" height="1363" class="img_ev3q"></p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="coordinator">Coordinator<a href="#coordinator" class="hash-link" aria-label="Coordinator的直接链接" title="Coordinator的直接链接">​</a></h3><p>Coordinator 负责管理整个集群，Shuffle Server 通过心跳的方式将集群的负载情况汇报给 Coordinator。Coordinator 根据整个集群负责情况为作业分配合适 Shuffle Server。为了便于运维，Coordinator支持配置下发的功能，对外提供 RESTFUL API。</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="shuffle-server">Shuffle Server<a href="#shuffle-server" class="hash-link" aria-label="Shuffle Server的直接链接" title="Shuffle Server的直接链接">​</a></h3><p>主要负责接收 Shuffle 数据，聚合后写入存储当中。对于存储在本地磁盘当中的 shuffle 数据，Shuffle Server为其提供数据读取的能力。</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="client">Client<a href="#client" class="hash-link" aria-label="Client的直接链接" title="Client的直接链接">​</a></h3><p>负责和 Coordinator 和 Shuffle Server 通信，负责申请 Shuffle Server，发送心跳以及 Shuffle 数据的读写。提供 SDK 给 Spark，MapReduce，Tez 使用。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="读写流程">读写流程<a href="#读写流程" class="hash-link" aria-label="读写流程的直接链接" title="读写流程的直接链接">​</a></h2><p><img loading="lazy" alt="process" src="/zh-CN/assets/images/process-45f0f6011477c8e1a8f46aa2f19181cb.png" width="1280" height="571" class="img_ev3q"></p><ol><li>Driver 从 Coordinator 获取分配信息</li><li>Driver 向 Shuffle Server 注册 Shuffle 信息 </li><li>基于分配信息，Executor 将 Shuffle 数据以 Block 的形式发送到 Shuffle Server</li><li>Shuffle Server 将数据写入存储</li><li>写任务结束后，Executor 向 Driver 更新结果</li><li>读任务从 Driver 侧获取成功的写 Task 信息</li><li>读任务从 Shuffle Server 获得 Shuffle 元数据(如所有的 blockId)</li><li>基于存储模式，读任务从存储侧读取 Shuffle 数据</li></ol><h2 class="anchor anchorWithStickyNavbar_LWe7" id="性能方面">性能方面<a href="#性能方面" class="hash-link" aria-label="性能方面的直接链接" title="性能方面的直接链接">​</a></h2><h3 class="anchor anchorWithStickyNavbar_LWe7" id="1-混合存储">1) 混合存储<a href="#1-混合存储" class="hash-link" aria-label="1) 混合存储的直接链接" title="1) 混合存储的直接链接">​</a></h3><p>在现网存在数目超过 80% 的 KB 级别的 Partition 数据块，为了可以很好的解决这些小 Partiton 带来的随机 IO，Uniffle 参考 Google 的 Dremel 引入内存 Shuffle 的概念，同时考虑到现网数据总容量 80% 是大的 Partition 带来的，从而选择引入磁盘和 HDFS 作为 Uniffle 的存储介质，解决数据容量的问题，从而形成一套混合存储的方案。</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="2-随机io优化">2) 随机IO优化<a href="#2-随机io优化" class="hash-link" aria-label="2) 随机IO优化的直接链接" title="2) 随机IO优化的直接链接">​</a></h3><p><img loading="lazy" alt="random_io" src="/zh-CN/assets/images/io_random-ff932038e6d7a062dd69caf5dd551c40.png" width="1280" height="833" class="img_ev3q"><br>
<!-- -->随机 IO 本质是由于比较多小数据块的 IO 存在，为了避免比较多小数据块 IO 的存在，Uniffle 首先会将多个 MapTask 的相同 Partition 在 Shuffle Server 中的内存进行聚合产生较大的 Partition 数据，当内存中 Shuffle 数据达到 Partition 阈值或者是整体阈值时，内存中 Shuffle 数据开始写入本地存储或者远程存储。
<img loading="lazy" alt="io_sort" src="/zh-CN/assets/images/io_sort-e5f484b4875a3d5304749095a0f2a801.png" width="1280" height="578" class="img_ev3q"><br>
<!-- -->当达到内存的整体阈值时，会按照内存中 Partition 数据大小进行排序，然后将大的 Partition 优先写入存储介质当中同时，内存中的数据下降到一定程度后会停止继续向存储介质写入 Shuffle 数据，进一步减少磁盘的随机 IO。</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="3-存储介质选择优化">3) 存储介质选择优化<a href="#3-存储介质选择优化" class="hash-link" aria-label="3) 存储介质选择优化的直接链接" title="3) 存储介质选择优化的直接链接">​</a></h3><p><img loading="lazy" alt="select" src="/zh-CN/assets/images/select-d79bdaa68e6d184663ca0364a6f03f26.png" width="2933" height="2071" class="img_ev3q">
对于 Shuffle 数据写入本地存储还是远程存储，Uniffle 根据测试发现数据块大小越大，远程存储的写入性能越好。当数据块超过 64MB 的时候，写入远程存储的性能可达 32MB/s。所以，在数据写入存储介质时，会选择根据数据块大小，将大的数据块写入远程存储。把小的数据块写入本地存储。</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="4-写入并发度优化">4) 写入并发度优化<a href="#4-写入并发度优化" class="hash-link" aria-label="4) 写入并发度优化的直接链接" title="4) 写入并发度优化的直接链接">​</a></h3><p>对于大的 Partition 来说，单线程写入远程存储性能难以满足需求。HDFS 的文件只能由一个 Writer 写入，对于远端存储，Uniffle 将一个 Partition 可以映射多个文件。Uniffle 使用多线程方式可以增加大 partition 的写入性能。同时，单 Partition 占用全部远程存储线程数目影响其他Partition 数据的写入，单 Partition 通常会有一个同时写入线程数目上限。为避免产生过多的文件，Partition 在写入过程时会优先使用已经创建的文件，只有当所有的文件都在写入数据中，会新建一个文件写入数据。</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="5-数据分布优化">5) 数据分布优化<a href="#5-数据分布优化" class="hash-link" aria-label="5) 数据分布优化的直接链接" title="5) 数据分布优化的直接链接">​</a></h3><p><img loading="lazy" alt="aqe" src="/zh-CN/assets/images/aqe-6090c8ed1b91b4b4892a95c69e9a1fb5.png" width="1636" height="678" class="img_ev3q"><br>
<!-- -->对于计算引擎来说，例如 Spark AQE ，存在单个 Task 读取某一个 Partition 部分数据以及多个 Partition 的情况。对于读取 Partition 部分数据情况，如果数据是随机分布的，会造成大量的读放大。如果在数据写入后进行数据排序重写，会造成较大的性能损耗。所以 Uniffle 采用局部有序的方案优化读取部分数据的数据优化。详细信息可查看参考 <!-- -->[3]<!-- -->。
<img loading="lazy" alt="get_results" src="/zh-CN/assets/images/get_results-71ce542dca970bff80b6d444dbf4081c.png" width="1436" height="478" class="img_ev3q"><br>
<!-- -->同样读取多个 Partition 时候，如果可以将需要读取多个 Partition 分配到一个 ShuffleServer 上，可以聚合 Rpc 请求，将多个 Rpc 请求发送到一个 Shuffle Server 当中。详细信息可查看参考 <!-- -->[4]<!-- -->。</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="6-堆外内存优化">6) 堆外内存优化<a href="#6-堆外内存优化" class="hash-link" aria-label="6) 堆外内存优化的直接链接" title="6) 堆外内存优化的直接链接">​</a></h3><p>Uniffle 的数据通信过程中使用了 Grpc，Grpc 代码实现中存在比较多的内存拷贝过程。同时，Shuffle Server 目前使用堆内存进行管理。在线上使用 80G 内存的 Shuffle Server 会产生较多的 GC，单次最长约 22s。为此 Uniffle 将 JDK 升级到 11 以解决此问题。同时在数据传输面，模仿Spark Shuffle 的通信协议使用 Netty 进行数据传输，并且使用 ByteBuf 来对堆外内存进行管理。</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="7-列式格式优化">7) 列式格式优化<a href="#7-列式格式优化" class="hash-link" aria-label="7) 列式格式优化的直接链接" title="7) 列式格式优化的直接链接">​</a></h3><p>Uniffle 框架本身不支持列式 Shuffle，采用集成 Gluten 的方案来复 用Gluten 列式 Shuffle 能力。详细可看参考 <!-- -->[5]<!-- -->。
<img loading="lazy" alt="Gluten" src="/zh-CN/assets/images/gluten-cc81f323d5ee32b7e66bacb4c092cf03.png" width="1566" height="876" class="img_ev3q"></p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="8-去-barrier-化">8) 去 Barrier 化<a href="#8-去-barrier-化" class="hash-link" aria-label="8) 去 Barrier 化的直接链接" title="8) 去 Barrier 化的直接链接">​</a></h3><p>分布式计算框架对于批量计算来说一般采用的 BSP （Bulk Synchronous Parallel）模型，上游 Task 全部运行完才会启动下游的 Task，但是为了可以减少长尾节点对作业对作业运行性能的影响，有得计算框架会支持 Slow Start 让上下游作业可以同时运行。流式计算，OLAP 引擎会采用上下游可以同时运行 Task 的 Pipeline 模型。</p><p>为了可以适配更多的计算框架，Uniffle 采用了去 Barrier 的设计，可以支持上下游 Stage 同时运行。去 Barrier 化的关键在于需要可以支持内存读写和高效的索引过滤机制，这样作业在运行的过程无需在 Stage 结束时向 Shuffle Server 发送将数据全部写到存储介质当中的请求，而且由于上下游同时运行，会存在下游Reader对数据读取增量数据的情况，拥有了索引过滤机制，可以有效的避免冗余数据的读取。</p><p>Uniffle 分别针对内存数据和存储介质数据设计了 Bitmap 索引过滤和文件索引过滤。这使得 Uniffle 能够有效支持无障碍执行，并通过避免冗余数据读取来提高性能。</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="性能测试">性能测试<a href="#性能测试" class="hash-link" aria-label="性能测试的直接链接" title="性能测试的直接链接">​</a></h3><p>使用 0.2 版本时，Uniffle 通过进行 Benchmark 发现，小数据量的 Shuffle 可以和 Spark 原生 Shuffle 持平。大数据量的 Shuffle 可以比 Spark 原生 Shuffle 快 30%。Benchmark结果链接: <a href="https://github.com/apache/uniffle/blob/master/docs/benchmark.md" target="_blank" rel="noopener noreferrer">https://github.com/apache/uniffle/blob/master/docs/benchmark.md</a></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="正确性">正确性<a href="#正确性" class="hash-link" aria-label="正确性的直接链接" title="正确性的直接链接">​</a></h2><h3 class="anchor anchorWithStickyNavbar_LWe7" id="元数据校验">元数据校验<a href="#元数据校验" class="hash-link" aria-label="元数据校验的直接链接" title="元数据校验的直接链接">​</a></h3><p><img loading="lazy" alt="meta" src="/zh-CN/assets/images/metadata-8563427393aeb355a2f368b2507948e6.png" width="1280" height="530" class="img_ev3q">
Spark 会将所有完成状态的 task 信息汇报给 Drvier，Reducer 第一步是先从 Driver 中获取 Task 唯一标识符列表， Block 是 Mapper 发送给 Shuffle Server 的数据，每一个 Block 都有唯一确定的 ID，Block 的数据会分别存储在内存，本地磁盘以及HDFS上。为了保证数据的安全性，Uniffle 设计了相应的元数据，Uniffle 对于本地磁盘和 HDFS 中的数据文件设计了索引文件。索引文件的格式由 BlockID，相对位移量，数据校验，压缩长度，未压缩长度以及 taskID，在读取 DataFile 之前 Uniffle 会先读取索引文件对于重复读取问题，Uniffle 会使用一个 bitmap 来保存已经读取的 BlockID，通过 BlockID 来判断是否存在重复读取。</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="数据校验">数据校验<a href="#数据校验" class="hash-link" aria-label="数据校验的直接链接" title="数据校验的直接链接">​</a></h3><p><img loading="lazy" alt="verify" src="/zh-CN/assets/images/data_read-ac02ea36c77de94218cd05f37c0aefc5.png" width="2933" height="1572" class="img_ev3q">
对于数据损坏问题，Uniffle 会对数据块进行 CRC 校验，读取时会对数据重新进行计算 CRC，对比文件中的 CRC 文件判断数据是否损坏对于误读问题。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="稳定性">稳定性<a href="#稳定性" class="hash-link" aria-label="稳定性的直接链接" title="稳定性的直接链接">​</a></h2><h3 class="anchor anchorWithStickyNavbar_LWe7" id="1-混合存储fallback">1) 混合存储Fallback<a href="#1-混合存储fallback" class="hash-link" aria-label="1) 混合存储Fallback的直接链接" title="1) 混合存储Fallback的直接链接">​</a></h3><p><img loading="lazy" alt="hdfs" src="/zh-CN/assets/images/hdfs_fallback-d0fed05ac57c1a5b847f1722faf7a0d9.png" width="1280" height="674" class="img_ev3q">
HDFS 线上集群存在一定的波动性，可能存在某个时间段会存在写 HDFS 数据失败的情况，为了减少 HDFS 波动产生的影响，Uniff 设计了 Fallback 机制，当写 HDFS 失败后，会将数据写入到本地存储，减少对作业的影响。</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="2-限流机制">2) 限流机制<a href="#2-限流机制" class="hash-link" aria-label="2) 限流机制的直接链接" title="2) 限流机制的直接链接">​</a></h3><p>作业 Client 发送请求之前会先申请数据所对应的内存资源，如果内存不足，作业会进行等待，不再进行数据发送，从而实现了作业的流控。</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="3-多副本机制">3) 多副本机制<a href="#3-多副本机制" class="hash-link" aria-label="3) 多副本机制的直接链接" title="3) 多副本机制的直接链接">​</a></h3><p>Uniffle 采用 Quorum 副本协议，作业可以根据自身需求配置自身作业写入的副本数目。防止由于单副本造成的作业稳定性问题。</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="4-stage-重算">4) Stage 重算<a href="#4-stage-重算" class="hash-link" aria-label="4) Stage 重算的直接链接" title="4) Stage 重算的直接链接">​</a></h3><p>目前 Spark 支持如果读取 Shuffle Server 失败，可以将整个 Stage 进行重算来帮助作业恢复作业运行。</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="5-quota-机制">5) Quota 机制<a href="#5-quota-机制" class="hash-link" aria-label="5) Quota 机制的直接链接" title="5) Quota 机制的直接链接">​</a></h3><p>当集群容量到达上限或者作业达到用户的 Quota 上限之后 Coordinator 可以让作业 Fallback 成原生 Spark 的模式。防止集群压力过大或者单用户错误提交大量作业影响集群的稳定性。</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="6-coordinator-ha-机制">6) Coordinator HA 机制<a href="#6-coordinator-ha-机制" class="hash-link" aria-label="6) Coordinator HA 机制的直接链接" title="6) Coordinator HA 机制的直接链接">​</a></h3><p>没有选择 Zookeeper，Etcd 以及 Raft 等方案作为 HA 方案，主要是考虑的是引入这些一致性协议系统的复杂性。对于 Uniffle 来说，Uniffle 选择将 Coordinator 无状态化，不持久化任何状态，所有的状态信息由 Shuffle Server 心跳汇报而来，所以无须确定哪个是主节点，只要部署多个 Coordinator 实例即可保证服务的高可用。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="成本">成本<a href="#成本" class="hash-link" aria-label="成本的直接链接" title="成本的直接链接">​</a></h2><h3 class="anchor anchorWithStickyNavbar_LWe7" id="1-使用低成本远程存储">1) 使用低成本远程存储<a href="#1-使用低成本远程存储" class="hash-link" aria-label="1) 使用低成本远程存储的直接链接" title="1) 使用低成本远程存储的直接链接">​</a></h3><p>一般来说对于一个相对稳定的业务，计算资源相对稳定，存储资源将会线性增长。这些存储资源将会存储大量的冷数据。Uniffle 支持混合存储，可以将这部分没有利用的存储资源进行利用，从而降低系统整体的成本。</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="2-使用自动扩缩容">2) 使用自动扩缩容<a href="#2-使用自动扩缩容" class="hash-link" aria-label="2) 使用自动扩缩容的直接链接" title="2) 使用自动扩缩容的直接链接">​</a></h3><p>同时 Uniffle 研发了一个 K8S Operator，利用 Webhook 的方式实现了有状态服务的扩缩容操作，利用 HPA 可以在此基础上实现自动扩缩容，进一步降低系统成本。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="社区运营">社区运营<a href="#社区运营" class="hash-link" aria-label="社区运营的直接链接" title="社区运营的直接链接">​</a></h2><p>目前 Uniffle 已经支持 Spark，MapReduce，Tez 等多种计算框架。</p><p>Uniffle Spark 已经在腾讯，滴滴，爱奇艺，顺丰，唯品会等多家都有日均PB级数据的实践。</p><p>Uniffle MapReduce 被B站，知乎等公司混部场景下所使用。</p><p>货拉拉，贝壳，Shein 共同开发完成了 Uniffle Tez 开发，预计在 23 Q3 正式开始使用。</p><p>社区诸多重要 Feature 都有国内诸多知名互联网公司的参与开发。
爱奇艺支持了对 Keberos HDFS 集群的访问，并且优化了 Spark AQE on Uniffle 的性能。滴滴支持了多租户作业 Quota。Netty 优化数据面由滴滴和唯品会共同完成。Gluten 的支持由百度和顺丰共同完成。</p><p>目前社区已经有 50+ contributor，600+ commits，发布了 4 个 Apache 版本，被数十家公司所使用。另外，想要贡献 Uniffle Flink 的团队和公司，可以发送邮件到 <a href="mailto:dev@uniffle.apache.org" target="_blank" rel="noopener noreferrer">dev@uniffle.apache.org</a> 与 Uniffle 社区联系。</p><p>目前社区参与的公司中还没有对 Uniffle Flink 有落地场景以及相应的开发计划，期待您可以帮忙一起填补社区的这块空白。Uniffle 设计采用了大量的机制和策略分离，也欢迎各个用户可以贡献适合自身场景的策略。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="后续规划">后续规划<a href="#后续规划" class="hash-link" aria-label="后续规划的直接链接" title="后续规划的直接链接">​</a></h2><h3 class="anchor anchorWithStickyNavbar_LWe7" id="存储优化">存储优化<a href="#存储优化" class="hash-link" aria-label="存储优化的直接链接" title="存储优化的直接链接">​</a></h3><ol><li>对接对象存储，优化系统成本</li><li>索引文件和数据文件合并进一步减少IO开销</li><li>SSD和HDD异构存储资源的支持</li><li>支持存储数据可以按Key进行排序</li></ol><h3 class="anchor anchorWithStickyNavbar_LWe7" id="计算优化">计算优化<a href="#计算优化" class="hash-link" aria-label="计算优化的直接链接" title="计算优化的直接链接">​</a></h3><ol><li>支持完善Shuffle Server动态分配机制</li><li>部分引擎Slow Start特性的支持</li><li>Spark AQE支持的持续优化</li><li>Flink引擎支持</li><li>计算引擎数据支持异步读取</li></ol><h2 class="anchor anchorWithStickyNavbar_LWe7" id="总结">总结<a href="#总结" class="hash-link" aria-label="总结的直接链接" title="总结的直接链接">​</a></h2><p>Uniffle 从性能，正确性，稳定性，成本四个方面思考，打造了一款适合云原生架构的 Shuffle 系统。欢迎大家参与贡献 Uniffle 项目，Uniffle 项目地址是 <a href="https://github.com/apache/uniffle" target="_blank" rel="noopener noreferrer">https://github.com/apache/uniffle</a> 。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="参考资料">参考资料<a href="#参考资料" class="hash-link" aria-label="参考资料的直接链接" title="参考资料的直接链接">​</a></h2><p>[1]<!-- --> <a href="https://cloud.tencent.com/developer/article/1903023" target="_blank" rel="noopener noreferrer">https://cloud.tencent.com/developer/article/1903023</a></p><p>[2]<!-- --> <a href="https://cloud.tencent.com/developer/article/1943179" target="_blank" rel="noopener noreferrer">https://cloud.tencent.com/developer/article/1943179</a></p><p>[3]<!-- --> <a href="https://github.com/apache/uniffle/pull/137" target="_blank" rel="noopener noreferrer">https://github.com/apache/uniffle/pull/137</a></p><p>[4]<!-- --> <a href="https://github.com/apache/uniffle/pull/307" target="_blank" rel="noopener noreferrer">https://github.com/apache/uniffle/pull/307</a></p><p>[5]<!-- --> <a href="https://github.com/apache/uniffle/pull/950" target="_blank" rel="noopener noreferrer">https://github.com/apache/uniffle/pull/950</a></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[2022 summary]]></title>
            <link>https://uniffle.apache.org/zh-CN/blog/2023/01/09/2022 summary</link>
            <guid>https://uniffle.apache.org/zh-CN/blog/2023/01/09/2022 summary</guid>
            <pubDate>Mon, 09 Jan 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[<!--]]></description>
            <content:encoded><![CDATA[<h1>Apache Uniffle - 2022 年终总结</h1><h2 class="anchor anchorWithStickyNavbar_LWe7" id="引言">引言<a href="#引言" class="hash-link" aria-label="引言的直接链接" title="引言的直接链接">​</a></h2><p>2020 年底，Apache Uniffle 在腾讯内部写下了他的第一行代码，21 年 11 月份对外开源，22 年中被捐献给了 Apache 基金会。自被捐献给了 Apache 基金会后，它吸引了较多来自各个公司的开发者。本文瑾对 Apache Uniffle 2022 做个简单的小结。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="时间线">时间线<a href="#时间线" class="hash-link" aria-label="时间线的直接链接" title="时间线的直接链接">​</a></h2><p>Apache Uniffle 于 2022 年 6 月 6 日进行 Apache 孵化器，截止到 2022 年 12 月底 (当前写作时间：2022.12.26)，共新建了 157 个 Issue (其中 76 个被关闭或者解决)， 新增了 272 个 PRs (其中 264 个被合入或者关闭)。</p><p>Apache Uniffle 2022 年共发布了两个版本：0.6.0 和 0.6.1。 其中：</p><ol><li>2022.10.27：0.6.0 版本发布</li><li>2022.11.30：0.6.1 版本发布</li></ol><p>0.6.0 版本是 Uniffle 进入到 Apache 孵化器后发布的第一个版本，它包括以下特点：</p><ol><li>优化了 Coordinator 的分配机制</li><li>优化了 <code>Shuffle Server</code> 的调度策略</li><li>优化了性能和稳定性，</li><li>支持了需 Kerberos 验证的 HDFS</li><li>支持了 Uniffle K8S Operator，让其在可在云原生环境进行部署和应用。</li></ol><p>0.6.1 版本是 0.6.0 版本之后的一个重要的 bug fix 版本，它主要修复了如下几个问题：</p><ol><li>MR 计算框架中，当 reudce task 个数超过 1024 时，partition 无法被访问的问题</li><li>并发注册 shuffle 导致了获取 shuffle 结果失败</li><li>在 WriteBufferManager#addRecord 处理 NPE</li><li>对于存在坏盘时，可能存在的内存泄漏</li></ol><p>除上述已发布的两个版本，当前 master 分支中，引入了 local order，以应对 Spark AQE 的数据倾斜优化，相比于未优化版本，性能提升 3 倍。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="社区运营情况">社区运营情况<a href="#社区运营情况" class="hash-link" aria-label="社区运营情况的直接链接" title="社区运营情况的直接链接">​</a></h2><p>Apache Uniffle 自进入孵化器以来，增加了贡献者22人，共有贡献者33人，贡献者来自腾讯，爱奇艺，Ebay，滴滴，顺丰，百度，字节，京东，B站，Databricks等互联网公司。在新增的 22 名贡献者中，Apache Uniffle PMC 根据贡献度, 投票选择了新增了2名 committer。希望两位新增 Committer 可以在接下来的一年对 Apache Uniffle 持续贡献。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="使用情况">使用情况<a href="#使用情况" class="hash-link" aria-label="使用情况的直接链接" title="使用情况的直接链接">​</a></h2><p>根据跟贡献者和使用者的线上/线下沟通交流，当前 Apache Uniffle 在腾讯，爱奇艺，滴滴，顺丰，维品会，B 站，货拉拉等公司均有生产使用。多家公司 Uniffle 处理的 Shuffle 数据量日均超过 PB，运行的 App 数过万。其使用的场景除解决原生 shuffle 的稳定性/扩展性问题外，也为了满足存算分离的计算资源，提升整体资源的利用率。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="后续规划">后续规划<a href="#后续规划" class="hash-link" aria-label="后续规划的直接链接" title="后续规划的直接链接">​</a></h2><p>在 2023 年，Apache Uniffle 将继续以提供高效，普适的 Shuffle Service 为目标。目前有如下的工作在规划列表中：</p><ol><li>更完整地计算引擎生态：<ul><li>支持 Tez 计算框架</li><li>支持 Flink 计算框架</li></ul></li><li>更完备地存储介质支持：<ul><li>高效支持对象存储</li><li>HDD, SSD 等本地混合存储支持</li></ul></li><li>性能优化：<ul><li>使用 Netty 替换 gRPC</li><li>Off-heap 内存管理, 应用 zero-copy技术, 减少数据拷贝</li></ul></li><li>更多的企业级特性：<ul><li>多租户隔离相关功能开发</li><li>稳定性和可靠性提升</li></ul></li></ol>]]></content:encoded>
        </item>
    </channel>
</rss>