Big Data - Workflow
Workflow 将多种不同的处理模块连接在一起,最后得出一个 DAG,称为一个 Workflow System 在 Workflow System 中,有对应的设计模式 Copier Pattern 将单个数据处理模块中的数据,完整地复制到两个或更多的数据处理模块中,然后再由不同的数据处理模块进行处理 适用场景 - 需要对同一个数据集采取多种不同的数据处理转换 - 多个数据处理模块可以并行处理 Filter Pattern 过滤掉不符合特定条件的数据 在数据集通过 Filter 后,数据集会缩减到只剩下符合条件的数据 适用场景 - 需要针对一个数据集中某些特定的数据采取数据处理 Splitter Pattern 将数据集中的数据分类为不同的类别来进行分别处理 分离模式不会过滤任何数据,只是将原来的数据集分组 同样的数据,可以被划分到不同的数据处理模块 Joiner Pattern 将多个不同的数据集转换集中在一起,成为一个总数据集 然后将总数据集放在一个工作流中进行处理
Big Data - Batch + Stream
ConceptUnbounded vs Bounded 有界数据是无界数据的一个子集 无界数据是一种不断增长,是无限的数据集,无法判定何时停止发送 - Streaming Data 有界数据是一种有限的数据集 Event Time vs Precessing Time Time Domain Desc 事件时间 - Event Time 一个数据实际产生的时间点 处理时间 - Precessing Time 处理数据的系统架构实际接收到这个数据的时间点 Batching 数据的批处理 - 一系列相关联的任务按顺序(或并行)一个接一个地执行 批处理的输入是在一段时间内已经收集保存好的数据 每次批处理所产生的输出可以作为下一次批处理的输入 - Pipeline 绝大部分情况下,批处理的输入输出都是有界数据,更多关心的数据的事件时间 批处理任务一般会以定时任务的形态存在 应用场景 - 日志分析、计费应用、数据仓库 开源项目 - Apache Hadoop、Apache Spark 缺点 - 高延迟性 Streaming 数据的流处理 - 系统需要接收并处理一系列连续不断变化的数据...
Big Data - Distributed System
SLA Service-Level Agreement - 系统服务提供者对客户的一个服务承诺 Availabilty 可用性指的是系统服务能正常运行所占的时间百分比 对许多系统来说,99.99% 可以被认为高可用性 - 中断时间≈ 50 分钟/年 Accuracy 是否允许某些数据不准确或者丢失,如果允许发生,用户可以接受的概率 不同系统平台会用不同的指标去定义准确性,常用的是 Error Rate $$错误率=\frac{导致系统产生内部错误的有效请求数}{期间的有效请求总数}$$ Case 以分钟为单位,每个月的 Error Rate 超过 5% 的时间少于 0.1% 以 5 分钟为单位,Error Rate 不会超过 0.1% 评估系统准确性 性能测试 查看系统日志 Capacity 系统容量通常指的是系统能够支持的预期负载量是多少,一般会以每秒的请求数为单位来表示 QPS - Queries Per Second RPS - Requests Per Second 定义 Capacity 的方式 - Throttling / Perf...
RAG - Qdrant
Features Getting StartedIntroduction Vector databases are a relatively new way for interacting with abstract data representations derived from opaque machine learning models such as deep learning architectures. These representations are often called vectors or embeddings and they are a compressed version of the data used to train a machine learning model to accomplish a task like sentiment analysis, speech recognition, object detection, and many others. What is Qdrant? Qdrant “is a vector similarity s...
Python - Debug + Profile
pdb pdb 是 Python 自带的调试库,为 Python 程序提供交互式的源代码调试功能,是命令行版本的 IDE 断点调试器 Instruction Desc p print n next - step over l list - show source code context s step into r stop out - 继续执行,直到当前函数完成后返回 `b [ ([filename:]lineno function) [, condition] ]` c continue - 一直执行程序,直到遇到下一个断点 step into - --Call-- + --Return-- cProfile 瓶颈在于 fib 函数 Item Desc ncalls 相应代码/函数被调用的次数 tottime 相应代码/函数总共执行所需的时间(不包括它调用其它代码/函数的执行时间) tottime percall tottime / ncalls cumtime ...
Python - With
场景 资源是有限的,使用过后需要释放,否则会造成资源泄露 File123for x in range(10_000_000): f = open('test.txt', 'w') # OSError: [Errno 24] Too many open files f.write('hello') context manager 帮助自动分配并释放资源 - with 语句 123for x in range(10_000_000): with open('test.txt', 'w') as f: # This will open and close the file 10_000_000 times f.write('hello') try - finally 12345f = open('test.txt', 'w')try: f.write('hello')fin...
Python - GC
计数引用 Python 中一切皆对象,变量的本质是对像的指针 当一个对象的引用计数(指针数)为 0 时,说明该对象不可达,成为垃圾,需要被回收 调用函数 func(),创建列表 a 后,内存占用迅速增加,在函数调用结束后,内存恢复正常 函数内部声明的列表 a 是局部变量,在函数返回后,局部变量的引用会被注销 列表 a 所指向的对象的引用数为 0,Python 会执行 GC,回收内存 全局变量 - global 将生成的列表返回,在主程序中接收 内部实现1234567891011121314import sysa = []print(sys.getrefcount(a)) # 2 = a + getrefcountdef func(a): print(sys.getrefcount(a)) # 4 = a + getrefcount + func call stack + func argsfunc(a)print(sys.getrefcount(a)) # 2 = a + getrefcount sys.getrefcount 本身也会引入一次计数 在函数调用...
Python - GIL
Cpu bound 单线程 - 2.555494917 12345678910111213import timedef CountDown(n): while n > 0: n -= 1start = time.perf_counter()n = 100_000_000CountDown(n)end = time.perf_counter()print(f"Time elapsed: {end - start} seconds") # Time elapsed: 2.555494917 seconds 多线程 - 2.477930167 123456789101112131415161718192021import timefrom threading import Threaddef CountDown(n): while n > 0: n -= 1start = time.perf_counter()n = 100_000_000t1 = Thread(target=CountDown, arg...
Python - Async IO
线程局限 多线程在运行过程中容易被打断,有可能会出现 race condition 的情况 线程切换本身存在开销,不能无限增加线程数 Sync vs Async Sync - 操作顺序执行,前面阻塞后面 Async - 不同操作间可以交替执行,如果其中一个操作被阻塞了,程序不会等待,而是会找出可执行的操作继续执行 原理 CSP - Communicating sequential processes asyncio 与 Python 程序一样,都是单线程的 asyncio 只有一个主线程,但可以进行多个不同的任务(特殊的 Future 对象),这些不同的任务被 Event loop 控制 假设任务只有两个状态 - 预备状态 / 等待状态 预备状态 - 任务目前空闲,随时准备运行 等待状态 - 任务已经运行,但在等待外部操作完成(如 IO) Event loop 维护两个任务列表,分别对应预备状态和等待状态 选取预备状态的一个任务(与任务的等待时长、占用资源等相关),使其运行,直到该任务将控制权交还给 Event loop 为止 当任务将控制权交还给 Event loop 时,E...
Python - Futures
并行 vs 并发 并发(Concurrency) - 在某个特定的时刻,只允许有一个操作发生,线程和任务之间会相互切换,交替运行 并行(Parallelism) - 在同一时刻,有多个操作同时进行 Python 中有两种并发形式 - threading + asyncio threading 操作系统知道每个线程的所有信息,在适当的时候做线程切换 优点 - 代码易于编写,程序员不需要做任何切换操作 缺点 - 容易出现 race condition asyncio 主程序想要切换任务时,必须得到此任务可以切换的通知 避免了 race condition 的情况 场景 并发通常用于 IO 密集的场景 - Web 应用 并行通常用于 CPU 密集的场景 - MapReduce 线程池 vs 进程池 大部分时间是浪费在 IO 等待上 多线程(并发) - 16.8s -> 3.5s 12with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor: executor.map(down...















