- 博客(2195)
- 收藏
- 关注
原创 16 | 网络优化(中):复杂多变的移动网络该如何优化?
移动技术发展到今天,跨终端和跨技术栈的联合优化会变得越来越普遍。有的时候我们需要跳出客户端开发的视角,从更高的维度去思考整个大网络平台。当然网络优化的水还是非常深的,有时候我们需要对协议层也有比较深入的研究,也要经常关注国外的一些新的研究成果。2018 年随着工信部发布《推进互联网协议第六版(IPv6)规模部署行动计划》的通知,所有的云提供商需要在 2020 年完成 IPv6 的支持。
2024-08-28 15:54:23
1381
原创 15 | 网络优化(上):移动开发工程师必备的网络优化知识
从网络通信发展的历程来说,从 2G 到 4G 经历了十几年的时间,这背后离不开几百万个基站、几亿个路由器以及各种各样的专利支持。虽然网络标准不停地演进,不过受限于基建,它的速度看起来很快,但是又很慢。那对我们自己或者应用会有哪些思考呢?HTTP 2.0、HTTP 3.0(QUIC)等网络技术一直在向前演进,我们需要坚持不懈地学习,思考它们对我们可以产生哪些影响,这是对网络“快”的思考。
2024-08-23 14:31:05
1017
原创 14 | 存储优化(下):数据库SQLite的使用和优化
数据库存储是一个开发人员的基本功,清楚 SQLite 的底层机制对我们的工作会有很大的指导意义。掌握了 SQLite 数据库并发的机制,在某些时候我们可以更好地决策应该拆数据表还是拆数据库。新建一个数据库好处是可以隔离其他库并发或者损坏的情况,而坏处是数据库初始化耗时以及更多内存的占用。一般来说,单独的业务都会使用独立数据库,例如专门的下载数据库、朋友圈数据库、聊天数据库。但是数据库也不宜太多,我们可以有一个公共数据库,用来存放一些相对不是太大的数据。
2024-08-21 14:58:46
1122
原创 13 | 存储优化(中):如何优化数据存储?
对于优化存储来说,不同的应用关注点可能不太一样。对小应用来说,可能开发成本是最重要的,我们希望开发效率优先;对于成熟的应用来说,性能会更加重要。因此选择什么样的存储方案,需要结合应用所处的阶段以及使用场景具体问题具体分析。无论是优化某个存储方案的性能,还是应用整体的 ROM 存储,我们可能对存储监控关注比较少。而如果这块出现问题,对用户的体验影响还是非常大的。例如我们知道微信占用的 ROM 空间确实不小,为了解决这个问题,特别推出了空间清理的功能,而且在 ROM 空间不足等场景,会弹框提示用户操作。
2024-08-20 17:47:32
1075
原创 12 | 存储优化(上):常见的数据存储方法有哪些?
虽然 SharedPreferences 和 ContentProvider 都是我们日常经常使用的存储方法,但是里面的确会有大大小小的暗坑。所以我们需要充分了解它们的优缺点,这样在工作中可以更好地使用和优化。如何在合适的场景选择合适的存储方法是存储优化的必修课,你应该学会通过正确性、时间开销、空间开销、安全、开发成本以及兼容性这六大关键要素来分解某个存储方法。
2024-08-20 16:03:53
982
原创 11 | I/O优化(下):如何监控线上I/O操作?
今天我们学习了如何在应用层面监控 I/O 的使用情况,从实现上尝试了 Java Hook 和 Native Hook 两种方案,最终考虑到性能和兼容性,选择了 Native Hook 方案。对于 Hook 方案的选择,在同等条件下我会优先选择 Java Hook 方案。但无论采用哪种 Hook 方案,我们都需要耐心地查看源码、分析调用流程,从而寻找可以利用的地方。
2024-08-19 17:18:57
858
1
原创 10 | I/O优化(中):不同I/O方式的使用场景是什么?
在性能优化的过程中,我们通常关注最多的是 CPU 和内存,但其实 I/O 也是性能优化中比较重要的一部分。今天我们首先学习了 I/O 整个流程,它包括应用程序、文件系统和磁盘三部分。接着我介绍了多线程同步 I/O、异步 I/O 和 mmap 这几种 I/O 方式的差异,以及它们在实际工作中适用的场景。无论是文件系统还是磁盘,涉及的细节都非常多。而且随着技术的发展,有些设计就变得过时了,比如 FAT32 在设计的时候,当时认为单个文件不太可能超过 4GB。
2024-08-19 16:12:05
982
原创 09 | I/O优化(上):开发工程师必备的I/O优化知识
在性能优化的过程中,我们关注最多的是 CPU 和内存,I/O 也是性能优化中比较重要的一部分。今天我们学习 I/O 处理的整个流程,它包括应用程序、文件系统和磁盘三个部分。不过 I/O 这个话题真的很大,在课后需要花更多时间学习课后练习中的一些参考资料。LPDDR5、UFS 3.0 在 2019 年面世,有些同学会想,随着硬件越来越牛,我们根本就不需要去做优化了。但是一方面考虑到成本的问题,在嵌入式、IoT 等一些场景的设备硬件不会太好;
2024-08-12 11:27:19
954
原创 08 | 启动优化(下):优化启动速度的进阶方法
今天我们学习了一些与业务无关的启动优化方法,可以进一步减少启动耗时,特别是减少磁盘 I/O 可能带来的波动。然后我们探讨了一些黑科技对启动的影响,对于黑科技我们需要两面看,在选择时也要慎重。最后我们探讨了如何在实验室和线上更好地测量和监控启动速度。启动优化需要耐得住寂寞,把整个流程摸清摸透,一点点把时间抠出来,特别是对于低端机和系统繁忙的场景。而数据重排的优化,对我有非常大的启发,帮助我开发了一个新的方向。也让我明白了,当我们足够熟悉底层的知识时,可以利用系统的特性去做更加深层次的优化。
2024-08-09 17:24:52
841
原创 07 | 启动优化(上):从启动过程看启动速度优化
今天我们首先学习了启动的整个流程,其中比较关键的是 4 个阶段。在这 4 个阶段中,用户可能会出现“点击图标很久都不响应“”首页显示太慢“和”首页显示后无法操作“这 3 个问题。接着我们学习了启动优化和监控的一些常规方法。针对不同的业务场景、不同性能的机器,需要采用不同的策略。有些知识点似乎比较“浅尝辄止”,我更希望你能够通过学习和实践将它们丰富起来。我讲到的大部分内容都是跟业务相关,业务的梳理和优化也是最快出成果的。
2024-08-09 15:24:10
667
原创 06补充篇 | 卡顿优化:卡顿现场与卡顿分析
今天我们从一个简单的卡顿问题出发,一步一步演进出解决这个问题的三种思路。其中 Java 实现的方案是大部分同学首先想到的方案,它虽然简单稳定,不过存在信息不全、性能差等问题。可能很多同学认为问题可以解决就算万事大吉了,但我并不这样认为。我们应该继续敲问自己,如果再出现类似的问题,我们是否也可以采用相同的方法去解决?这个方案的代价对用户会带来多大的影响,是否还有优化的空间?只有这样,才会出现文中的方案二和方案三,解决方案才会一直向前演进,做得越来越好。也只有这样,我们才能在追求卓越的过程中快速进步。
2024-08-07 09:23:44
1185
原创 06 | 卡顿优化(下):如何监控应用卡顿?
今天我们学习了卡顿监控的几种方法。随着技术的深入,我们发现了旧方案的一些缺点,通过不断地迭代和演进,寻找更好的方案。Facebook 的 Profilo 实现了快速获取 Java 堆栈,其实它参考的是 JVM 的 AsyncGetCallTrace 思路,然后适配 Android Runtime 的实现。systrace 使用的是 Linux 的 ftrace,Simpleperf 参考了 Linux 的 perf 工具。
2024-08-05 11:26:05
1503
原创 05 | 卡顿优化(上):你要掌握的卡顿分析方法
在写今天的文章,也就是分析卡顿的基础知识和四种 Android 卡顿排查工具时,越发觉得底层基础知识的重要性。Android 底层基于 Linux 内核,像 systrace、Simpleperf 也是利用 Linux 提供的机制实现,因此学习一些 Linux 的基础知识,对于理解这些工具的工作原理以及排查性能问题,都有很大帮助。另一方面,虽然很多大厂有专门的性能优化团队,但我觉得鼓励和培养团队里的每一个人都去关注性能问题更加重要。我们在使用性能工具的同时,要学会思考,应该知道它们的原理和局限性。
2024-07-31 15:24:18
1314
原创 04 | 内存优化(下):内存优化这件事,应该从哪里着手?
在具体进行内容优化前,我们首先要问清楚自己几个问题,比如我们要优化到什么目标、内存对我们造成了多少异常和卡顿。只有在明确了应用的现状和优化目标后,我们才能去进行下一步的操作。在探讨了内存优化的思路时,针对不同的设备、设备不同的情况,我们希望可以给用户不同的体验。这里我主要讲到了关于 Bitmap 内存优化和内存泄漏排查、监控的一些方法。最后我提到了怎样在线上监控内存的异常情况,通常内存异常率、触顶率这些指标对我们很有帮助。
2024-07-29 16:51:04
1231
原创 03 | 内存优化(上):4GB内存时代,再谈内存优化
LPDDR5 将在明年进入量产阶段,移动内存一直向着更大容量、更低功耗、更高带宽的方向发展。伴随内存的发展,内存优化的挑战和解决方案也不断变化。而内存优化又是性能优化重要的一部分,今天我讲到了很多的异常和卡顿都是因为内存不足引起的,并在最后讲述了如何在日常开发中分析和测量内存的使用情况。一个好的开发者并不满足于做完需求,我们在设计方案的时候,还需要考虑要使用多少的内存,应该怎么去管理这些内存。在需求完成之后,我们也应该去回归需求的内存情况,是否存在使用不当的地方,是否出现内存泄漏。
2024-07-29 15:15:42
1100
原创 02 | 崩溃优化(下):应用崩溃了,你应该如何去分析?
今天我们介绍了崩溃问题的一些分析方法、特殊技巧、以及疑难和常见问题的解决方法。当然崩溃分析要具体问题具体分析,不同类型的应用侧重点可能也有所不同,我们不能只局限在上面所说的一些方法。讲讲自己的一些心得体会,在解决崩溃特别是一些疑难问题时,总会觉得患得患失。有时候解了一个问题,发现其他问题也跟“开心消消乐”一样消失了。有时候有些问题“解不出来郁闷,解出来更郁闷”,可能只是一个小的代码疏忽,换来了一个月的青春和很多根白头发。
2024-07-19 11:39:05
773
原创 01 | 崩溃优化(上):关于“崩溃”那些事儿
今天,讲了 Android 的两种崩溃,重点介绍了 Native 崩溃的捕获流程和一些难点。做一个高可用的崩溃收集 SDK 并不容易,它背后涉及 Linux 信号处理以及内存分配、汇编等知识,当你内功修炼得越深厚,学习这些底层知识就越得心应手。接着,我们讨论了崩溃率应该如何去计算,崩溃率的高低跟应用时长、复杂度、收集 SDK 有关。不仅仅是崩溃率,我们还学习了目前 ANR 采集的方式以及遇到的问题,最后提出了异常率这一个新的稳定性监控指标。
2024-07-18 09:54:16
1022
原创 导读 | 如何打造高质量的应用?
看到这里可能你会有这样的疑问,我们在小公司根本没有机会学习到这些东西呀?确实如此,个人与公司一起成长是最快速,也是非常难得的事情,但并不一定人人都会有这样的机会。从我自己的经验来看,在搜狗、微信会遇到各种各样的疑难问题,也可以有很多时间去研究,让我在解决问题的过程中获得成长。幸运的是现在大家都更加乐于去分享,在专栏和技术会议中,我们可以看到很多成熟的解决问题的经验和思路,在 GitHub 我们可以找到很多优秀的源代码。在这个环境下,我们需要耐得住寂寞,多抠一些细节,多深入研究,多停下来总结。
2024-07-17 11:33:16
944
原创 开篇词 | 焦虑的移动开发者该如何破局?
首先,我认为,移动开发不等于 App 开发,所有新的技术浪潮其实都可以融入到移动开发的体系里,比如 IoT、音视频、边缘计算、VR/AR,我们要做的,只是打好基础,随时准备战斗。我挑选了崩溃、内存、卡顿、启动、I/O、存储、网络、耗电、渲染、安装包体积等比较常见的关键点,为你全面梳理性能优化的经验技巧与方向,帮你学会如何解决已知的存量问题,同时也能及时发现增量问题。是的,现在移动开发已经不再是风口,但是,这并不是说移动开发已经被淘汰,而是说移动开发的发展进入了成熟期,就像 Web 技术一样。
2024-07-17 10:56:45
809
原创 加油站 | Practice makes perfect!
也许是应该专门写一篇文章,来跟你“聊聊天”。毕竟对于绝大部分人来说,“学习”这件事情真的是“逆人性”的,总需要一些建议和鼓励。
2024-07-16 11:26:35
638
原创 FAQ第一期 | 学习大规模数据处理需要什么基础?
举个工作中见到的例子。第一,对于公司来讲,小型互联网公司或者传统企业,并不是不需要数据处理技能,而是他们还没有从数据中挖掘 business insight 的意识,没有数据驱动决策的意识,甚至没有收集数据的意识。面试官出的题目是这样的:如果要设计 Bloomberg 的股票信息系统中的数据库系统,系统需要实时更新股票价格,而数据更新的写入量非常大,用户也需要读取最新的股票资讯,你会如何设计这套系统。当你需要影响决策的时候,当你面临的数据量变多的时候,当你准备跳槽的时候,数据的处理能力都是至关重要的。
2024-07-16 11:16:32
243
原创 40 | 大规模数据处理未来之路
今天要分享的内容是专栏的最后一讲。相信通过整个专栏的系统学习,你已经掌握了大规模数据处理的基础概念与设计模式。同时,也相信,专栏中对现实世界中常见的大规模数据处理架构的深入探讨,可以在解决现实难题时为你提供一些思路。但我更希望的是,通过模块六中对大规模数据处理在未来的应用与展望讲解,让你吃下一颗定心丸,那就是,大规模数据处理技术是在放眼未来的几十年中都依然会是炙手可热的一项技术,不会被淘汰。
2024-07-15 10:51:08
818
原创 39 | 从SQL到Streaming SQL:突破静态数据查询的次元
今天要与你分享的主题是“从 SQL 到 Streaming SQL:突破静态数据查询的次元”。在前面的章节中,我们介绍了一些流数据处理相关的知识和技术,比如 Apache Spark 的流处理模块——Spark Streaming 和 Structured Streaming,以及 Apache Beam 中的窗口处理。相信你对流处理的重要性和一些基本手段都有所了解了。流处理之所以重要,是因为现在是个数据爆炸的时代,大部分数据源是每时每刻都在更新的,数据处理系统对时效性的要求都很高。作为当代和未来的
2024-07-15 09:52:04
786
原创 38 | 大规模数据处理在深度学习中如何应用?
今天要与你分享的主题是“大规模数据处理在深度学习中如何应用?“深度学习”这个词,既是一个人工智能的研究领域,也概括了构建人工神经网络的技术方法。2012 年的 AlexNet,2015 年的 Google Inception V3 级数式地打破 ImageNet 计算机视觉比赛的最高纪录,2017 年亮相的 AlphaGo 更是掀起了全球的深度学习风暴。在 Google,深度学习系统被应用在预测广告的点击率、推荐用户可能喜爱的视频、生成更接近人类的机器发声、自动生成邮件回复等几乎所有产品线。
2024-07-12 19:19:36
1960
原创 37 | 5G时代,如何处理超大规模物联网数据
物联网(Internet of Things)应该是一个你经常听说的名词,不过,你真的了解它吗?让我先来简要介绍一下什么是物联网吧。你可以将物联网的功能看作“使用嵌入在物理环境中的网络连接设备,来改进现有流程,或启用以前无法实现的新场景”。这些设备或事物连接到网络后,可以提供它们使用传感器从环境中收集的信息,或允许其他系统通过执行器连接,并作用于现实世界。
2024-07-12 11:22:20
2697
原创 36 | Facebook游戏实时流处理Beam Pipeline实战(下)
在上一讲中,我们一起对怎样实现一个简易的游戏积分排行榜展开了讨论,也一起研究了如何使用批处理计算的方式在 Beam 中构建出一个数据流水线来得出排行榜结果。我们知道,虽然批处理计算可以得到一个完整的结果,但是它也存在着自身的不足,比如会有一定的延时,需要额外的 crontab 来管理定时任务,增加了维护成本等等。所以在上一讲的末尾,我们提出了使用实时流处理来改进这些不足,而其中就需要用到窗口、触发器和累加模式这几个概念。
2024-07-12 10:31:17
1058
原创 35 | Facebook游戏实时流处理Beam Pipeline实战(上)
今天要与你分享的主题是“Facebook 游戏实时流处理 Beam Pipeline 实战”。Facebook 这个社交平台我相信你一定早有耳闻。它除了能够让用户发送消息给好友,分享自己的动态图片和视频之外,还通过自身的 App Center 管理着各式各样的小游戏。许多游戏开发商借助 Facebook 的好友邀请机制让自己的 App 火了一把。曾经有一段时间,在 Facebook 上有一款名为糖果传奇(Candy Crush Saga)的游戏风靡了整个北美。
2024-07-11 10:56:09
802
原创 34 | Amazon热销榜Beam Pipeline实战
今天要与你分享的主题是“Amazon 热销榜 Beam Pipeline 实战”。亚马逊(Amazon)宣布将关闭中国国内电商业务的消息你一定还记忆犹新。虽然亚马逊遗憾离场,但它依然是目前全球市值最高的电商公司。作为美国最大的一家网络电子商务公司,亚马逊的总部位于华盛顿州的西雅图。类似于 BAT 在国内的地位,亚马逊也是北美互联网 FAANG 五大巨头之一,其他四个分别是 Facebook、Apple、Netflix 和 Google。亚马逊的热销商品系统就如下图所示。
2024-07-10 11:18:07
1033
原创 33 | 横看成岭侧成峰:再战Streaming WordCount
今天要与你分享的主题是“横看成岭侧成峰:再战 Streaming WordCount”。在上一讲中,我们学习了 Beam 窗口(Window)的概念。当时,我们提到窗口技术的产生是因为我们想要根据时间戳去分组处理一个 PCollection 中的元素。我们也提到了在“统计莎士比亚文集词频”这个例子中,如果莎士比亚穿越到了现代,成了一名专栏作家,我们就可能需要根据他文章的写作时间来统计词频了。举个具体的例子的话,就是我们能不能灵活地得到莎士比亚在 2017 年 9 月使用的高频词汇?
2024-07-09 11:09:42
966
原创 32 | Beam Window:打通流处理的任督二脉
今天要与你分享的主题是“Beam Window:打通流处理的任督二脉”。在上一讲中,我们一起用 Beam 编写了第一个完整的 WordCount 项目,我们所用的例子是统计莎士比亚的文集中最常使用到的一些单词。这里我们所用到的“莎士比亚文集”这种类型的数据集是一个静态的数据集。也就是说,我们在生成输入数据集的时候,就已经知道了这个数据集是完整的,并不需要再等待新的数据进来。根据前面的内容,我们可以把这种数据集归类为有界数据集(Bounded Dataset)。
2024-07-08 11:21:11
799
原创 31 | WordCount Beam Pipeline实战
今天要与你分享的主题是“WordCount Beam Pipeline 实战”。前面我们已经学习了 Beam 的基础数据结构 PCollection,基本数据转换操作 Transform,还有 Pipeline 等技术。你一定跃跃欲试,想要在实际项目中使用了。这一讲我们就一起学习一下怎样用 Beam 解决数据处理领域的教科书级案例——WordCount。WordCount 你一定不陌生,在第 18 讲中,我们就已经接触过了。WordCount 问题是起源于 MapReduce 时代就广泛使用的案例。
2024-07-05 14:47:53
794
原创 30 | Apache Beam实战冲刺:Beam如何run everywhere?
今天要与你分享的主题是“Apache Beam 实战冲刺:Beam 如何 run everywhere”。你可能已经注意到,自第 26 讲到第 29 讲,从 Pipeline 的输入输出,到 Pipeline 的设计,再到 Pipeline 的测试,Beam Pipeline 的概念一直贯穿着文章脉络。那么这一讲,我们一起来看看一个完整的 Beam Pipeline 究竟是如何编写的。
2024-07-05 11:53:44
710
原创 29 | 如何测试Beam Pipeline?
今天要与你分享的主题是“如何测试 Beam Pipeline”。在上一讲中,我们结合了第 7 讲的内容,一起学习了在 Beam 的世界中我们该怎么设计好对应的设计模式。而在今天这一讲中,我想要讲讲在日常开发中经常会被忽略的,但是又非常重要的一个开发环节——测试。你知道,我们设计好的 Beam 数据流水线通常都会被放在分布式环境下执行,具体每一步的 Transform 都会被分配到任意的机器上面执行。如果我们在运行数据流水线时发现结果出错了,那么想要定位到具体的机器,再到上面去做调试是不现实的。
2024-07-05 11:06:57
689
原创 28 | 如何设计创建好一个Beam Pipeline?
今天要与你分享的主题是“如何设计创建好一个 Beam Pipeline”。这一讲我们会用到第 7 讲中介绍过的四种常见设计模式——复制模式、过滤模式、分离模式和合并模式。这些设计模式就像是武功的基本套路一样,在实战中无处不在。今天,我们就一起来看看我们怎么用 Beam 的 Pipeline 来实现这些设计模式。
2024-07-05 09:33:13
805
原创 27 | Pipeline I/O: Beam数据中转的设计模式
自定义的 I/O 连接器并不是说一定要设计得非常通用,而是只要能够满足自身的应用需求就可以了。实现自定义的 I/O 连接器,通常指的就是实现 Read Transform 和 Write Transform 这两种操作,这两种操作都有各自的实现方法,下面我以 Java 为编程语言来一一为你解释。我们知道 Beam 可以读取无界数据集也可以读取有界数据集,而读取这两种不同的数据集是有不同的实现方法的。
2024-07-05 08:59:35
939
原创 26 | Pipeline:Beam如何抽象多步骤的数据流水线?
今天要与你分享的主题是“Pipeline:Beam 如何抽象多步骤的数据流水线”。在上两讲中,我们一起学习了 Beam 是如何抽象封装数据,以及如何抽象对于数据集的转换操作的。在掌握了这两个基本概念后,我们就可以很好地回答 Beam 编程模型里的 4 个维度 What、Where、When、How 中的第一个问题——What 了。也就是,我们要做什么计算?想得到什么样的结果?这个时候你可能已经跃跃欲试,开始想用 PCollection 和 Transform 解决我们平常经常会使用到的批处理任务了。
2024-07-04 17:54:04
1063
原创 25 | Transform:Beam数据转换操作的抽象方法
今天要与你分享的主题是“Beam 数据转换操作的抽象方法”。在上一讲中,我们一起学习了 Beam 中数据的抽象表达——PCollection。但是仅仅有数据的表达肯定是无法构建一个数据处理框架的。那么今天,我们就来看看 Beam 中数据处理的最基本单元——Transform。下图就是单个 Transform 的图示。之前我们已经讲过,Beam 把数据转换抽象成了有向图。PCollection 是有向图中的边,而 Transform 是有向图里的节点。
2024-07-04 15:46:21
847
原创 24 | PCollection:为什么Beam要如此抽象封装数据?
今天要与你分享的主题是“为什么 Beam 要如此抽象封装数据”。很多人在刚开始接触 Apache Beam 的时候,都会觉得这里面的概念太抽象了。什么 PCollection、PValue、Transform……这都是些什么?尤其是 PCollection,完全和先前的技术知识找不到对应。确实如此。同样作为数据的容器,PCollection 却并不像 Python/Java 的 List 或者 C++ 的 vector。PCollection 是无序的。
2024-07-04 14:46:57
932
原创 23 | 站在Google的肩膀上学习Beam编程模型
今天要与你分享的话题是“站在 Google 的肩膀上学习 Beam 编程模型”。在上一讲中,带你一起领略了 Apache Beam 的完整诞生历史。通过上一讲,你应该对于 Apache Beam 在大规模数据处理中能够带来的便利有了一定的了解。而在这一讲中,让我们一起来学习 Apache Beam 的编程模型,帮助你打下良好的基础以便应对接下来的 Beam 实战篇。希望你在以后遇到不同的数据处理问题时,可以有着 Beam 所提倡的思考模式。现在让我们一起进入 Beam 的世界吧。
2024-07-04 11:24:17
1190
原创 22 | Apache Beam的前世今生
今天要与你分享的主题是“ Apache Beam 的前世今生”。从这一讲开始,我们将进入一个全新的篇章。在这一讲中,我将会带领你了解 Apache Beam 的完整诞生历程。让我们一起来感受一下,Google 是如何从处理框架上的一无所有,一直发展到推动、制定批流统一的标准的。除此之外,我还会告诉你,在 2004 年发布了 MapReduce 论文之后,Google 在大规模数据处理实战中到底经历了哪些技术难题和技术变迁。
2024-07-04 10:44:47
808
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人