Jamzy Wang

life is a struggle,be willing to do,be happy to bear~~~

Hadoop HDFS 详解

2015-07-24 21:49

原创声明:本作品采用知识共享署名-非商业性使用 3.0 版本许可协议进行许可,欢迎转载,演绎,但是必须保留本文的署名(包含链接),且不得用于商业目的。

HDFS 架构

HDFS是Hadoop应用中一个最主要的分布式存储系统。一个HDFS集群主要由一个 NameNode ,一个Secondary NameNode 和很多个 Datanode 组成:Namenode管理文件系统的元数据,而Datanode存储了实际的数据。客户端通过Namenode以获取文件的元数据或修饰属性,而真正的文件I/O操作是直接和Datanode进行交互的。

此处输入图片的描述

如何选择并发友好的数据结构

2015-07-22 20:54

原创声明:本作品采用知识共享署名-非商业性使用 3.0 版本许可协议进行许可,欢迎转载,演绎,但是必须保留本文的署名(包含链接),且不得用于商业目的。

最近看到了这篇文章—— Choose Concurrency-Friendly Data Structures ,这篇文章阐述了如何在并发场景下选择合适的数据结构,在此做个简单总结。

在一般的应用场景下,选择一个合适的数据结构主要考虑两方面,即时间复杂度和空间复杂度(包括内存读取相关因素如内存消耗,空间局部性等)。 但是,在并发场景下还需要额外考虑两个因素:

  • 代码能否被多个线程同时使用

某个数据结构是否允许不同线程同时读/写该数据结构的不同部分。若不允许,则需要对整个数据结构加锁,除了允许一个线程进行读写外其他线程都将被阻塞。

  • 并发下线程同步的最小代价

某个数据结构在被某个线程更新后需要对内存进行多大区域的更新才能让其他线程知道数据结构已经发生了变化。

上述两个因素归结起来就是考虑一个问题:某个数据结构是否允许局部更新。 如果某个数据结构局部区域的更新会阻塞这个数据结构其他区域的读写,那么这种数据结构就“lose locality”,也就是说这个数据结构的其他区域也需要被加锁,所有对内存的更新需要同步给所有线程。

作者以Linked Lists和Balanced Search Trees为例阐述这种局部更新对并发的影响。Linked Lists的许多操作如插入,删除节点只会影响插入位置前后两个节点,一个线程在对某个节点进入插入和删除操作时只需要对它会影响到的节点进行加锁,其他不受影响的节点可以同时被其他线程进行操作。Balanced Search Trees则不然,因为节点的插入和删除会导致整棵树的重构,因而多个线程不能同时处理。

高可用性redis集群方案

2015-05-24 18:56

原创声明:本作品采用知识共享署名-非商业性使用 3.0 版本许可协议进行许可,欢迎转载,演绎,但是必须保留本文的署名(包含链接),且不得用于商业目的。

高可用性redis集群方案:

HAProxy(keepalived) + Twemproxy + redis-twemproxy-agent(NodeJS) + redis sentinel

此处输入图片的描述图源

此处输入图片的描述

  • HAProxy:对多个twemproxy做负载均衡, 同时也保证twemproxy不会出现单点故障
  • keepalived:负责虚拟IP和高可用,保证HAProxy的单点故障
  • redis sentinel:监控master的状态,当master发生故障时执行故障迁移,用选取一个slave替代master
  • redis-twemproxy-agent(NodeJS):监听redissentinel的变更事件,修改twemproxy的配置,并重启twemproxy(twemproxy不支持平滑操作)。

Hadoop Map/Reduce执行流程详解

2015-05-19 21:40

原创声明:本作品采用知识共享署名-非商业性使用 3.0 版本许可协议进行许可,欢迎转载,演绎,但是必须保留本文的署名(包含链接),且不得用于商业目的。

一个Map/Reduce 作业(job) 通常会把输入的数据(input file)切分为若干独立的数据块(splits),然后由 map任务(task)以完全并行的方式处理它们。Map/Reduce框架会对map的输出做一个 Shuffle 操作,Shuffle 操作的后的结果会输入给reduce任务。整个Map/Reduce框架负责任务的调度和监控,以及重新执行已经失败的任务。

此处输入图片的描述

[转]General Purpose Hash Function Algorithms

2015-05-15 12:19


Description

Hash functions are by definition and implementation pseudo random number generators (PRNG). From this generalization its generally accepted that the performance of hash functions and also comparisons between hash functions can be achieved by treating hash function as PRNGs.

Analysis techniques such a Poisson distribution can be used to analyze the collision rates of different hash functions for different groups of data. In general there is a theoretical hash function known as the perfect hash function for any group of data. The perfect hash function by definition states that no collisions will occur meaning no repeating hash values will arise from different elements of the group. In reality its very difficult to find a perfect hash function and the practical applications of perfect hashing and its variant minimal perfect hashing are quite limited. In practice it is generally recognized that a perfect hash function is the hash function that produces the least amount of collisions for a particular set of data.