Shuffle and combiner

keep foolish, keep sharp
处理Cas service ticket
一个服务票据是由一串加密的票证字符串组成, 服务票据是用户的浏览器通过Cas Server 认证后, 通过HTTP Redirect 到资源服务器中, 而服务票据是通过其中的请求参数中获取到的。
过滤器监视着Service URL 以致于它可以接收到服务票据并进行处理,The CAS server knows which service URL to use via the ServiceProperties.getService() method。
Processing the service ticket involves creating a UsernamePasswordAuthenticationToken(the principal and the opaque ticket string as the credentials) which uses CAS_STATEFUL_IDENTIFIER for the principal and the opaque ticket string as the credentials.(通过服务票据生成 UsernamePasswordAuthenticationToken)
The configured AuthenticationManager is expected to provide a provider that can recognise UsernamePasswordAuthenticationTokens containing this special principal name, and process them accordingly by validation with the CAS server.(通过AuthenticationManager 依据Cas server 来处理识别该证书)
1 | @RequestMapping(value = "/params", method=RequestMethod.GET) |
当Spring发现这个参数时,Spring会自动的根据request的参数来组装该pageable对象,Spring支持的request参数如下:
1 | @RequestMapping(value = "", method=RequestMethod.GET) |
元注解的作用在于: 负责注解其它注解。
@Target 说明了Annotation 所修饰的对象的范围, 使用枚举类ElementType 来指定。
1 | public enum ElementType { |
云计算是分布式计算、并行计算、效用计算、网络存储、虚拟化、负载均衡等计算机和网络技术发展融合的产物。
云计算主要包括3种类型: IaaS、PaaS 和SaaS。
云数据库是部署和虚拟化在云计算环境中的数据库。
思想: 分而治之, 把一个大的数据块拆分为多个小的数据块在不同的机器上并行处理。
典型的NoSQL 数据库通常包括键值数据库、列族数据库、文档数据库和图数据库。

键值数据库会使用一个哈希表, 这个表有一个特定的Key 和一个指定特定的Value。
键值数据库可以划分为内存键值数据库和持久化键值数据库。
弱点: 条件查询、多表查询, 不支持回滚, 无法支持事务。
HBase 是BigTable的开源实现, 高可靠、高性能、面向列、可伸缩的分布式数据库, 主要用来存储非结构化数据和半结构化的松散数据, HBase支持超大规模数据存储, 可以通过水平扩展的方式, 利用廉价计算机集群处理超过10亿行数据和数百位列组成的数据表。
BigTable是一个分布式存储系统, 利用谷歌提出的MapReduce分布式并行计算模型来处理海量初级, 利用GFS作为底层数据存储, 并采用Chubby提供协同服务管理, 可以扩展到PB级别的数据和上千台机器。
集群中的计算机结点存放在机架上, 每个机架可以存放8-64个结点, 同一个机架上的不同节点通过网络互联, 多个不同机架之间采用另一级网络或交换机互联。

分布式文件系统在物理结构上是由计算机集群中的多个节点构成的, 这些节点分为两类:
在读取数据时, 客户端从名称节点获取数据节点和文件块的映射关系, 然后就可以到相应位置访问文件块。
数据节点也要根据名称节点的命令创建、删除数据块和冗余复制。
为了保证数据的完整性, 分布式文件系统通常采用多副本存储, 文件块会被复制为多个副本, 存储在不同的节点上, 而且存储同一个文件块的不同副本的各个节点会分布在不同机架上, 这样, 在单个节点出现故障时, 就可以快速调用副本重启单个节点上的计算过程, 而不用重启整个计算过程。
分布式文件系统是针对大规模数据存储而设计的(TB级别), 规模过小会影响性能。

在传统的文件系统中,为了提高磁盘的读写效率, 一般以数据块为单位, 而不是以字节为单位。
HDFS也采用了块的概念, 默认一个块大小是64MB, 在HDFS中的文件会被拆分成多个块, 每个块作为独立的单元进行存储。
HDFS在块的大小设计明显大于普通文件系统, 为的是最小化寻址开销(磁盘寻道开销和数据块定位开销)
通常MapReduce中的Map任务一次只处理一个块中中的数据
HDFS采用抽象块概念可以带来几个好处:
在名称节点(NameNode)中, 负责管理分布式文件系统的命名空间(Namespace), 保存了两个核心的数据结构, 即FsImage和EditLog。
名称节点记录了每个文件各个块所在的数据节点的位置信息, 但是不会持久化保存这些数据, 而是在系统每次启动时, 扫描所有数据节点然后重构这些信息。
名称节点启动时会处于安全模式, 对外只提供读操作。
名称节点在启动时, 会将FsImage加载到内存中, 然后执行EditLog文件中的各项操作, 使得内存中的元数据保持最新, 然后创建一个新的FsImage和空的EditLog文件, 名称节点启动成功之后进入正常运行状态, HDFS中的更新操作都会写入EditLog中, 而不是直接写入FsImage中, 因为在分布式文件系统中, FsImage都十分庞大, 如果每次的更新都往FsImage里面添加, 会带来十分大的系统开销, 而Editlog十分小, 写入操作是十分高效的。

数据节点(DataNode)是分布式文件系统HDFS的工作节点, 负责数据的存储和读取, 会根据客户端或者名称节点的调度来进行数据的存储和检索, 并向名称节点定期发送自己所存储的块列表。
在名称节点运行期间, HDFS会不断发生更新操作, 会使EditLog文件逐渐变大, 当名称节点重启时, 需要逐条执行EditLog的记录, 这个过程就会变得十分缓慢。
为了解决这个问题, HDFS采用第二名称节点(Secondary NameNode), 来完成合并EditLog与FsImage的合并操作, 减少EditLog的文件大小, 缩短名称节点重启时间

HDFS 采用主/从结构模型, 一个HDFS集群包括一个名称节点和若干个数据节点。
名称节点是中心服务器, 负责管理文件系统的命名空间以及客户端对文件的访问。
集群中的数据节点一般是一个节点运行一个数据节点进程, 负责处理文件系统客户端的读写请求, 在名称节点的统一调度之下进行数据块的创建、删除和复制等操作,每个数据节点的数据是保存在本地Linux文件系统中的, 每个数据节点会周期性地向名称节点发送“心跳”信息, 报告自己的状态, 对于没有按时发送心跳信息的数据结构会被标记为死机, 不会在给它分配任务。
用户在使用HDFS时, 仍然可以像普通文件系统那样, 使用文件名去存储和访问文件, 在系统内部, HDFS会将一个文件切分为若干个数据块, 这些数据块会被分布存储到若干个数据节点上。
访问流程:客户端访问文件, 将文件名发送给名称节点->名称节点根据文件名查找到对应的数据块->根据数据块信息找到数据节点的位置-> 把数据节点的位置发送给客户端->客户端直接访问数据节点获取数据信息

RPC
Shell and Java API
作为分布式文件系统, 为了保证系统的容错性和可用性, HDFS采用了多副本方式对数据进行冗余存储, 通过一个数据块的多个副本会被分布到不同的数据节点上。
好处:
数据存放:HDFS采用机架为基础的数据存放策略, HDFS默认的冗余复制因子是3, 每一个文件块会被同时保存到3个地方, 其中, 有两份副本放在同一个机架上的不同机器上, 第三个副本放在不同机架的机器上。
数据读取
数据复制
名称节点出错
数据节点出错
数据出错
由于网络传输和磁盘错误等因素造成的数据错误。
Hadoop 是一个开源的、可运行于大规模集群上的分布式计算平台, 实现了MapReduce计算模型和分布式文件系统HDFS等功能
Hadoop的核心是分布式文件系统HDFS和MapReduce, HDFS是针对谷歌GFS的开源实现, 是面向普通硬件环境的分布式文件系统, 具有支持大规模数据的分布式存储。
MapReduce允许用户在不了解分布式系统底层细节的情况下开发并行应用程序, 整合分布式文件系统上的数据, 保证分析和处理数据的高效性。