分布式,应该分布运算还是应该分布数据?

假如有一项工作,要多步完成,每部都要处理数据并将处理后的数据给下一步处理,假如遇到如下情况
1 数据量很大
2 每一步的操作都很繁琐耗时
那么可以采用分布式体系来完整这个任务以提高效率

举例"一个有100万行的Excel表格,将每行数据读出来封装成一个实体,持久化到数据库中"

那么有两种可能的方案:

1 网络节点分布运算,第一台主机负责从Excel读取数据,并封装成Entity,第二个主机负责将Entity持久化到数据库中.两台主机用消息机制传输,主机1每生成一个Entity,就发送一次,不需要得到主机2持久化完成的信息才继续发第二个.

优点:容易控制事务,倘若100万条数据是一个整体,任何一个数据出错都应该回滚,那么所有持久化操作都在主机2上完成,主机2可以集中做事务控制.
缺点:无法拓展,无法根据未来数据变化而拓展,因为节点随着操作步骤而定,步骤一定节点数量一定.

2 网络节点分布数据,每一台主机都部署相同的操作,然后每台主机分布一定数量的数据,比如5台,每台负责20万条.

优点:可以根据现实情况灵活扩展,比如你觉得每台20万条慢,那么在加5台,调整到每台10万条,直到满意为止..
缺点:数据难以控制,如果100万是一个整体,一个主机失败,其他主机不知道,还有可能不同主机插入相同数据的错误操作.

我知道很多互联网应用采用第二种形势,比如MapReuse
[该贴被admin于2009-03-16 12:30修改过]

其实就是读写问题,没有复杂业务,那么采取第2种:
开源软件Apache Hadoop;Hadoop可以在209秒内完成1 TB数据排序,打败了前期297秒的年度记录(Daytona),成为最快纪录冠军,这是一项1998由Jim Gray创建的基准测试,指定输入数据( 100亿个100字节的记录) ,彻底地排序,并写入磁盘(持久化)。

Hadoop听说是对集群支持的好,按说java语言单体计算能力肯定不如其他底层语言,但是处于集群支撑的好,可以方便拓展结点提升运算能力,209秒,没有庞大服务器群做不了这个试验,分布式程序也成了"不是一般程序员玩得起的游戏"