- Zookeeper 用于集群主备切换。
- YARN 让集群具备更好的扩展性。
- Spark 没有存储能力。
- Spark 的 Master 负责集群的资源管理,Slave 用于执行计算任务。
- Hadoop 从 2.x 开始,把存储和计算分离开来,形成两个相对独立的子集群:HDFS 和 YARN,MapReduce 依附于 YARN 来运行。
- YARN 可以为符合 YARN 编程接口需求的集群提供调度服务。
- YARN:
ResourceManager 一主多备
NodeManager 一般与 DataNode 部署在一起。 - 单机硬件配置会严重影响集群的性能。
- 初始化集群机器环境:创建账号、安装 JDK、设置时间同步。
- Zookeeper 的部署最简单,其节点数必为奇数。
- ZK 两个端口,前者是链接 Leader 后者是用于竞选。
部署 Spark StandLone 集群:
- SSH 无密码登录
- 复制解压 Spark
- 编写配置文件分发到所有节点
- Hadoop2.x 以上支持双机热备。
- Standlone 模式只支持简单的固定资源分配策略。
- YARN 统一为集群上的所有计算负载分配资源,可以避免资源分配的混乱无序。
- Spark 程序由 Master 还是 YARN 来调度执行,是由 Spark 程序在提交时决定的。
- YARN 两种调度模式:
Yarn-cluster 模式,用于生产
Yarn-client 模式,用于交互 - Spark 计算都是围绕 RDD 进行的。
- Spark 在运行时,一般 RDD 操作会为每个 RDD 分区运行一个 job。
- Job 最简单的理解,它对应一个 java 线程。
- Spark 所有基于文件的生产 RDD 方法,都支持目录、压缩文件和通配符。
- RDD 是 Spark 的核心抽象,所有计算都围绕 RDD 进行。
- RDD 操作分为两类:
Transformation 转换
Action 动作 - 所有 Transformation 都是 Lazy 模式,先记录计算方式,Driver 返回结果时开始计算。
- RDD 的 Transformation 实际计算只在 Action 返回结果时才进行,或者持久化。
- Spark 严重依赖传递函数类型的参数。
从 Driver 分发各个节点过程:
Job 执行:- 在 Driver 节点上序列化代码
- 传送至各个计算节点
- 在计算节点上反序列化
- 执行
- Scala function 支持序列化。
- Spark 的核心是 RDD,而 RDD 是分布式计算的。
- Spark 会将 Job 运行所有依赖的变量、方法、(闭包)全部打包在一起序列化。
- RDD 操作的禁忌,不能嵌套调用。
- Action 操作输出不再是 RDD,返回值 Driver 程序。
- Spark 集群上的资源主要是 CPU core 数量和物理内存。
- 在程序运行时,每个 core 对应一个线程。
- Standlone 模式下由 Spark 集群中的 master 节点进行资源调度。
Spark 调度两类:
- spark 程序见的调度(主)
- spark 程序内部的调度
- 用户编写的 spark 程序称为 Driver 程序。
- 每个驱动程序都有一个 SparkContext 对象,担负着与集群沟通的职责。
- 集群管理器负责集群的资源调度。
- 执行器,每个 spark 程序在每个节点上启动的一个进程。
- 一次 RDD Action 对应一次 job。
- Stage,job 在执行过程中被分为多个阶段。
- Task,在执行器上执行的最小单位。
- Spark 程序间的调度:
静态分配 (主)
动态分配 - 所有集群管理器都支持静态资源分配。
- 当 spark 为多用户服务时,需要配置 spark 程序内部的调度。
- 不同线程提交的 job 可以并行执行。
- 默认 spark 的调度器以 FIFO 方式运行 Job。
- 公平调度还支持对多个 Job 进行分组,分组称为调度池。
- Spark 性能优势,很大一部分原因是内存和缓存。
- RDD 持久化可以多次利用,性能提高 10 倍以上。
- Spark 提供两类共享变量 —— 广播变量和计数器。
- 广播变量是一个只读变量,在所有节点上都是一份缓存。
- 计数器只能增加,用于技术和求和。
- 容错机制是分布式系统的一个重要能力。
- DAG:有向无环图的计算任务集合。
- 分布式系统经常需要做检查点。
- RDD 也是一个 DAG,每一个 RDD 都会记住创建该数据需要哪些操作 —— 血统。
- RDD 依赖:
窄依赖 —— 父分区对应一个子分区
宽依赖 —— 父分区对应多个子分区 - Spark 提供了预写日志(journal),先将数据写入支持容错的文件系统中。
- Spark master 容错:
Standalone ——Zookeeper
单点 —— 本地重启 Slave 节点失效:
- Work 异常停止
- 执行器异常停止
- Driver 异常退出
监控管理:
- Web 界面
- Metrics
- 外部系统
Web 界面:
- 调度器 stage,Task 列表
- RDD 大小和内存文件统计情况
- 环境信息
- 正在执行的执行器信息
- Standlone 模式的集群管理器有自己的 web 界面。
- Web 界面表格的头部都支持点击排序。
- Spark 程序一般都是由脚本 bin/spark-submit 来提交的。
RDD 特点:
- RDD 是只读的
- RDD 可指定缓存在内存中
- RDD 可以通过重新计算得到
RDD 核心属性:
- 一个分区列表
- 一个依赖列表
- 一个名为 compute 的计算函数
- 分区器
- 计算各分区是优先的位置列表
- Action 不可以在 RDD Tranformation 内部调用。
- Transformation 只是建立在计算关系,而 action 才是实际的执行者 —— 触发者
- Spark.local.dir 用于 shuffle。
- SparkContext 是 spark 程序最主要的入口。
- 每个 jvm 只允许启动一个 sparkContext。
- DAG 是最高层级的调度,每个 job 对应一个 DAG。
- RunJob,提交 RDD Action 操作,是所有调度执行的入口。
- sparkContext 在初始化时,创建了 DAG 调度与 task 调度来负责 RDD Action 操作的调度执行。
- 任务提交时,不是按 Job 的先后顺序提交的,而是倒序的。
- 仅对依赖类型是 shuffle Dependency 的 RDD 操作创建 Stage。
- DAG 在调度室,对于在相同节点上进行的 Task 计算会合并为一个 Stage。
- 各 stage 之间以 shuffle 为分界线。
- Spark SQL 是 spark 的一个子模块,专门用于处理结构化数据。
- Spark SQL 的最大优势是性能非常高。
- Spark SQL 与 Apache Hive 基本完全兼容。
- Spark SQL 提供领域 API,并且提供专门的数据结构抽象 DataFrame。
- Spark SQL 支持非常多的数据源:Hive、Avro、Jdbc、Json 等,而且统一访问。
Spark SQL 两种使用:
- SQL 引擎
- API 操作
分布式 SQL 引擎,两种运行方式:
- JDBC/ODBC Server
- Spark SQL 命令行
- Spark SQL 相关的所有函数,都在 SqlContext 或它子类中。
DataFrame 创建:
- 使用反射的方法从 RDD 创建 DataFrame
- 使用程序动态从 RDD 创建 DataFrame
- 从其他数据源生产 DataFrame
- DataFrame 支持许多特殊的操作,称为领域编程语言或领域 API。
- DataFrame 注册成表,然后使用纯 SQL 来访问。
- Parquet 是一种大数据计算中最常用的列式存储格式。
- 数据源类型的名称一般是全称。
- 优化是非常重要的环节,需要不断积累经验。
- Catalyst(催化剂)是 Spark SQL 执行有限优化器的代号,最核心部分。
- Catalyst 最主要的数据结构是树。
- 所有优化都是基于规则的。
Catalyst 优化:
- 分析阶段
- 逻辑优化阶段
- 物理优化阶段
- 代码优化阶段
- Spark 的性能基本上与数量大小保持线性关系。
- Spark Streaming 接收实时数据,按日期将数据划分为成多批次(Batch),按批次提交个核心计算。
- Spark Streaming 使用的数据抽象是 DStream。
- DStream 内部是连续的 RDD 序列。
- Sprak Streaming 3 种输入 DStream:
- 基本型
- 高级型
- 自定义
- 高级类型的输入 DStream 并不是由 Spark 提供。
- 使用数据源时,要注意可靠性。
- DStream 操作:
- Transformation 操作
- Output 操作类似 RDD Action
- Transform 提供直接操作 DStream 内部 RDD 的方法。
- Spark Streaming 提供专门的状态更新方法。
- 设置数据的滑动窗口,将数个原始 DStream 合并成一个窗口 DStream。
- 窗口(Window)通过连个参数确定:1)窗口长度、2)滑动区间。
- Output 操作将 DStream 结果输出到外部系统。
- DStream 可以序列化到内存。
- 窗口函数和 updateStateBykey 默认会自动持久化。
- 网络按收数据,默认持久化两个节点上,保证容错。
- DStream 基础属性:
- 依赖的在 DStream 列表
- 生产 RDD 的时间
- Complete 计算函数
- RDD 是只读的,可重复计算的分布式数据集。
- SparkStreaming 大部分数据来自网络。
- 流式计算过程:
输入数据流 >> 数据接收 >> 数据计算 >> 结果输出。 - 结果输出操作本身提供至少一次级别的容错性能。
- Spark 提供了检查点功能,用户定期记录中间状态。
- 检查点是有代价的,需要存储数据至存储系统。
- Spark 性能调优两个方向:
- 每个批次的处理时间尽可能短
- 收到数据后,尽可能快地处理
- Storm 是开源免费的分布式实时计算系统。
- Storm 的核心数据抽象是 tuple,是命名的值列表。
- Spark Streaming 粗粒度,storm 更细粒度些。
- 核心数据抽象的不同导致计算模式上的本质却别。
- Weblog 分析的典型的流式实时应用场景。
- ZK 以 Fast Paxos 算法为基础。
- ZK 在分布式系统中协作多任务。
- Hbase 是一个通常与 Hadoop 一起使用的数据库。
- Kafka 是一个基于发布 - 订阅模型的消息系统。
- Solr 是一个企业级的搜索平台。
- ZK 不适合用作海量数据存储。
- 分布式系统中的进程通信有两种选择:直接通过网络进行信息交换,或读写某些共享存储。
- ZK 使用共享存储模型来实现应用间的协作和同步原语。
- 网络通信是分布式系统中并发设计的基础。
- 分布式系统需注意:
- 消息延迟 —— 传输
- 处理器性能 —— 计算
- 时钟偏移 —— 时钟
- 数据中心通常使用大量统一的硬件。
- 主 - 从架构:主节点负责跟踪从节点状态和任务的有效性,并分配任务到节点。
- 主 - 从模式必解决三个关键问题:
- 主节点崩溃
- 从节点崩溃
- 通信故障
- ZK 因故障出现连个及以上主节点称为脑裂(split-brain)。
- 主 - 从架构的需求:
- 主节点选举
- 崩溃检测
- 组成员关系管理
- 元数据管理
- ZK:Paxos 算法和虚拟同步技术。
- Znode Zookeeper 操作和维护一个小型的数据节点。
- Znode 类型决定了 znode 节点的行为方式。
- Znode 节点分持久节点和临时节点。
- Znode4 中类型:
- 持久化(persist)
- 临时的
- 持久有序的
- 临时有序的
- 通知机制是单次触发的操作。
- 每一个 znode 都有一个版本号,它随着每次数据变化而自增。
- ZK 服务器端两种模式:1)独立模式、2)仲裁模式。
- 对 ZK 集合执行请求需要建立会话。
- 会话请求以 FIFO 顺序执行。
- 会话状态:
- Connecting
- Connected
- Closed
- Not connected
- Server 两个端口,第一个用作通讯,第二个用于选举。
- ZK 的 API 围绕 ZK 的句柄(handle)而构建。
- 为了从 ZK 接收通知,我们需要实现监视点(watcher)。
- 监视点和通知形成了一个通用机制。
- 当一个监视点被一个事件触发时,就会产生一个通知。
- Redis 是一个内存数据库,基于键值对存储。
- Redis 是 REmoteDictionaryServer(远程字典服务器)简写。
- Redis 支持键值数据类型:
- 字符串类型
- 散列类型
- 列表类型
- 集合类型
- 有序集合类型
- 数据在 Redis 和程序中存储类似。
- Redis 数据库中的所有数据都存储在内存中。
- Redis 可以在一秒中读写上十万个键值(普通自己本)。
- Redis 提供数据持久化到硬盘。
- Redis 可用做缓存、队列系统。
- Redis 可以为每个键设置生存时间,过时自动删除。
- Redis 可以限定数据占用的最大内存空间。
- Redis 还支持 “发布 / 订阅” 的消息模式。
- Redis 支持阻塞式读取。
- Kill Redis 进程的 PID 也可正常退出,Redis 有处理。
- 每个数据类型 Redis-cli 的展现结果都不同。
- Redis 默认支持 16 个数据库,以数字命令。
- Redis 不支持自定义数据库的名字,每个数据库以编号命名。
- Redis 密码只有一个。
- FLUSH ALL 命令清空 Redis 所有数据。
- 一个 Redis 最好对应一个程序。
- Redis 0 号数据库用于生产,1 号数据库用于测试。
- Select n 切换数据库。
- Keys 命令需要遍历 Redis 中的所有键,不建议生产用。
- Exict key 返回 1/0。
- Del key 返回键值个数,不支持通配符。
- Type 命名用来获取键值的数据类型。
- LPOSH 命令的作用是指定列表型键中增加一个元素。
- Redis 能存储任何形式的字符串。
- Redis INCR 命令让当前键值递增。
- 原子操作取 “原子” 的 “不可拆分” 的意思,最下执行单元。
- Redis 数据类型不支持数据类型嵌套。
- 散列类型适合存储:使用对象类别和 ID 构成键名,使用字段表示对象属性。
- Redis 不要求每个键都依据此结构存储。
- Hset 命令用来赋值,Hget 用于取值。
- Hset 插入返回 1,更新返回 0。
- Hset 命令用于散列类型,set 用于字符串类型。
- Hmset 处理多个字段。
- HgetAll 所有字段和字段值。
- Hexists 用于判断一字段是否存在。
- HsetNX key field value 当字段不存在时赋值。
- Hinrby key field increment 增加数字。
- Hdel key field 删除字段。
- 列表类型(List)可以存储一个有序的字符串列表。
- 列表类型内部是使用双向链表实现的。
- 借助列表类型,Redis 还可以作为队列使用。
- 向列表两端增加元素:
LPUSH KEY VALUE [. . .]
PPUSH KEY VALUE[. . .]
返回长度 - 从列表两端弹出元素:
LPOP KEY
RPOP KEY - 获取列表中元素的个数 llen key。
- 获取列表中指定值:LREM KEY count value。
- Redis 集合类型内部使用散列表实现的。
- 增加和删除元素:
Sadd key member [. . .]]
Srem key member [. . .]] - Smembers 命令返回集合中所有元素。
- 集合间运算:
- Sdiff key [key . . .] —— 差集
- Sinter key [. . .] —— 交集
- Sunion . . . —— 并集
- 有序集合是 Redis 最高级的类型。
- Redis 中的事务是一组命令的集合。
- 事务:要么全执行,要么全不执行。
- Redis 不支持回滚功能。
- Watch 命令可以监控一个或多个键。
- Redis 可以用 expire 命令设置一个键的过期时间。
- TTL 命令查看剩余时间 - 2 删除,-1 永久。
- Persist 取消过期。
- Redis 可限制最大内存。
- LRU 算法即 “最近最少使用”。
- 有序集合常见的使用场景是大数据排序。
- 对有序集合类型排序是会忽略元素的分类。
- Sort 默认按照从下到大排序,用 desc 逆序。
- Sort 通过 alpha 参数实现按照字典,顺序排序非数字元素。
- Sort 支持 limit 返回指定参数。
- 参考键值相同时,Redis 会按照元素本身大小排序。
- 有个 N 个 Get 参数,每个元素返回的结果就有 N 行。
- Get 会返回元素本身的值。
- Store 参数常用来结合 expire 缓存排序结果。
- Sort 是 Redis 中最强大最复杂的命令之一。
- 通知的过程可以借助任务队列来实现。
- 任务队列好处:1)松耦合,2)易于扩展。
- 当列表中没有元素 BRPOP 会一直阻塞住连接。
- BRPOP 命令按收两个参数键名,超时时间,单位秒。
- 如果多个键都有元素则从左向右顺序取实现优先。
- 发布者发布消息的命令是 PUBLISH。
- 订阅频道的命令是 SUBSCRIBE,可用的多个订阅。
- 进入订阅状态后客户端可能收到了 3 种类型的恢复。
- PUSH SCRIBE 命令订阅指定的规则。
- 客户端和 Redis 使用 TCP 协议连接。
- Redis 的底层通信协议对管道提供了支持。
- 精简键名和键值是最直观的减少内存暂用的方式。
- 允许开发者使用 LUA 语言编写脚本传到 Redis 中执行。
- LUA 脚本好处:1)减少网络开销、2)原子操作、3)复用。
- ——eval 参数是告诉 Redis-clli 读取并运行后面的 LUA 脚本。
- LUA 号称性能最高的脚本。
- LUA 脚本很容易和 C/C++ 交互。
- LUA 是一个动态类型语言。
- 表类型是 LUA 语言中唯一的数据结构。
- 函数在 LUA 中是一等值。
- 全局变量只有 Nil 和非 Nil 的区别。
- 在 Redis 脚本中不能使用全局变量。
- 声明局部变量的方法为 local 变量。
- 多行注释:——[[]]。
- LUA 支持多重赋值。
- LUA 有 5 类操作符:
- 数学操作符
- 比较操作符
- 逻辑操作符
- 链接操作符
- 取长度操作符
- LUA if 语句 if .. then .. elseif ..then..else..end。
- LUA 支持 while,repeat 和 for 循环语句。
- For 语句中的循环变量是局部变量。
- LUA 约定数组的索引从 1 开始。
- Paris 是 LUA 内置的函数,实现类似迭代器的功能。
- Pairs 用来遍历非数组的表。
- 函数的定义为:function (参数列表) 函数体 end。
- … 实现可变参数。
- LUA 中 return 和 break 用于跳出循环。
- 编写 Redis 脚本的目的就是读写 Redis 的数据。
- LUA 脚本使用 Redis,call 函数调用 Redis 命令。
- EVALHA 命令允许开发者通过脚本。
- Script kill 命令可以终止当前脚本的运行。
- Redis 支持两种方式的持久化,一种是 RDB 方式,另一种是 AOF 方式。
- Redis 提供了复制(replication)功能,自动同步数据库。
- 在复制概念中,数据库分为两类:master/slave。
- Slave of 参数指向主数据库,进行同步数据。
- 通过复制可以实现读写分离,以提高服务器的负载能力。
- Master 用于写,slave 用于读,适合读多写收的场景。
- 哨兵的作用就是监控 Redis 系统的运行状态:
- 监控主 / 从是否正常
- 当出现故障时,从升为主
- 哨兵是一个独立的进程。
- 哨兵从独立进程的方式对一个主从系统进行监控。
- Redis 3.0 版本支持集群。
- 生产环境运行时不能运行外界直连 Redis。
- Bing 127.0.0.1 只运行本机访问。
- Redis 支持在配置文件中奖命令重命名。
- 如果希望直接禁用某个命令可以将命令重命名成 XXX。
- Redis 通信协议是 Redis 客户端与 Redis 间交流的语言。
- Redis 两种通信协议:
- 二进制安全的统一请求协议
- telnet 程序中输入的简单协议
- 哨兵提供了命令可以通过主数据库的名字获取当前系统的主数据库的地址和端口号。
- 一个哨兵可以同时监控多个 Redis 主从系统。
- 多个哨兵也可以同时监控同一个 Redis 主从系统。
- MapReduce 两阶段:Map 阶段和 Reduce 阶段。
- 每个阶段都以键值对作为输入和输出。
- Map 阶段的输入时 NCDN 原始数据。
- 键是相对稳健起始位置的偏移量。
- Mapper 类是一个泛型,四个参数:
- 输入键
- 输入值
- 输出键
- 输出值
- Hadoop 本身提供了一套可优化网络序列化传输的基本类型:
LongWritable 相对于 Java 的 Long
Text 相对于 String
IntWritable 相对于 Integer - Map () 方法提供了 context 实例用于输出内容的写入。
- Job 对象指定作业执行规范。
- 构造 Job 对象后,需要指定输入和输出数据的路径。
- 在调试 MapReduce 作业时,知道作业 ID 和任务 ID 是非常有用的。
- 虚类相对接口更有利于扩展。
- MapReduce 作业(Job)是客户端要执行的一个工作单元:它包括输入数据,MapReduce 程序和配置信息。
- Hadoop 将作业分成若干个小任务(Task)来执行,器中包括两类任务:Map 和 Reduce。
- 作业(Job)由一个 Jobtracker 及一系列 tasktracker 控制执行过程。
- Hadoop 将 MapReduce 的输入数据划分成等长的小数据块称为 “切片”。
- Hadoop 为每一个切片构建一个 map 任务。
- 切片越细,负载平衡越好。
- HDFS 的块大小默认是 64MB。
- 数据本地化优化 —— 输入数据在本地节点运行 map。
- 数据通过网络传输到 map 任务节点,效率明显降低。
- Map 任务将其输出写入本地硬盘,而非 HDFS,因为 map 的输出是中间结果,Job 完成自动删除。
- 单个 reduce 任务的输入通常来自于所有 map 的输出。
- 每个 reduce 任务的输入来自多个 mao 任务,所以中间过程称为 shuffle(混洗)。
- Shuffle 对总执行时间的影响非常大。
- 集群上的可用带宽限制了 MapReduce 作业的数量。
- Hadoop 允许用户针对 map 任务的输出指定一个 combiner。
- Combiner 的规则制约值可用的函数类型。
- Combiner 是通过 Reducer 类来定义的。
- Hadoop Streaming 使用 Unix 标准流作为 Hadoop 和应用程序之间的接口。
- Streaming 天生适合用于文件处理。
- HDFS 以流式数据访问模式来存储超大文件。
- 一次写入,多次读取是高效的访问模式。
- HDFS 中的文件可能只有一个 writer。
- HDFS 的块大,目的为最小化寻址开销。
- HDFS 集群有两类节点:管理者 - 工作者模式运行。
- Namenode 管理文件系统的命名空间。
- 客户端代表用户通过与 namenode 和 datanode 交互。
- Datanode 是文件系统的工作节点。
- 在联邦环境下每个 namenode 维护一个命名空间卷。
- HDFS 的权限模式与 POSIX 非常相似。
- 用户空间文件系统允许整合式一个 Unix 系统。
- 从 Hadoop 文件系统读取文件,最简单使用 Java.net.url。
- Filesystem 是一个通用的文件系统 API。
- Seek () 方法是一个相对高开销的操作,需要慎重使用。
- Filestatus 封装了文件系统中文件和目录的元数据。
- Hadoop 通配符与 Unix bach 的相同。
- Hadoop 无法自行定义网络拓扑结构。
- 文件系统的一致模型描述了文件读 / 写的数据可见性。
- HDFS 提供了一个方法来使所有缓存与数据节点强行同步。
- HDFS 中关闭文件其实还隐含执行 syn()方法。
- Flume 是一个将大规模数据导入 HDFS 的工具 —— 典型应用从另外一个系统收集日志数据。
- Flume 提供了不同数据级别的数据投递可靠性。
- Sqoop 是将数据从结构化存储批量导入 HDFS。—— 数据库。
- Distcp 是作为一个 MapReduce 作业来实现的。
- 每个文件均按块方式存储,每个块的元数据存储在 namenode 的内存中。
- Hadoop 存储小文件效率非常低。
- Hadoop 存档文件可以使用 MapReduce 的输入。
- Hadoop 自带一套原子操作用于数据 I/O 操作。
- HDFS 会对写入的存储数据计算校验和,并在读取数据时验证校验和。
- Datanode 负责在收到数据后存储该数据及其验证校验和。
- 客户端成功验证一个数据块后,datanode 更新日志。
- Datanode 定期验证所有数据块。
- Hadoop 的 LocalFile Systen 执行客户端的校验和验证。
- 校验的计算代价是相当低的。
- LocalFileSystem 通过 checksumFileSystem 来完成自己的任务。
- 文件压缩两大好处:存储和传输。
- 序列化两大领域常见:进程间通信和存储。
- Writable 两个方法:dataoutput/datainput。
- RawComParator 允许其实现直接比较数据流中的记录。
- Writable 类对 java 基本类型提供封装。
- Text 是针对 URT-8 序列的 writable 类。
- Text 类的 find () 方法返回字节偏移量。
- 多数情况下需要将 Text 对象换成 String 对象。
- BytesWritable 是对二进制数据数组的封装。
- NullWritable 是 writable 的特殊类型,序列化长度为 0.
- Nulwritable 不读也不写,只当占位符。
- NullWritable 可以用作在 SequenceFile 中的键。
- ObjectWritable 是对 Java 基本类型的一个通用封装。
- 由于 writable 是 MapReduce 数据路径的核心,所有调整二进制表示对性能产生显著效果。
- 适当重写一个类,会更加适应我们的需求。
- IDL—— 接口定义语言。
- Avro 是一个独立于编程语言的数据序列化系统。
- Avro 模式通常用于 Json 来写,数据通常采用二进制格式来编码。
- Avro 为序列化和反序列化提供了 API。
- Avro 数据文件时可切分的,适合 MapReduce 快速处理。
- Avro 语言互相操作性。
- Avro 定义了对象的排列顺序。
- Hadoop 配置后添加的资源文件属性会覆盖之前定义的属性。
- MRUnit 是一个测试库。
- 测试驱动程序:
- 使用本地作业运行器
- 使用一个 mini 集群来运行它
- Mini 集群广泛应用于 Hadoop 自带的自动测试包中。
- Hadoop_CLASSPATH 是一项客户端的设置。
- 为了启动作业,我们需要运行驱动程序。
- Job 上的 waitforCompletion () 方法启动作业并检查进展情况。
- 作业 ID 的格式包含两部分:
- Jobtracker 开始时间
- 唯一标识增量计数器
- 任务属于作业,任务 ID 通过替换作业 ID 的作业前缀为任务前缀,然后加上一个后缀表示哪个作业类的任务。
- Hadoop 的 web 界面用来浏览作业信息。
- 作业历史包括已完成作业的时间和配置信息。
- 每个 reducer 产生一个输出文件。
- 最经典的调试方法,打印语句来调试程序。
- 任务页面包括一些看作业总任务细节的链接。
- 针对不同用户,Hadoop 在不同的地方生产日志。
- Hadoop 允许分析作业中的一部分任务。
- Jobcontrol 的实例表示一个作业的运行图。
- Ooize 中,工作流是一个有动作节点和控制节点组成的 DAG。
- 每个工作都必须有一个 start 节点和一个 end 节点。
- Oozie 提供了一组与工作流交互的函数。
- 工作流应用由工作流定义和所有运行所需的资源。
- 运行 MapReduce 作业:
- Job 对象上的 submit()
- Waitforcompletion()
- 客户端,提交 MapReduce 作业。
- Jobtracker,运行作业划分后的任务。
- Jobsummiter 作业提交过程:
- 箱 Jobtracker 请求一个新的作业 ID
- 检查作业的输出说明
- 计算作业的输入分片
- 将运行作业所需的资源复制到 Jobtracker 文件系统中。
- 告知 Jobtracker 作业,准备执行。
- 心跳 向 Jobtracker 表明 tasktracker 是否还存活。
- MapReduce 1 :
- 作业的提交
- 作业的初始化
- 任务的分配
- 任务的执行
- 进度和状态的更新
- 作业完成
- YARN (Yet Another Resource Negotiator)。
- YARN 将 Jobtracker 的职能划分为多个独立的实体。
- YARN 将两种角色划分为两个独立的守护进程:
- 资源管理器
- 应用管理器
- YARN 设计的精妙之处在于不同的 YARN 应用可以在同一个集群共存。
- MapReduce 确保每个 reducer 的输入都是按键排序的。
- 系统执行排序的过程称为 shuffle。
- Shuffle 属于不断被优化和改进的代码的一部分。
- Shuffle 是 MapReduce 的 “心脏” 是奇迹发生的地方。
- 每个 map 任务都有一个环形内存缓冲区用于存储任务的输出。
- Hadoop 设置作业配置参数作为 streaming 程序的环境变量。
- MapReduce 模型将作业分解成任务,然而并行地运行任务。
- Hadoop MapReduce 使用一个提交协议来确保作业和任务都完成功或失败。
- Hadoop 在他们自己的 Java 虚拟机上运行任务,以区别其他正在运行的任务。
- 计数器是收集作业统计信息的有效手段之一。
- Hadoop 为每个作业维护若干内置计数器,以描述多项指标。
- 任务计数器由其任务维护,并定期发送给 tasktracker 再有 tasktracker 发送给 Jobtracker。
- 作业计数器由 Jobtracker 维护。
- 计数器由一个 java 枚举(enum)类型来定义。
- 计数器是全局的。
- 排序是 MapReduce 的核心技术。
- MapReduce 能够执行大型数据集键的 “链接” 操作。
- “边数据” 是作业所需的额外的只读数据。
- RAID —— 磁盘阵列
- HDFS 无需使用 RAID 的冗余机制。
- Hadoop 部分代码需在 Unix 环境下执行。
- Namenode 和 Jobtracker 最好分别放在不同机器中。
- Hadoop 集群架构通常包含两级网络拓扑。
- 为了达到 Hadoop 的最佳性能,配置 Hadoop 系统以让其了解网络拓扑状况旧极为关键。
- HDFS 和 MapReduce 可安装同一系统的不同位置。
- Hadoop 控制脚本依赖 SSH 来执行针对整个集群的操作。
- 集群的每个 Hadoop 节点都各自保存一系列配置文件。
- Hadoop 也支持为所有 master 和 worker 机器采用同一套配置文件。
- 为每一机器类维护单独的配置文件。
- 同步所有机器上的配置文件极具挑战性。
- Hadoop 内置一些脚本来运行指令,在集群内启动和终止守护进程。
- MapReduce 控制脚本不使用 masters 文件。
- Namenode 在内存中保存整个命名空间中的所有文件元数据和块元数据。
- Hadoop 为各个守护进程分配 1GB 内存。
- 在一个 tasktracker 上能够同时运行的任务数取决于一台机器有多少个处理器。
- Hadoop 守护进程一般同时运行 RPC 和 HTTP 两个服务器。
- 各个 datanode 运行 TCP/IP 服务器以支持块传输。
- YARN 是运行 MapReduce 的下一代架构。
- YARN 有一个作业历史服务器和一个 web 应用程序代理服务器。
- YARN 更加精细化管理内存。
- YARN 守护进程运行一个或多个 RPC 和 HTTP 服务。
- Kerberos 获取服务:
- 认证
- 授权
- 服务请求
- Hadoop 使用委托令牌来支持后续认证访问。
- Whirr 使用 SSH 与云端的机器通信。
- Pig 为大型数据集的处理提供了更高层的抽象。
- Pig 提供了一套更强大的数据变换操作。
- Pig Latin 程序由一系列的操作式变换组成。
- Pig 是一种探索大规模数据集的脚本语言。
- MapReduce 的一个缺点是开发周期太长。
- Pig 提供了多个命令来检查和处理程序中已有的数据结构。
- Pig 被设计为可扩展的,处理路径中几乎每个部分都可以定制。
- Pig 是作为一个客户端应用程序运行的。
- Pig 两种模式:本地和 MapReduce。
- Grunt 是与 Pig 进行交互的外壳程序(shell)。
- 在 MapReduce 模式下,Pig 翻译成 MapReduce 作业。
- Pig 发布版本只和特定的 Hadoop 版本对应。
- 三种执行 Pig 程序方法:
- 脚本
- Grunt
- 嵌入式方法
- 创建一个精简的数据集是一门艺术。
- Pig Latin 是一种数据流编程语言,而 SQL 是一种声明式编程语言。
- 一个 Pig Latin 程序由一组语句构成。
- Pig Latin 并美欧正式的语言定义。
- 在 Pig Latin 程序执行时,每个命令按次序进行解析。
- Hive 是一个构建在 Hadoop 上的数据仓库框架。
- Hive 一般在工作站上运行。
- Hive 把数据组织为表。
- 元数据(如表模式)存储在 metastore 数据库中。
- Hive 外壳环境是我们交互的主要方式。
- HiveQL 是 Hive 的查询语言。
- Hive 操作表而 Pig 直接操作数据集。
- HiveQL 大小写不敏感。
- 用 - e 选项在行嵌入命令,不用加分号。
- 在 Hive 的仓库目录中,表存储为目录。
- Metastore 包含两部分:服务和后台数据的存储。
- 对于独立的 metastore,mysql 是一种很受欢迎的选择。
- Hive 把表组织成 “分区”。
- 桶为表加上了额外的结构。
- 每个桶就是表(分式)目录里的一个文件。
- Hive 从两个维度对表的存储进行管理:行格式和文件格式。
- 视图是一种用 select 语句定义的 “虚表”。
- Hbase 是一个在 HDFS 上开发的面向列的分布式数据库。
- 数据模型:
- 应用把数据存放在带标签的表中
- 表中行的键也是字节数组
- 行中的列被分成 “列族”
- 一个表的列族必须预先给出
- 所有列族成员都一起存放在文件系统中。
- HBase 自动把表水平分成 “区域”,每个区域由表中行的子集构成。
- HBase 依赖于 Zookeeper。
- HBase 通过 Hadoop 文件系统 API 来持久化存储数据。
- HBase 有 Java 开发。
- Hbase 是一个分布式的,面向列的数据存储系统。
- HBase 有一个高效的批量加载工具。
- Sqoop 将结构化存储器抽取到 Hadoop 中。
- Sqoop 有 java 开发。
- Hive 不支持事务。
- Hive 是最适合数据仓库应用程序的。
- Hive 和 Mysql 提供的 SQL 方言最接近。
- Map 操作会将集合中的元素从一种形式转换成另一种形式。
- MapReduce 计算框架中的输入和输出的基本数据结构是键 - 值对。
- Hadoop 神奇的一部分在于 sort 和 shuffle 过程。
- Hive 驱动计算的 “语言” 是一 XML 形式编码的。
- Hive 通过和 Jobtracker 通信来初始化 MapReduce 任务(Job)。
- Metastore(元数据存储)是一个独立的关系型数据库。
- Pig 常用于 ETL(数据抽取、数据转换、数据装载)。
- Hadoop 团队通常会将 Hive 和 Pig 结合使用。
- Hive 无法提供数据库特性(如行级别更新,快速查询响应和支持事务)。
- HBase 的设计灵感来自 goole 的 bigTable。
- HBase 面向列存储,列组成列族。
- HBase 对每个列保留多个版本。
- HBase 使用 HDFS 来持久化存储数据。
- 将程序设计成驱动,比较方便移植。
- HBase 没有提供 SQL 语言。
- Hadoop 面向批处理系统。
- CLI 是我们使用 Hive 的最常用方式。
- Jobtracker 管理着 Job,而 HDFS 则由 namenode 管理。
- 元数据存储中存储了表的模式和分区信息等元数据。
- Hive 会将输出写到标准输出中。
- –e 执行字符串包含的命令。
- –s 去掉 ok。
- –f 执行文件。
- 如果查询中的表名和这个例子并不相关,我们有时候会使用 src。
- 用户可以使用上下键来滚动查询历史命令。
- 用!执行 bash shell 命令。
- Hive Cli 可执行 Hadoop 的 dfs 命令。
- Hive 本身提供了不同时区互相转换的内置函数。
- Hive 中的列支持使用 strct、map 和 arry 集合数据类型。
- Hive 中并没有键的概念。
- Hive 不会再数据加载时进行验证,而是在查询时进行。
- Hive 中数据库的概念本质上仅仅是表的一个目录式命名空间。
- Hive 会为每个数据接库创建一个目录。
- 数据库的文件目录名是以.db 结尾。
- Hive 中并没有嵌套数据库的概念。
- Hive 不允许用户删除一个包含有表的数据库。
- Hive 会自动增加两个表属性:last_modified_by|last_modified_time。
- Hive 总是将创建的表的目录放置在这个所属的数据库目录之后。
- Show tables 命令可以列举出所有的表。
- 管理表(内布表)不方便和其他工作共享数据。
- Exte Nal 告诉 Hive 这个表示外部表。
- Location 告诉 Hive 数据位于哪个路径下。
- 因为表示外部的,所以 Hive 并非人为其完全拥有这份数据。
- 有些 Hive QL 并不使用外部表。
- 分区字段,表现得旧和普通的字段一样。
- 对数据进行分区,也许最重要的原因是为了更快地查询。
- 通过 show partitions 命令查看表中存在的所有分区。
- Hive 没有行级操作。
- Hive 通常指定的路径应该是一个目录,而不是单独的文件。
- Hive 要求源文件和目标文件以及目录应该在同一个文件系统中。
- 指定 overwrite 关键字,目标文件之前存在的会被删除。
- Hive 并不会验证用户装载的数据和表的模式是否匹配。
- Hive 会验证文件格式是否和表结构定义的一致。
- INSERT 语句允许用户通过查询语句向目标表中插入数据。
- 静态分区键必须出现在动态分区键之前。
- Hive 中没有临时表的概念。
- Select 是 sql 中的射影算子。
- 可用正则来选举我们想要的列。
- Float 和 double 相比较会出现问题。
- RLike 可用正则指定匹配条件。
- Hive 目前不支持 on 中的 or。
- 视图可以允许保存一个查询并像对待表一样对这查询进行操作。
- Hive 值有有限的索引功能。
- Bitmap 索引普遍应用于排重后值较少的列。
- Hive 中分区的功能是非常有用的。
- 每个 task 都是一个新的 Jvm 实例,都需要开启和销毁的开销。
- 分区提供一个隔离数据和优化查询的便遍历的方式。
- 分桶是将数据集分解或更容易管理的若干部分的另一种技术。
- Hive 提供了 serde 抽象,其用于从输入中提取数据。
- 一个 serDe 通常是从左向右进行解析的。
- Hive 提供了一个列式 SerDe 来以混合列式格式存储信息。
- Hive 中通常使用 “UDF” 来表示任意的函数(用户自定义函数)。
- Streaming 提供了另一种处理数据的方式。
- Hive 中文件格式间具有明显的差异。
- Hive 文本文件格式选择和记录格式是对应的。
- SequenceFile 可以在块级别和记录级别进行压缩。
- 对于列式存储而言,进行压缩通常会非常高效。
- Hive 功能强大的一个方面体现在不同的存储格式间转换数据非常地简单。
- SerD 是序列化 / 反序列化的简写形式。
- Hive 引擎使用定义的 InputFormat 来读取一行数据记录。
- Thrift 是一个软件框架,其用于跨语言的服务开发。
- HiveServer 使用 Thrift 提供服务。
- 存储处理程序是一个结合 InputFormat、OutPutFormat、SerDe 和 Hive 需要使用的特定的代码。
- 存储处理程序负责从底层存储系统中读取或写入数据。
- Hadoop 起源于 Apache Nutch 的子项目。
- HBase 弥补了 Hadoop 只能离线批处理的不足。
- HBase 能够存储小文件,提供海量数据的随机检查。
- 大数据强调 3v 特征:即 Volume(量级)、Varity(种类)和 Velocity(速度)。
- 结构优化,质量提高,是一种实现实质性的跨越式的进程。
- NoSQL 是 Not only SQL,泛指非关系型数据库。
- NoSQL 的实现具有两个特征:使用硬盘和把随机存储器作存储载体。
- NoSQL 的 Cache 是记录级的,是一种粗粒度的 Cache。
- NoSQL 无须事先为要存储的数据建立字段,随时可以存储自定义的数据格式。
- HBase 是一个高可靠、高性能、面向列、可伸缩的分布式数据库。
- HBase 是 NoSQL 数据库。
- HBase 可以通过行健(RowKey)检索数据,仅支持单行事务,主要用于存储非结构化和半结构化的松散数据。
- HBase 的单表可以有百亿行,百万列。
- HBase 是面向列的存储和权限控制,并支持列独立检索。
- HBase 严重依赖 Hadoop 的 HDFS 组件。
- MapReduce 可以直接访问 HBase。
- HBase 中最重要的访问方式是原生 Java API。
- 客户端 Client 是整个 HBase 系统的入口。
- HMaster 主要负责 Table 和 Region 的管理工作。
- HRegionServer 主要负责响应用户 I/O 请求。
- HStore 存储是 HBase 存储的核心。
- HStore 两部分:Memstore 和 StoreFile。
- 当 StoreFile 文件增长到一定阀值,会触发 CompCut。
- HBase 的同一个表的记录可以有不一样的列。
- HBase 中最基本的单元是列。
- 每一个行的行健是唯一的。
- HBase 中的表有若干行,每行有很多列,列中的值有多个版本,每个版本的值称为一个单元格,单元格存不同的列值。
- HBase 称为无模式数据库的原因是 HBase 的表没有列定义,没有类型。
- 创建连接是一项非常消耗资源的工作。
- HBase 为我们提供了一个连接池。
- 行键是按字段排序由低到高存储在表中。
- HBase 中行键是唯一的索引。
- HBase 中的列族是一些列的集合。
- 一个列族中所有列成员有着相同的前缀。
- 一个列族的成员在文件系统上都是存储在一起的。
- 在创建表的时候至少指定一个列族。
- 修改列族要先停用表。
- HBase 中的单元格由行键、列族、列、时间戳唯一确定。
- 单元格的内容是不可分别的字节数组。
- 每个单元格都保存着同一份数据的多个版本。
- 时间戳是 64 位的整数。
- HBase 对数据模型 4 个操作包括:Get、Put、Scan 和 Delete。
- 多用户多线程对统一行的读写操作都不会影响该行数据的原子性。
- Get 方法获取数据时,HBase 返回的结果包含所有匹配的单元格数据。
- Result 实例中包含列族、列限定符和时间戳等。
- Put 操作要么向表增加新行,要么更新行。
- Put 操作每次都会发起一次到服务器的 RPC 操作。
- HBase 客户端有一个缓冲区,大大提高写入性能。
- HBase 提供 compare-and-set 先检查,再执行。
- HBase 没有 update 操作。
- Scan 操作允许多行特定属性迭代。
- HBase 的 Delete 操作可以指定删除某个列族或者某个列,或某时间更早的数据。
- HBase 的 Delete 操作并不是真正地从磁盘删除数据。
- RowKey、Column、Version 组合在一起称为 HBase 的一个单元格。
- Version 用一个长整型表示(时间)。
- Get 是在 Scan 的基础上实现的。
- 一个 put 操作会为一个 Cell 创建一个版本,默认使用当前时间戳。
- 删除操作的实现是创建一个墓碑标记。
- Get 和 Scan 操作返回的是经过排序的数据。
- 返回的数据首选按行字典序排序,其次是列族、然后是列修饰符,最后的时间戳逆序。
- 获取列族的完整列名的唯一方法是处理所有行。
- HBase 不支持连接查询,即 Join 查询。
- ICV(HBase 计数器)操作发送在 RegionServer 上。
- 事务特性 ACID,如 HBase 这种 NoSQL 数据库仅提供对行级别的原子性。
- HBase 不是一个具备完整 ACID 特性的数据库。
- HBase 中一个表的数据会被划分成很多的 Region。
- 刚刚穿件的表只有一个 Region。
- 每一个 Region 由一个 RegionServer 管理。
- 每个 Region 包含起始 RowKey 的记录,不包含结束 RowKey 的记录。
- Region 的拆分与转移是由 HBase 自动完成。
- CAP 原理是数据库软件的理论基础。
- HBase 为了扩展性和性能考虑,弱化了事务性。
- RowKey 是不可分割的字节数,按字典排序由低到高存储在表中。
- RowKey 决定了访问 HBase 表时可以得到的性能。
- Region 基于 Rowkey 为一个区间的行提供服务。
- Hfile 在硬盘上存储有序的行。
- HBase 只能在 RowKey 上建立索引。
- RowKey 优化:
- 字典排序
- 进行散列
- 尽量短
- 列族是一些列的集合。
- 一个列族的所有列成员有着相同的前缀。
- 列族的前缀必须是可输出的字符。
- 列族必须在表建立的时候声明,列在用户随时可以创建。
- 在物理上,一个列族的成员在文件系统上都存储在一起。
- Flush 和 Compaction 操作式针对一个 Region 的。
- 考虑 Flush 性能,列族数量越少越好。
- HFile 数据块大小可以在列族层次设置。
- 数据块索引存储每个 HFile 数据块的起始键。
- 布隆过滤器(Bloom Filter)允许对存储在每个数据块的数据做一个反向测验。
- HFile 可以被压缩并存放在 HDFS 上。
- HBase 的每个单元格只维护三个时间版本。
- CRUD 操作式 HTable 最基本的功能,其中的每类方法都包含多种实现。
- Java 客户端有两种查询数据的方式:单行读和扫描读。
- 每类操作的不同实现方法应用在不同的场景下。
- HBaseAdmin 类是 HBase 数据库的管理入口类。
- Scan 类中的主要实现方法可以划分成三类:
- 添加列或列族
- 设置查询属性
- 查看属性信息
- 整个删除过程分为三步:
- 初始化 Table 实例
- 构造实体类 Delete,Delete 封装行键、列族或列名
- 执行删除
- HBase 提供了若干封装类用于 “无缝” 连接 MapReduce。
- 从 HBase 表汇总读取数据,使用 MapReduce 计算完成之后,将数据存储到其他介质中。
- NoSQL 不使用 SQL 作为查询语言。
- 创建外部表适用于某表 HBase 已经存在,但在 Hive 中没有相关信息。
- 字符串类型是 Redis 中最基本的数据类型。
- 所有 Redis 命令都是原子操作。
- Redis 提供了 4 个命令可以直接对二进制位进行操作。
- Redis 是采用字典结构以键值对的形式存储数据的。
- 一个散列类型键可以包含至多 2 的 32 次方减去 1 个字段。
- 散列类型适合存储对象。
- 大数据所面对的问题是:一是存储,二是计算。
- 大数据的定义是发现潜在规律和趋势。
- 谷歌三大论文:1)GFS、2)MapReduce、3)BigTable。
- Hadoop 是一个批处理系统,不擅长实时计算。
- YARN 是通用的资源管理系统。
- 机器学习算法通常需要对同一个数据集合进行多次迭代计算。
- RDD 弹性分布式数据集(Resillient Distributed DataSet)。
- Spark 支持检查点(checkpoint)的容错机制。
- RDD 支持的方法:
- 转换(Traansformation) —— 生产新的 RDD
- 动作(Action) —— 返回一个非 RDD
- Spark 没有存储能力,仅做数据仓库。
- MapReduce 依附于 Yarn 来运行。
- Zookeeper 的节点必须是奇数个。
- Standalone 模式下,集群可以容许某一个或多个工作节点失效。
- Hadoop:HDFS、MapReduce、YARN。
- Spark 可以单独使用 HDFS 或 YARN。
- 由 YARN 统一负载分配资源科避免分配混乱。
- Spark 程序由 master 还是 YARN 来调度执行,是由 spark 程序在提交时决定的。
- 只有在交互需求是才使用 yarn-client 方式。
- 切片,本地模式默认去 CPU 的核算。
- 每个 Job 的执行,都会经历序列化,网络传输,反序列化和运行的过程。
- 在序列化是,spark 会将 Job 运行所依赖的变量、方法(称为闭包)全部打包在一起。
- 如果 RDD 多次迭代,可将其持久化。
- 在 Zookeeper 模式下,恢复期间新任务无法提交。
- RDD 特点:1)只读、2)可缓存、3)可以通过重新计算得到。
- Kafk 是一个分布式、分区、重复提交的日志服务。
- Kafka 掌管的类别消息叫做主题(topics)。
- 生产者发布消息到 kafka 主题中。
- 消费者订阅主题以及处理发布的消息。
- Kafka 每个服务器叫做 broker。
- 主题是一个类别或者被发布消息的名称。
- Kafka 集群根据时间保留消息,而不是是否被消费。
- 消费者可以随时添加和移除。
- 生产者发布数据到他们选定的主题上。
- 消费者、消息处理通常有两种模式。:队列和发布 - 订阅。
- 在队列模式中,一组消费者可能从服务器读取消息,每个消息被其中一个消费者消费。
- 在发布 - 订阅模式中:消费者是广播到全部的消费者中。
- 消费者用一个消费组名称来标识自己。
- Kafka 能够提供顺序保证并在一组消费者处理过程中均衡负载。
- Kafka 可以替换传统的消息代理。
- Kafka 可以媲美传统的消息系统例如:ActiveMQ 和 RabitMQ。
- Kafka 通常用于操作监测数据的处理。
- Kafka 作为日志聚合的一种解决方案。
- Zookeeper 典型应用场景:配置文件的管理,集群管理,分布式队列,同步锁 leader 选举,队列管理等。
- Zookeeper 是分布式服务框架。
- dataMonitor 类是本程序 Zookeeper 逻辑的核心。
- Zookeeper 是一个基于观察者模式设计的分布式服务管理框架。
- 分布式应用中通常需要有一套完整的命名规则。
- Netty 高性能的 NIO 框架。
- Netty 快速开发高性能,高可靠性的网络服务器和客户端程序。
- Netty 是一个网络通信框架。
- NIO 是一个面向块的 I/O 系统。
- NIO 核心对象:缓冲区(Buffer),通道(Channel),选择器(Selecter)。
- 在 NIO 库中,所有数据都是用缓冲处理的。
- Netty 是事件驱动的。
- Git 是一个开源的分布式版本控制系统。
- Kafka 系统的角色:
- Borker:一台 kafka 服务器就是一个 broker。
- Topic:可以理解为一个 MQ 消息队列的名字。
- Java 程序设计语言、虚拟机、API 类库统称 JDK。
- Jdk 是用于支持 Java 程序开发的最小环境。
- JRE 是支持 Java 程序运行的标准环境。
- Java 技术体系可分为 4 个平台:Java Card、Me、Se、EE。
- Hadoop 每个切片构建一个 map 任务。
- Map 输出是中间结果,reduce 产出最终输出结果。
- 集群上的带宽限制了 MapReduce 的作业的数量。
- HDFS 中 fsck 指令可以显示块信息。
- Namenode 之间需要通过高可用的共享存储实现编辑日志的共享。
- Datanode 需要同时向连个 namenode 发送数据块处理报告。
- 超级用户是 namenode 进程的标识。
- Seek()方法是一个相对高开销的操作。
- FileSystem 是一个通用的文件系统 Api。
- HDFS 只允许对一个打开的文件顺序写入,或者在现有文件的末尾追加数据。
- FileStatus 封装了文件系统中问价和目录的元数据。
- 过滤器有 path 表示,只能作用域文件名。
- Hadoop 无法自行第一网络拓扑结构。
- DFSoutputstream 将写入分成一个个的数据包,并写入内部队列,称为 “数据队列”。
- 文件系统的一致模型描述了文件读 / 写的数据可见性。
- HDFS 为性能牺牲了一些 Posix 要求(可移植操作系统接口)。
- HDFS 提供一个方法来使所有缓存与数据节点强行同步。
- Flume 是一个将大规模流数据导入 HDFS 的工具。
- Flume 节点允许以任何拓扑方式进行组织。
- 当一个字段中包含多个类型时,ObjectWritable 非常有用。
- Avro 是一个独立于编程语言的数据序列化系统。
- Avro 模式通常用 Json 来写,数据通常采用二进制格式来编码。
- Avro 数据文件时可切分的,适合 MapReduce 快速处理。
- SeQuenceFile 是可以看做小文件的容器。
- MapFile 是已经排序过的 SequenceFile,它有索引,所以可以按键查找。
- Hadoop 提供了钩子(hook)来辅助分析过程。
- Mini 集群广泛应用于 Hadoop 自带的自动测试包中。
- 作业历史包括已完成作业的时间和配置信息。
- MapReduce 任务日志可以从 web 界面访问。
- 复杂的作业通常是增加更多的作业,而不是增加作业的复杂度。
- Jobcontrol 的实例表示一个作业的运行图。
- 在 Ooize 中,工作流是一个由动作(action)节点和控制流节点组成的 DAG。
- Ooize 提供了一组与工作流交互的函数。
- TaskRunner 启动了一个新的 Jvm 里运行每个任务。
- YARN 将 Jobtracker 的职能划分多个独立的实体。
- YARN 集群上可以运行不同版本的 MapReduce。
- 每个 map 任务都有一个环形内存缓存区用于存储任务的输出。
- 在本地作业运行器上运行时,只支持 0 个或 1 个 reduce。
- 一个输入切片(split)就是一个由单个 map 操作来处理的输入块。
- 切片并不包含数据本身,而是指向数据的引用。
- Jobtracker 使用其存储位置信息来调度 map 任务从而在 tasktracker 上处理这些切片数据。
- Reduce 输入的键一定是有序的。
- Hadoop 为每个作业维护若干内置计数器,以描述多项指标。
- 任务计数器由其关联任务维护,并定期发送给 tasktracker,再有 tasktracker 发送给 Jobtracker。
- “边数据” 是作业所需的额外的只读数据。
- Hadoop 还为 mapper 和 reduce 提供了一个包含了常用函数的库。
- Hadoop 使用 dfs。Mapred,rpc 和 jvm 四个上下文根。
- FileContext 将度量写到一个本地文件中。
- Ganglia 是一个针对超大规模的开源的分布式监控系统。
- Hadoop 包括多个托管 bean(MBean),可以将 hadoop 度量发布给支持 JMX 的应用。
- Didtcp 是一个理想的备份工具。
- HDFS 能够容忍 datanode 故障,但这并不意味着允许随意终止 datanode。
- Shell for((i0;i<n;i++))。
- Break n 跳出几层循环。
- For I in {1 .. 4}。
- Unset 删除一个元素。
- Nohup 保持后台允许。
- -> 覆盖,->> 追加。
- 0、1、2 标准输入正确,错误输出。
- Ls >/de/null 深渊。
- Linux 默认无回收站。
- –e 执行转义字符。
- Fsimage:元数据镜像文件。
- 目前 HDFS 不支持断点续传。
- 最后块不足够,则按实际打下存储。
- HAR 是一个目录结构。
- Namenode 两种状态:Active 和 standly。
- Namenode 同步数据通过 Journanodes 集群。
- Namenode 切换,自动和手工切换。
- MapReduce 是分布式并行计算模型,用于解决海量数据问题。
- Hive 操作流程:
- 提交 SQL 交给驱动
- 驱动编译解析相关字段
- 去 metastore 查询相关信息
- 编译返回信息,发给驱动
- 驱动发一个执行计划
- DDLS 对数据库表操作
- 吧 Job 交给 Jobtracker 让 tasktracker 执行
- 完成 Job 返回数据信息,找 namenode 查数据
- Dfs ops 直接和 namenode 交互
- Hive dfs ls 查看 hadoop 系统。
- Hive 无删除语句,用 replace 实现。
- Replace 很危险,不建议使用。
- Hive 删字段,大多数情况重建表。
- 桶表时对数据进行哈希取值,然后放到不同文件中存储。
- 桶表应用于抽样查询,加载文件分文件存储。
- 使用视图可以降低查询复杂度。
- 索引是对数记录偏移量。
- 分区字段字段建索引。
- 建索引会引发 MapReduce 计算。
- 装载数据:1)本地文件加载方式,2)查询装载。
- 动态分区加载方式。
- Hive 是读模式。
- RDBMS 是写模式。
- Hive 不支持对单行操作,只支持覆盖和追加。
- 每个 HStore 对应了 Table 中的一个列族的存储。
- HStore 是 HBase 存储的核心:HFile、memstore。
- HLog 用于数据还原。
- HFile 是不定长的。
- CSV 是逗号分隔符的文件。
- Hive 分析 HBase,只要表映射即可。
- 列族优化:
- 随机查询:数据块越少,索引越大,占用内存也越大
- 顺序查询:更好的顺序扫描需要更大的数据块
- 布隆:有问题反馈,无问题不反馈。
- HBase 删除数据时先标记合并删除。
- HBase 热点优化,创建分区。
- Solr 可以实现全文搜索。
- Solr 可以方便实现站内搜索功能。
- Solr 是通过 http 协议处理搜索和查询请求。
- Solr 是一个索引库。
- 线性的访问磁盘,很多时候比随机访问内存块。
- Kafka 将数据分段,为每个段建立索引。
- 索引分两部分:offset 和 position。
- Storm 处理高频数据和大规模数据。
- Storm 由用户自定义处流程。
- Stream —— 一列火车。
- Tuple —— 一节车厢。
- 数据 —— 乘客。
- Bolt —— 对 tuple 中数据进行处理 中间站。
- Spout —— 源头,相当于火车的始发站。
- Toplogy —— 轨道。
- Storm 主 - 从结构。
- 主节点:nimbus,负责分发代码,分配任务。
- 从节点:supervisor,负责产生 worker,执行任务。
- Storm 集群的运行依赖于 Zookeeper。
- Executor 是一个被 worker 进程启动的单独线程。
- Task 是最终运行 spout 或 bolt 中代码的执行单元。
- Slots 就是 work 进程。
- 将数据按类型分组。
- Storm 流分组:1)随机 负载均衡,2)字段 类型分组。
- Work 挂掉,storm 会重新启动一个进程,数据不会丢失。
- Storm 不支持 HA(目前)。
- 每个 work 都有一个 ack/fail 确认机制。
- Trident 是对 storm 进行封装的一个框架。
- ES 也是对 Luncene 的封装,天生为分布式而生。
- ES 基于 Restful 接口。
- Hadoop RPC 调用是基于 Probobuf 实现的。
- Client protocol 定义了所有由客户端发起的,由 namenode 响应的操作:
- HDFS 文件读相关的操作
- HDFS 文件写以及追加写的相关操作
- 管理 HDFS 命名空间(namenode)的相关操作
- 系统问题与管理相关的操作
- 快照相关操作
- 缓存相关操作
- 其他
- FileSystem:
- HDFS 文件读操作
- HDFS 文件写与追加操作
- 命名空间的管理操作
- DFSAdmin:对系统问题管理相关操作。
- 处于安全模式(safemode)中的 namenode 不接受客户端对命名空间的修改操作,只读。
- 刚刚启动的 namenode 直接自动进入安全模式。
- 必须在安全模式的两个操作:
- ‘-savenamespace’用于将整个命名空间保存到新的 fsimage 文件中
- ‘-rolledits’则会触发重置 editlog 文件
- Refreshnodes () 方法会触发 namenode 刷新数据节点列表。
- Findizeupgrade () 和 rollingupgrade () 操作都是与 namenode 升级相关。
- 快照保存了一个实践点上 HDFS 摸个路径中所有数据的拷贝。
- 快照可以将失效的集群回滚到之前一个正常的时间点上。
- 创建快照之前,先开启目录的快照功能。
- HDFS 2.3 版本添加了集中式缓存管理功能:
- Cache directive:表示要被缓存到内存的文件或目录
- Cache pool:用于管理一系列的 cache directive 类似于命名空间
- Datanode 使用 DatanodeProtocol 接口与 namenode 握手注册,发送心跳进行全量以及增量的数据汇报。
- DatanodeProtocol 三种方法类型:
- Datanode 启动相关
- 心跳相关
- 数据块读写相关
- Datnode 启动操作会与 namenode 进行四次交互:
- 与 namenode 握手
- 注册上的 datanode
- 汇报数据块
- 缓存所有数据块
- 分布式系统的节点之间大多采用心跳维护节点的健康状态。
- InterDatanodeProtocol(DN 与 DN 之间接口),主要用于租约恢复操作。
- 客户端打开一个文件进行写操作是,首先获取租约,并定期更新租约。
- NamenodeProtocol 定义了第二 namenode 与 namenode 之间的接口。
- HDFS 除了 RPC 调用还定义了流式接口(TCP/HTTP)。
- Hadoop RPC 不足以支持大文件读写。
- HDFS 客户端读取一个 HDFS 文件流程 :
- 打开 HDFS 文件
- 从 namenode 获取 datanode 地址
- 连接到 datanode 读取数据块
- 关闭输入流
- 数据块的应答包中不仅包含了数据,还包含了校验值。
- HDFS 客户端写入一个 HDFS 文件的流程:
- 创建文件
- 建立数据流管道
- 通过数据流管道写入数据
- 关闭输入流并提交文件
- HDFS 追加文件流程:
- 打开已有的 HDFS 文件
- 建立数据流管道
- 通过数据流管道写入数据
- 关闭输入流并提交文件
- 对于命名空间的一致性,两个 namenode 都需要与一组独立运行的节点(Journalnode,JNS)通信。
- ZKFailovercontroller 负责维护 HA。
- RPC(Remote Procedure Call protocol),远程过程调用协议。
- Hadoop RPC 框架底层采用 Java NIO,Java 动态代理以及 protobuf 等。
- RPC 框架:
- 通信模块
- 客户端 stub 程序
- 服务器端 stub 程序
- 请求程序
- 服务程序
- 客户端的 stub 可以看作是一个代理对象。
- Hadoop RPC 框架的使用抽象:
- 定义 RPC 协议
- 实现 RPC 协议
- 客户端获取代理对象
- 服务端启动并构造 RPC servers
- Namenode:
- 文件系统目录树管理
- 数据块以及数据节点管理
- 租约管理:namenode 给予租约持有者在规定时间内拥有文件权限的合同
- 缓存管理
- Fsnamesystem
Namenode 的启动和停止 - HDFS 文件系统的命名空间是以 / 为根的整个目录树,是通过 FSDirectory 类来管理的。
- HDFS 中文件与目录都被当做系统目录树的一个 INode 节点。
- HDFS 会将命名空间保存到 namenode 的本地系统上一个叫 fsimage 的文件汇总。
- FSDirectory 维护者文件系统目录树的节点。
- INode get 方法:
- Username
- Groupnode
- Fspermission
- Allfeature:安全相关
- Modification
- Accesstime
- Sattrfeature:扩展属性
- HDFS 的检查点机制会定时将 editlog 文件与 fsimage 文件合并以产生新的 fsimage 文件。
- 非 HA,检查点操作由 secondary namenode 来执行。
- Namenode 维护着 HDFS 中连个最重要的关系:
- HDFS 文件系统的目录树以及文件的数据块索引
- 数据块和数据节点的对应关系
- 当 namenode 发生错误并今夕了 Active 与 standly 切换时,多余的副本不能直接删除,先汇报再从队列中移除。
- 数据块副本状态:
- 正常副本
- 损坏副本
- 多余副本
- 等待删除副本
- 等待删除副本
- 等待复制副本
- 正在复制副本
- 推迟操作副本
- 数据副本的删除情况:
- 数据块所属的 HDFS 文件被删除
- 数据块的副本数量多于配置表
- 副本被 namenode 标记损坏副本
- 在 HDFS 中,客户端写文件时需要先从租约管理器中申请一个租约。
- Namenode 启动时会首先加载命名空间镜像并合并编辑日志。
- 预防脑裂,HDFS 提供三个级别的隔离机制:
- 共享存储隔离
- 客户端隔离
- Datanode 隔离
- HA 管理命令的执行是由 HAAdmin 为负责的。
- Namenode 三个类:
- Namenode 类
- nameNode Rpcserver
- FSNamesystem 类
- 块池:一个块池由属于同一个命名空间的所有数据块组成。
- 命名空间卷:一个 namenode 管理的命名空间以及它对应的块池一起被称为命名空间卷。
- 每个块池都是一个独立的数据块集合。
- Datanode 从逻辑上可切分几个模块:
- 数据层
- 逻辑层:向 NN 汇报,心跳,扫描损坏数据块
- 服务器
- Datanode 升级需要考虑:
- 版本兼容性问题
- 升级消耗的硬盘空间问题
- 回滚要求
- Datanode 两个管理功能:
- 管理与组织磁盘存储目录
- 管理与组织数据块及其元数据文件
- Storedirectory:
- 获取文件夹相关
- 加锁 / 解锁
- 存储状态恢复
- 集中式缓存由分布在 datanode 上的对外内存组成,同时被 namenode 统一管理。
- 数据包:
- 数据包头
- 校验数据
- 实际数据
- Java NIO 零拷贝模式。
- Datanode 扫描器同期验证 datanode 上存储的数据块正确性。
- HDFS 目前提供三个客户端接口:
- distributedFileSystem
- FSShell
- DFSAdmin
- DFSClient 是用户使用 HDFS 各项功能的起点。
- HDFS 管理员通过 DFSAdmin 工具管理与配置 HDFS。
- HDFS 目前实现的读操作有三个层次:
- 网络读:socket
- 短路读:同一节点
- 零拷贝读:缓存转换
- Shuffle 和 sort 阶段负责执行两个主要动作:
- 决定哪个 reducer 接收 map 输出的键值对(切片)
- 并确定传输给 reducer 的键值对是进行排序的
- MapReduce 是基于批处理的框架,不适合实时访问数据。
- Hadoop 配置文件:
- Hadoop-env.sh —— 设置环境变量
- Core-site.xml —— 系统级的 Hadoop 配置项
- Hdfs-site.xml ——HDFS 配置
- Mapred-site.xml ——HDFS 设置
- Master ——Hadoop 的 master 主机列表
- Slaves ——Hadoop 的 slave 主机地址列表
- Flume 四个组件:
- Nodes ——flume 数据路径
- Agents —— 从本地主机上收集流数据
- Collectors —— 汇总来自代理的数据
- Master—— 执行配置管理任务
- Flume 以 Avro Json 格式写数据。
- Agent 数据接收器是 Agent 数据源的目的地。
- Flume 数据源:
- Text —— 处理一次的文本文件,每次处理一行
- Tail —— 为加入文件的每行生产一个事件
- Multitail ——tail 工具支持多文件处理
- Syslogudp —— 处理 syslogUDP 消息
- syslogTcp —— 处理 sysLogTcp 消息
- execperiodic —— 任意命令定期执行,整个输出是一个事件
- execstream —— 执行任意指令,每行是一个独立事件
- exec —— 定期执行任意指令并确定整个输出的每行事件
- scribe —— 处理 scrive collection 系统生产的数据
- Collector 数据接收器支持多种事件输入格式:
- Syslog —— 输出类似 syslog 格式的事件
- Log4j —— 输出类似 Hadoop log4j 格式的事件
- avroJson—— 输出进过 Avro 编码的 json 格式的数据
- avrodata —— 输出经过 avro 二进制编码的数据
- debug —— 仅在调试时使用
- raw—— 只输出事件本身,不包含元数据
- spark 编程模型是弹性分布式数据集,他是 MapReduce 模型的扩展和延伸。
- RDD 记录血统,而不是真正数据。
- Spark 四类操作:
- 创建操作:用于 RDD 创建工作
- 转换操作:RDD 变换成新的 RDD
- 控制操作:RDD 持久化
- 行为操作:能够触发 spark 运行的操作
- 调度器安装 DAG 进行计算,并最终得到目标 RDD。
- RDD 模型将计算分解为多个相互独立的细粒度任务。
- Spark 中提供了通用接口来抽象每个 RDD
- 分区信息:它们是数据集的最小分片
- 依赖关系:指向其父 RDD
- 函数:基于 RDD 计算方法
- 划分策略和数据位置的元数据
- RDD 操作中用户可以使用 Partition 方法获取 RDD 划分的分区数。
- Spark 中 RDD 计算是以分区为单位的。
- Spark 默认连个划分器:哈希分区和范围分区。
- Hadoop 中的每一个 HDFS 数据块都称为一个 RDD 分区。
- Map/mapPartitions 作用每个元素,每个分区。
- Checkpoint 将切断与该 RDD 之前的依赖关系。
- Spark 基本概念:
- Application —— 用户编写的 spark 应用程序
- Driver ——application 的 main 创建 sparkContext
- Cluster manager —— 指在集群上获取资源的外部服务
- Standlone ——spark 原生的资源管理
- Hadoop YARN
- Worl —— 工作节点
- Master —— 总控进程
- Executor —— 执行进程
- Spark 定义了通信框架接口,这些接口实现中调用 netty 的具体方法。
- Shuffle 写有基于哈希和排序两种方式。
- Clustermanager 提供了资源的分配和管理。
- 资源分配和调度的基本单位是 container。
- 在 YARN 中,每个 application 实例都有一个 application master 进程。
- Application master 是 application 启动的第一个容器,它负责和 resourceManager 打交道并请求资源。
- Spark SQL 执行过程:
- 词法和语法解析
- 绑定
- 优化 4. 执行
- Spark 提供了两种方式将 RDD 转换成 DataFrame:
- 通过定义 case class ,使用反射推断 schema
- 通过编程接口,定义 schema,并应用到 RDD 上
- YARN 拆分 Jobtracker 的两大职责:资源管理,作业调度 / 监控:
- 全局的 resource Manager
- 每个应用对应的 Application Master
- Resource Manager 拥有为系统中的所有应用的资源分配的决定权。
- Container 为应用程序授予在特定主机上使用资源全权利。
- YARN 三种调度器:
- FIFO 调度器
- Capacity 调度器
- Fair 调度器
- Storm 一个 work 进程执行的是一个 topplpgy 的子集。
- Executor 是一个被 work 进程启动的单独线程。
- Work 之间通信是通过 Netty 进行通信的。
- Stream grouping:
- Shuffle —— 随机分组
- Fields —— 按字段分组
- All —— 广播发送
- Non —— 随机分配
- Diret —— 直接分组
- Task 是运行 spout 或 bolt 中的线程。
- Strom 的核心:
- 主节点 ——Nimbus
- 工作节点 ——supervisor
- 协调器 ——Zookeeper
- 工作进程 ——worker
- 任务线程 ——task
- Storm 三大应用:
- 信息流处理
- 持续计算
- 分布式远程调用
- 提交一个 Topology 之后,storm 创建 spout/bolt 实例 big 进行序列化。
- 流是一个分布式并行创建和处理的无界的连续元组。
- Storm 数据传输利用的是 zmq 开源的消息传递框架。
- Topology 是由 stream grouping 链接起来的 spout 和 bolt 节点网络。
- Tupe 可以理解成键值对,即 Fields 和 values。
- Tuple 的 asked,faild 都由 spout 发出并维护的。
- 本地模式:storm 用一个进程红的线程模拟所有 spout/bolt。
- Nimbus 和 supervisor 之间的通信依赖 Zookeeper 完成。
- 用户画像是一个实际用户的虚拟代表,如年龄,性别等。
- 在机器学习中,对象是指含有一组特征的行变量。
- 行变量的集合最容易构造的结构就是表。
- Hadoop 有三种令牌:
- 委托令牌
- 块访问令牌
- 作业令牌
- 对事物运动这种不确定性(随机性)的度量就是概率论。
- 大数据 4V:
- Volume —— 数据体量大
- Variety —— 数据类型繁多
- Velocity —— 处理速度快
- Value —— 商业价值高
- 移动互联网产生了和客户紧密拥绑的大数据。
- 在互联网这个产业链中,谁掌握了用户,谁的天下。
- 消费者的注意力和使用习惯去了哪里,钱就会流向哪里。
- 体验的产生是一个艺术的过程。
- 大数据的目标是定位。
- 建立一个学习型企业架构。