`
臻是二哥
  • 浏览: 190254 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
博客专栏
Group-logo
Java技术分享
浏览量:0
社区版块
存档分类
最新评论

大规模分布式系统架构与设计实战笔记1

阅读更多
好久没有写博客了,这段时间一直在读一本书《大规模分布式系统架构与设计实战》,这是淘宝千峰老师的作品,讲了一个分布式框架fourinone,我是吧这本书作为我走向分布式的启蒙老师的。
fourinone是一个分布式框架,它主要就是一种“包工头-职介所-工人”的结构,下面我们来说书中的一个例子,使用“并行计算实现上亿排序”。
对于上百G甚至上T的数据,这种数据量是巨大的,通常这些数据也无法在一台计算机上保存,这就使得数据本身就会分布在多个计算机上,即分布式存储。
现在假设我们有50G的无序数据等待排序,这50G的数据都是10万以内的数据。

当使用分布式计算时,首先我们获得10台计算机,这样每台计算机上有5G的数据,由于现在有10台计算机,因此我们考虑可以将所有的数据分成10组(正好对应10台计算机,第一台保存0~10000,第二台保存10000~20000,。。。,第十台保存90000~100000),然后每个计算机对自己的一组数据进行排序,但这样我们需要在分布式系统中有许多次的交互,因此我们想到可以想让每台计算机将自己的数据分成10组,然后再将对应的组发到对应的计算机上,这样,10台计算机之间有很好的并行性。

因此,最终我们的做法是“先在每台计算机上对数据进行分组,然后将数据合并到他们应该待得计算机上(比如每台计算机的第三组合并到第3台计算机上),最后,每台计算机上对自己的数据进行排序”,这样就实现了大规模数据的排序。当然对于分组时还可以行进行。
工人类的代码如下:
import com.fourinone.MigrantWorker;
import com.fourinone.WareHouse;
import com.fourinone.Workman;
import java.util.List;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Random;
import java.util.Collections;

public class SortWorker extends MigrantWorker
{
[color=red]//变量rammax,totalmax,total,rad用来生成需要排序的数据,[/color]
	private final int rammax;//1000000 排序数据的取值范围最大值
	private int totalmax;//排序数据的总量(每个工人)
	private int total = 0;//记录当前生成随机数据的数量
	private Random rad = new Random();


	private HashMap<Integer,List<Integer>> wharr = new HashMap<Integer,List<Integer>>();//用来数据信息,组别,以及包含的数字链表
	private int wknum=-1;
	private int index=-1;
	private Workman[] wms = null;

	public SortWorker(int totalmax, int rammax)
	{
		this.totalmax = totalmax;
		this.rammax = rammax;
	}
[color=red]//getNumber用来返回数字的所属于的组别以及数字本身[/color]
	
	public Integer[] getNumber()
	{
		if(total++<totalmax){
			int thenum = rad.nextInt(rammax);
			int numi = (thenum*wknum)/rammax;
			return new Integer[]{numi,thenum};
		}
		else return new Integer[]{-1,-1};
	}
		
	public WareHouse doTask(WareHouse wh)
	{

		int step = (Integer)wh.getObj("step");[color=red]//获取任务类别[/color]

		if(wms==null){
			wms = getWorkerAll();
			wknum = wms.length;
		}
		index = getSelfIndex();
		System.out.println("wknum:"+wknum+";step:"+step);
		WareHouse resultWh = new WareHouse("ok",1);
		
		if(step==1){
			Integer[] num = null;
			while(true){
				num = getNumber();
				if(num[0]!=-1){
					List<Integer> arr = wharr.get(num[0]);//取出该分类的list
					if(arr==null)
						arr = new ArrayList<Integer>();
					arr.add(num[1]);
					wharr.put(num[0], arr);
				}
				else break;
			}
		}else if(step==2){
			for(int i=0;i<wms.length;i++){
				if(i!=index&&wharr.containsKey(i)){
					List<Integer> othernum = wharr.remove(i);
										System.out.println(i+"-receive:"+wms[i].receive(new WareHouse(i, othernum)));//将不属于自己的分类发给其他工人
				}
			}
		}else if(step==3){
			List<Integer> curlist = wharr.get(index);
			Collections.sort(curlist);//对属于自己分类的数据进行内存内排序
			System.out.println(curlist);
			System.out.println(curlist.size());
			resultWh.setObj("total",curlist.size());
		}	
		return resultWh;
	}
	[color=red]//覆盖receive函数以实现系统节点之间的交互的功能[/color]
	protected boolean receive(WareHouse inhouse)
	{
		List<Integer> thisnum = wharr.get(index);
		thisnum.addAll((List<Integer>)inhouse.get(index));
		return true;
	}
	
	public static void main(String[] args)
	{
		SortWorker mw = new SortWorker(Integer.parseInt(args[2]),Integer.parseInt(args[3]));
		mw.waitWorking(args[0],Integer.parseInt(args[1]),"SortWorker");
	}
}

import com.fourinone.Contractor;
import com.fourinone.WareHouse;
import com.fourinone.WorkerLocal;
import java.util.Date;

public class SortCtor extends Contractor
{
	public WareHouse giveTask(WareHouse wh)
	{
		WorkerLocal[] wks = getWaitingWorkers("SortWorker");
		System.out.println("wks.length:"+wks.length+";"+wh);
		
		wh.setObj("step", 1);//1:group;
		doTaskBatch(wks, wh);
		
		wh.setObj("step", 2);//2:merge;
		doTaskBatch(wks, wh);
		
		wh.setObj("step", 3);//3:sort
		WareHouse[] hmarr = doTaskBatch(wks, wh);
		int total=0;
		for(int i=0;i<hmarr.length;i++){
			Object num = hmarr[i].getObj("total");
			if(num!=null)
				total+=(Integer)num;
		}
		wh.setObj("total",total);
		return wh;
	}
	
	public static void main(String[] args)
	{
		Contractor a = new SortCtor();
		WareHouse wh = new WareHouse();
		long begin = (new Date()).getTime();
		a.doProject(wh);
		long end = (new Date()).getTime();
		System.out.println("total:"+wh.getObj("total")+",time:"+(end-begin)/1000+"s");
	}
}
3
0
分享到:
评论

相关推荐

    构建JAVA大型分布式电商项目实战高并发集群分布式系统架构PDF+视频.rar

    本项目实战教程涵盖了高并发、集群以及分布式系统架构等关键知识点,旨在帮助Java架构师提升技能,实现高性能、高可用和可扩展的电商系统。 1. **Java基础与高级特性** - Java的基础语法、面向对象编程、异常处理...

    大规模分布式存储系统 : 原理解析与架构实战

    原来的PDF版有85M,过大。这个是epud版,只有6M,方便阅读和摘抄笔记。

    千锋《锋迷商城》项目学习笔记2-分布式与微服务

    本篇笔记将着重讨论分布式系统的概念、微服务架构的特点、分布式与微服务的关联,以及在Java环境下如何实践这一架构。 首先,分布式系统是由多个通过网络连接协同工作的计算机组成的系统,它们可以跨越多个物理位置...

    etcd实战及其原理分析.pdf

    etcd是一个基于Go语言构建的开源分布式键值存储系统,设计目标是为分布式系统提供强一致性的、高可用的配置共享和服务发现功能。它专注于提供可靠的分布式键值存储,使得在分布式环境中管理和共享关键数据变得简单。...

    基于golang的分布式百万级即时通讯系统.zip

    Go语言以其简洁的语法、高效的内存管理和强大的并发能力,特别适合构建高并发、高性能的分布式系统,如即时通讯系统。 在即时通讯系统中,主要涉及到以下几个关键技术点: 1. **并发处理**:Go语言的goroutine和...

    Doris实战笔记-be依赖包

    在IT行业中,数据库管理系统起着至关重要的作用,而Doris是一款高性能、分布式的数据仓库系统,专为在线分析处理(OLAP)设计。本篇将深入探讨Doris实战中的"BE"部分,以及与之相关的依赖包,特别是C++编程语言在...

    Kubernetes(k8s)2020版入门笔记和资料(尚).zip

    总之,Kubernetes是现代云原生架构的重要组成部分,它提供了强大的容器编排能力,帮助开发者和运维人员更高效地管理大规模分布式应用。通过深入学习和实践提供的资料,你将能够掌握这一关键技术,并在实际工作中发挥...

    redis3分布式集群部署

    ### Redis 3 分布式集群部署详解 #### 一、Redis 概述 Redis (Remote Dictionary Server) 是一...通过这种方式,不仅可以有效提升 Redis 的性能和可用性,还能满足大规模应用的需求。希望本文能为读者提供参考价值。

    项目讲义 SaaS平台.rar

    标题中的“项目讲义 SaaS平台.rar”表明这是一个关于SaaS(Software as a Service)平台的项目学习资料,其中可能涵盖了构建和管理SaaS...通过深入学习和实践,可以提升在构建大规模分布式系统和SaaS平台方面的技能。

    java全集资料共享网盘链接

    - **分布式系统**:深入理解分布式系统的特性,包括CAP理论、一致性哈希算法等,为解决大规模分布式系统问题提供思路。 ### 面试准备 - **Java架构面试专题汇总**:收集常见的Java架构面试题目及答案,帮助求职者...

    Dubbo入门到精通架构高级课程(视频+课件+源码)

    【Dubbo入门到精通架构高级课程】是一门深入解析Dubbo框架...通过这个全面的课程,无论你是初涉分布式系统的开发者还是寻求提升的Java工程师,都将能够熟练掌握Dubbo的使用,并具备构建和维护大规模分布式服务的能力。

    hadoopprocessing-ma开发笔记

    1. **Hadoop基础**:介绍Hadoop的基本概念,包括其设计目标、架构和工作原理,以及HDFS的分布式文件存储机制。 2. **MapReduce编程**:讲解MapReduce模型的工作流程,如何编写Map和Reduce函数,以及如何处理键值对...

    华为工程师总结的笔记.docx

    3. **CentOS Linux系统管理**:涵盖CentOS的日常管理,包括系统启动与关机、用户环境设置、文件系统管理等。 4. **Linux必备命令**:这是Linux操作的核心,学习如cd、ls、mkdir、rm等基本命令,以及管道、重定向等...

    SSM实战项目——Java高并发秒杀API,详细流程+学习笔记

    5. **读写分离与分库分表**:对于大规模的秒杀系统,可能需要对数据库进行读写分离和水平扩展,通过分库分表策略减轻单库压力。 6. **数据库优化**:使用索引优化查询效率,设计合理的数据模型,减少join操作,避免...

    hadoop学习笔记

    2. MapReduce:并行计算模型,将大规模数据处理任务分解为“映射”(map)和“化简”(reduce)两个阶段,实现数据的分布式处理。 二、Hadoop架构 Hadoop架构包含NameNode、DataNode、JobTracker和TaskTracker等关键...

    互联网框架笔记.zip

    通过这些文件,我们可以学习到构建和优化大规模互联网应用所需的关键技能,包括但不限于项目管理、Web开发框架、数据库设计、分布式缓存、搜索引擎和消息队列等。这些知识对于理解现代互联网架构和提升开发效率至关...

    2020年springcloud alibaba课程源码.zip

    SpringCloud Alibaba是阿里巴巴提供的微服务解决方案,它包含了一系列在分布式系统开发中常用的服务治理组件,如服务注册与发现、配置中心、熔断器...通过深入学习和实践,你将具备构建和维护大规模分布式系统的能力。

    hadoop学习笔记.rar

    HDFS提供了一个高容错、高吞吐量的数据存储系统,而MapReduce则是用于处理和生成大规模数据集的编程模型。 二、Hadoop学习笔记之五:使用Eclipse插件 Eclipse插件是开发Hadoop应用的重要工具,它提供了集成的开发...

Global site tag (gtag.js) - Google Analytics