自己写分布式处理程序

2018/09/01
在学习大数据处理程序的过程中,第一想法就是利用hadoop来完成任务,不过很多细节还是不太理解。
具体可以看《Hadoop in Action》p11页。
我想从自身的处理经验出发,从最开始的单机处理模式,扩展到相应的分布式框架,看看这其中的细节都是如何实现的。这部分内容还是以最经典的wordcount为例。
1、单机单线程处理流程
以"I want to handle a simple hello world"为例。
伪代码是:

def wordArray as HashTable
for item in seqences
  wordArray[item]++
endfor

这样之后就是最简单的一个流程,也是如果分发到其他机器上的样例代码。
2、单机多线程处理流程
在研究过程中,发现单个线程处理的速度比较慢,为了更好的利用计算机的资源,采用多线程的机制。
多线程的情况下,如果是直接读取文件,可以利用队列的形式。
然后各个线程从队列中取数据,在处理完成之后,直接将多个线程的数据整合在一起。
伪代码:

Phrase One:

Read item from Queue
  wordArrayThread[item]++
End
Phrase Two:
Read item from wordArrayThread[item]++
  wordArray[item]++
End

这种流程呢,可能的瓶颈在于队列的锁,以及最后合并整个哈希表的过程中。
而且如果是单机的内存和存储都足够的话,那么这样的模式还不如单机单线程的模式。

优化的方法可以是,事先将文件切割好。
所以说其实多线程来看并不一定就非常的提高效率,毕竟这个是计算密集的,大部分时间都是在进行相应的运算。

3、硬盘哈希版本
对于大数据量的情况下,单台机器的硬盘存储不成问题,但是哈希表满足不了了,内存装不下了,所以需要将哈希表搞到硬盘上。
英文名叫做disk-based hash table
转载:https://metarabbit.wordpress.com/2017/06/30/ann-diskhash-disk-based-persistent-hash-tables/

这个在算法中,应该算是空间复杂度。

其实到了这个阶段,如果是把数据哈希到硬盘的文件中,这个已经能够超过了我的理解,因为我平时的工作就仅限于哈希表存与内存中。如果有机会,还是要对哈希表进行很深入的学习。作为一种高效的查找数据结构,不论是数据库也好,缓存也好,都有非常高的应用。
最开始知道这种形式的时候,也是一个大数据的处理程序的文章中看到的,起因也是因为内存不够了,只能将这部分内容存储到硬盘硬盘中。当然这里面肯定还要涉及到的一个哈希表,用来存储像一个你的各个文件的查找过程。
这部分的话,最终肯定会设计很多的代码来维护这个基于硬盘的哈希表。比如,每个哈希表的大小等一些元数据,用来加速整个程序的性能。(具体的内容后续深入理解)
4、多机处理1
如果单机硬盘不够了,只能利用多机的处理方式。
(书中并没有因为这个原因,而是说想利用多机的性能)
依然这种形式也是需要两个阶段,上面多线程处理一样。

这里同样引入了一些问题。
1)如果一大批数据都存储在同一个机器上,那么在任务开始前,会有大量的时间浪费在这个传输文件上。[这就需要一个分布式文件处理系统本身就能够把这个文件分布好。]
2)最后如果只有一个机器在处理整合部分,这样的话,整个压力同样最后落在最后一台机器上,那么这个部分也需要做成分布式,但如果文件内容比较多,那这台机器是不是先把已经处理好的数据存储到硬盘上。
3)这些协调任务的过程,怎么编码,或者说怎么写程序保证,每台机器都没有任务失败,即使失败了仍然能继续运行。
4)这个例子里好像对任务的排序并不敏感,如果是敏感的话,怎么保证这些个机器最后合并的时候能按顺序合并。[shuffle阶段]
5、多机处理2
为了使得最后的整合过程也按照分布式的形式运行。
需要把各个数据在传输到整个的机器时,就进行一次哈希,最后保证同样的开头字母也好,整体的哈希值也好,能进入到同一台机器。

整体上就是这些内容。

几个整合的要素

(书上引出的重点)
上面也是我自己弄得时候感觉比较重要的点,更加重要的是,如果某台机器的任务失败了怎么办。


对于一个分布式系统,要考虑的事情很多。
转载:http://www.hpcs.cs.tsukuba.ac.jp/~tatebe/lecture/h23/dsys/dsd-tutorial.html
主要看前面的,分布式系统的设计原则,后面的可以略过。


Hadoop作为基本上把这些点都覆盖了,学中他的精髓, 也就找到了分布式系统的概要。

特别是,比较重要的几个点:
分布式文件系统(HDFS), 分布式处理框架(mapreduce),分布式任务调度(yarn)。这些点应该就算是最重要的。
所以你说,要自己设计一个分布式的处理系统到底有多难。
自己一个人,想我这种软件工程都没学过的,估计就跟登天一样。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值