首页 文章 精选 留言 我的

精选列表

搜索[计算机组成原理],共10000篇文章
优秀的个人博客,低调大师

linux系统分区原理

windows系统 如图: 概念: 硬盘本身并不存在分区的说法,分区是操作系统的逻辑概念。 1、挂载:操作系统目录 与 硬盘分区建立联系的过程。 2、挂载点,被挂载的操作系统目录 就是挂载点 例如:C/D/E 等目录 3.、挂载类型:自动、手动 windows系统的挂载类型都是自动的 4、根目录:有多个(C/D/E等都是) 5、文件占据磁盘空间 各自挂载点目录下文件占据对应挂载点本身的磁盘空间 Linux系统 如图: 1、 挂载:操作系统目录 与 硬盘分区建立联系的过程。 2、 挂载点:被挂载的操作系统目录 就是挂载点 例如: /根目录、/Efile目录、/Cfile目录、/video目录 3、挂载类型:自动、手动 自动:系统安装创建的挂载点,后期使用会自动与硬盘分区建立联系。 手动:系统运行过程中,临时添加的U盘、移动硬盘不会被系统应用起来,需要手动创建一个文件目录并使其与该硬件进行联系挂载。 4、根目录:只有一个,名称是“/”根目录 5、 文件占据分区空间:会占据与其上边挨着最近挂载点对应的分区空间 6、与新硬件形成联系挂载 ① 把挂载点目录内部的旧的文件释放出去 ② 再进行挂载操作 7、文件存储占用空间 Dfile,/file根目录,存储的资源占用的是根目录的空间 viedo目录,Efile目录,Cfile目录,/根目录存储的资源占各自挂载所在的空间资源。

优秀的个人博客,低调大师

Docker(一)Docker基础原理

1 2 3 4 一、虚拟化技术分类 二、容器基础概念 三、Docker入门 四、docker层级概念 一、虚拟化技术分类 1.传统虚拟化Xen或者Kvm [vm.user] [vm.kern]....//这种虚拟化技术隔离效果最好,但是性能消耗也高 =========== VMM ====== 硬件 vm的user进程需要发起system call的时候,需要调用vm.kernel但是真正执行的是host.kernel 使用BT,或者HVM,加速转换。 内存虚拟化:shadow MMU CPU虚拟化:tagged TLB 2.容器技术: lxc:linux container openvz: [us1][us2].... //userspace,用户空间进行隔离,这就是一个容器 =========== kernel =========== 硬件 xen或者kvm隔离效果比较好, 容器技术:隔离的是user space 3.库虚拟化: wine cywin 4.应用级别虚拟化: jvm ... 二、容器基础概念: CGroup + NameSpace + AUFS 1.容器虚拟化依赖到的NS:name space pstree: PID 1:用户和内核交互的进程 假如us1中的进程,需要使用root权限和内核交互,它是否能够看到id号为1的进程,并且各us又是隔离的? yum -y install psmisc //安装该包 内核级别,环境隔离;类似chroot机制 PID NameSpace: kernel 2.6.24虚拟出各种pid,每一个用户空间都可以虚拟一个pid为1的进程 PID隔离 Network NameSpace: kernel 2.6.29 实现网络隔离 网路设备,网络栈,端口号等网络资源隔离 User NameSpace:用户隔离,每一个userspace可有同样的用户名的用户 用户和yoghurt组资源隔离,kernel 3.8 + IPC NameSpace:进程间通信 kernel 2.6.79 信号量,消息队列和共享内存等隔离 UTS NameSpace: kernel 2.6.19 主机名和域名的隔离 Mount NameSpace: us1能看到的fs一定是自己能够看到的fs,us2挂载的专有设备,fs是us1不能看到的 挂载点隔离(FS)隔离;kernel 2.4.19 为了对不同namespace访问 API:clone(),setns(),unshare(); clone:实现线程的系统调用,来实现新线程的。 setns:设定namespace的属性,假如某个进程到某个NS unshare:非共享机制,进程脱离一个NS,关联到另一个NS 查看: mount //可以查看挂载情况 lssubsys -m //查看各个名称空间的挂载情况 2.各容器的资源限制:CGroup 一个NS一个占用整个 userspace 的100%,其他NS就没资源用了 因此CGroup CGroup: linux control group:控制组 内核级别:限制,控制与一个进程组群的资源; 可以限制:内存,cpu等 kernel 2.6.24 收入内核 资源:CPU,内存,IO CGroup的功能: Resource limitation:资源限制 Prioritization:优先级控制;哪一个NS更优先获得CPU和资源 Account:统计和审计,主要为了计费 Control:挂起和恢复 进程 /sys/fs/cgroup 进程启用在哪里,代表只能使用多少资源 倒置的树状结构。 每一资源都是一棵树,cpu是一个,内存是一个,io也是一个,..也可以内存和cpu一棵树 还有其他很多的资源等。有的是重合的,有的是独立的。 术语集: task(任务):cgroups的术语中,task就表示系统的一个进程。 cgroup(控制组):cgroups 中的资源控制都以cgroup为单位实现。cgroup表示按某种资源控制标准划分而成的任务组,包含一个或多个子系统。 一个任务可以加入某个cgroup,也可以从某个cgroup迁移到另外一个cgroup。 subsystem(子系统):cgroups中的subsystem就是一个资源调度控制器(Resource Controller)。比如CPU子系统可以控制CPU时间分配,内存子系统可以限制cgroup内存使用量。 hierarchy(层级树):hierarchy由一系列cgroup以一个树状结构排列而成, 每个hierarchy通过绑定对应的subsystem进行资源调度。 hierarchy中的cgroup节点可以包含零或多个子节点,子节点继承父节点的属性。 整个系统可以有多个hierarchy。 [C,C,C,C] //CPU [16G] //内存 [io....] //io等其他资源 [c][c][c,c] [2G][2G][12G] //上级可以使用所属的所有资源 / \ [c][c] [4G][8G] CGroup的子系统(subsystem): blkio// 块设备的io资源分配,disk cpu //设定cpu的限制 ,仅能使用40% cpuacct //报告cgroup中所使用的cpu资源 cpuset //为cgroup中的任务分配cpu和内存资源, 分配你使用哪一个cpu 和memory,分配可以分配整个 memory //设定内存的使用限制 限制内存使用的空间,例如分配的是1个核心,但是仅运行使用40% devices //控制cgroup中的任务对设备的访问; freezer //挂起和回复cgroup中的任务; net_cls(classid),使用等级级别标识符来标记网络数据包,以实现基于tc完成对不同的cgroup中产生的流量的控制; perf_event:使用后使cgroup中的任务可以进行统一的性能测试 hugetlb;大的tlb,大内存页,hugetlb让大内存页提高命中率,对HugeTLB系统进行限制; Cgroup的通俗术语: task:任务,进程或线程 cgroup:一个独立的资源控制单位,可以包含一个或多个子系统 subsystem:子系统, hierarchy: 层级,可以再次划分。 一个子系统可以附加到多个层级//例如一个cpu可以在多个层级上附加 3.AUFS: union FS Union FS:它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下 Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像) 另外,不同 Docker 容器就可以共享一些基础的文件系统层,同时再加上自己独有的改动层,大大提高了存储的效率 UnionFS:把不同的物理位置的目录,合并到同一个目录中 假如有两个文件或者目录名一样? 叠加:先后顺序,最前面的才是可写的 AUFS:Another UnionFS 、Alternative UFS、Advanced UFS 但是AUFS不是内核的版本,但是ubuntu是没有的, Docker 依赖于AUFS,用于提高性能 Docker目前支持的 Union 文件系统种类包括 AUFS, btrfs, vfs 和 DeviceMapper 原因: 之前复制bin,sbin等程序到一个目录中,chroot后可以执行 ns1和ns2一个需要ls,一个需要cat命令,但是ls和cat命令有重复使用的库,可以把该库做成一个联合库(只读) 可以把公共部分做成一个目录,ns1只放ls独有的,ns2只放cat独有的,用ls或者cat独有的联合底层公共的库即可 目的:减少disk占用 centos 不支持AUFS但是支持UNIONFS//UNIONFS没有AUFS强悍 还有另外一种方案:Device mapper 4.Device Mapper: 多系统机制 md:multi disks http://www.tldp.org/HOWTO/Multi-Disk-HOWTO-1.html dm:device mapper Kernel 2.6 引入的最重要的技术之一,用于在内核中支持逻辑卷管理的通用设备的映射机制; 从逻辑设备到物理设备的映射框架机制,在该机制下,用户可以很方便的根据自己的需要制定实现存储资源的管理策略, 当前比较流行的 Linux 下的逻辑卷管理器如 LVM2(Linux Volume Manager 2 version) EVMS(Enterprise Volume Management System) dmraid(Device Mapper Raid Tool)等都是基于该机制实现的。 它包含三个重要的对象概念,mapped device、映射表、target device mapped device:可以理解成为内核向外提供的逻辑设备,它通过映射表描述的映射关系和 target device 建立映射 target device:逻辑设备映射到的一个物理设备 https://www.ibm.com/developerworks/cn/linux/l-devmapper/ 为底层块设备提供抽象设备, Mapped Device:映射的设备 Mapping table:虚拟设备到物理设备的映射 Target Device:被映射的设备 lVM就依赖于device mapper机制。但是不建议device mapper在docker技术中使用,因为有诸多不稳定性。 三、Docker入门: 程序的发布,需要依赖各种环境 一个docker中应该运行几个程序?只能运行一个应用程序? docker容器是为单一目的而实现的,为一个应用程序而实现的 LAMP:基于docker,要启用是三个容器,http,php,mysql 三者之间进行通信即可 //其实是可以把LAMP坐在一个容器内部的 [] ===================== [kernel] [hardware] 运行了三个Nginx容器 第一个cn(conainer) 使用80port,第二个cn也是用80 port,但是内核之有一个80端口 方法:映射, kernel: 8080 -> cn2.80 kernle: 888 -> cn1.80 ... 容器启动:创建,关闭:删除 //基于某个cn创建的文件没有了怎么办?让数据持久化 按需创建,运行在容器云环境,n个物理节点 [cn1] //cn1第一次启动在host1上,第二次可能启动在host2上 ======================== //资源抽象层 host1,host2,........... //物理主机 //容器的路径映射 \\\ ======================= 云存储//数据持久化 //容器使用的路径,关联到容器云的某个路径,保存数据。容器关联到该路径即可访问原有的数据 volume 技术:实现数据持久化,可以进行实时迁移 Docker的核心概念:2013,Go,apache 2.0协议 C/S架构 Docker client:发起请求的node docker server:容器运行的node, docCloud公司研发 https://www.docker.com/ ========================= dockerfiles[dockerHUB] \ / [images] \ \[backup] 【containers】 ============= linux OS ============================== 启动docker容器,需要加载images,server从dockerHUB上下载images 把所依赖到的多个images,叠加为一个UnionFS,然后在该容器中运行 可以从公共dockerhub下载,也可以自制 可以共享让别人访问。 可以创建私有hub dockerfile:创建dockerfile 创建docker映像文件。 四、docker层级概念 Linux内核是第0层-->Docker镜像,是一个只读的镜像,位于第1层,它不能被修改或不能保存状态。 一个Docker镜像可以构建于另一个Docker镜像之上,这种层叠关系可以是多层的。 第1层的镜像层我们称之为基础镜像(Base Image),其他层的镜像(除了最顶层)我们称之为父层镜像(Parent Image)。 这些镜像继承了他们的父层镜像的所有属性和设置,并在Dockerfile中添加了自己的配置。 Docker镜像通过镜像ID进行识别。镜像ID是一个64字符的十六进制的字符串。 但是当我们运行镜像时,通常我们不会使用镜像ID来引用镜像,而是使用镜像名来引用。 可以用同一个镜像启动多个Docker容器,这些容器启动后都是活动的,彼此还是相互隔离的。对其中一个容器所做的变更只会局限于那个容器本身。 附件1:进程间通信常用的方式: C方法包括管道(PIPE)、消息排队、旗语、共用内存以及套接字(Socket) 本文转自MT_IT51CTO博客,原文链接:http://blog.51cto.com/hmtk520/1946339,如需转载请自行联系原作者

优秀的个人博客,低调大师

MAPREDUCE原理篇(2)

3.1mapreduce的shuffle机制 3.1.1概述: vmapreduce中,map阶段处理的数据如何传递给reduce阶段,是mapreduce框架中最关键的一个流程,这个流程就叫shuffle; vshuffle:洗牌、发牌——(核心机制:数据分区,排序,缓存); v具体来说:就是将maptask输出的处理结果数据,分发给reducetask,并在分发的过程中,对数据按key进行了分区和排序; 3.1.2主要流程: Shuffle缓存流程: shuffle是MR处理流程中的一个过程,它的每一个处理步骤是分散在各个map task和reduce task节点上完成的,整体来看,分为3个操作: 1、分区partition 2、Sort根据key排序 3、Combiner进行局部value的合并 3.1.3详细流程 1、maptask收集我们的map()方法输出的kv对,放到内存缓冲区中 2、从内存缓冲区不断溢出本地磁盘文件,可能会溢出多个文件 3、多个溢出文件会被合并成大的溢出文件 4、在溢出过程中,及合并的过程中,都要调用partitoner进行分组和针对key进行排序 5、reducetask根据自己的分区号,去各个maptask机器上取相应的结果分区数据 6、reducetask会取到同一个分区的来自不同maptask的结果文件,reducetask会将这些文件再进行合并(归并排序) 7、合并成大文件后,shuffle的过程也就结束了,后面进入reducetask的逻辑运算过程(从文件中取出一个一个的键值对group,调用用户自定义的reduce()方法) Shuffle中的缓冲区大小会影响到mapreduce程序的执行效率,原则上说,缓冲区越大,磁盘io的次数越少,执行速度就越快 缓冲区的大小可以通过参数调整, 参数:io.sort.mb 默认100M 3.1.4详细流程示意图 3.2. MAPREDUCE中的序列化 3.2.1概述 Java的序列化是一个重量级序列化框架(Serializable),一个对象被序列化后,会附带很多额外的信息(各种校验信息,header,继承体系。。。。),不便于在网络中高效传输; 所以,hadoop自己开发了一套序列化机制(Writable),精简,高效 3.2.2Jdk序列化和MR序列化之间的比较 简单代码验证两种序列化机制的差别: public class TestSeri { public static void main(String[] args) throws Exception { //定义两个ByteArrayOutputStream,用来接收不同序列化机制的序列化结果 ByteArrayOutputStream ba = new ByteArrayOutputStream(); ByteArrayOutputStream ba2 = new ByteArrayOutputStream(); //定义两个DataOutputStream,用于将普通对象进行jdk标准序列化 DataOutputStream dout = new DataOutputStream(ba); DataOutputStream dout2 = new DataOutputStream(ba2); ObjectOutputStream obout = new ObjectOutputStream(dout2); //定义两个bean,作为序列化的源对象 ItemBeanSer itemBeanSer = new ItemBeanSer(1000L, 89.9f); ItemBean itemBean = new ItemBean(1000L, 89.9f); //用于比较String类型和Text类型的序列化差别 Text atext = new Text("a"); // atext.write(dout); itemBean.write(dout); byte[] byteArray = ba.toByteArray(); //比较序列化结果 System.out.println(byteArray.length); for (byte b : byteArray) { System.out.print(b); System.out.print(":"); } System.out.println("-----------------------"); String astr = "a"; // dout2.writeUTF(astr); obout.writeObject(itemBeanSer); byte[] byteArray2 = ba2.toByteArray(); System.out.println(byteArray2.length); for (byte b : byteArray2) { System.out.print(b); System.out.print(":"); } } } 3.2.3自定义对象实现MR中的序列化接口 如果需要将自定义的bean放在key中传输,则还需要实现comparable接口,因为mapreduce框中的shuffle过程一定会对key进行排序,此时,自定义的bean实现的接口应该是: publicclassFlowBeanimplementsWritableComparable<FlowBean> 需要自己实现的方法是: /** *反序列化的方法,反序列化时,从流中读取到的各个字段的顺序应该与序列化时写出去的顺序保持一致 */ @Override public void readFields(DataInput in) throws IOException { upflow = in.readLong(); dflow = in.readLong(); sumflow = in.readLong(); } /** *序列化的方法 */ @Override public void write(DataOutput out) throws IOException { out.writeLong(upflow); out.writeLong(dflow); //可以考虑不序列化总流量,因为总流量是可以通过上行流量和下行流量计算出来的 out.writeLong(sumflow); } @Override public int compareTo(FlowBean o) { //实现按照sumflow的大小倒序排序 return sumflow>o.getSumflow()?-1:1; } 3.3. MapReduce与YARN 3.3.1 YARN概述 Yarn是一个资源调度平台,负责为运算程序提供服务器运算资源,相当于一个分布式的操作系统平台,而mapreduce等运算程序则相当于运行于操作系统之上的应用程序 3.3.2 YARN的重要概念 1、yarn并不清楚用户提交的程序的运行机制 2、yarn只提供运算资源的调度(用户程序向yarn申请资源,yarn就负责分配资源) 3、yarn中的主管角色叫ResourceManager 4、yarn中具体提供运算资源的角色叫NodeManager 5、这样一来,yarn其实就与运行的用户程序完全解耦,就意味着yarn上可以运行各种类型的分布式运算程序(mapreduce只是其中的一种),比如mapreduce、storm程序,spark程序,tez…… 6、所以,spark、storm等运算框架都可以整合在yarn上运行,只要他们各自的框架中有符合yarn规范的资源请求机制即可 7、Yarn就成为一个通用的资源调度平台,从此,企业中以前存在的各种运算集群都可以整合在一个物理集群上,提高资源利用率,方便数据共享 3.3.3Yarn中运行运算程序的示例 mapreduce程序的调度过程,如下图 本文转自yushiwh 51CTO博客,原文链接:http://blog.51cto.com/yushiwh/1913044,如需转载请自行联系原作者

优秀的个人博客,低调大师

OpenStack —— 原理架构介绍(一)

一、OpenStack 简介 Openstack是一个控制着大量计算能力、存储、乃至于整个数据中心网络资源的云操作系统,通过Dashboard这个Web界面,让管理员可以控制、赋予他们的用户去提供资源的权限(即:能够通过Dashboard控制整个Openstack云计算平台的运作)。 作为IaaS层的云操作系统,OpenStack为虚拟机提供并管理三大类资源:计算、网络和存储。 Openstack的发展非常快,而且由于其开源的本质,所以导致了即便是前后相隔的两个不同版本,也可能会出现比较大的区别。所以在我们初习Openstack的时候,应该考虑从一个体系相对成熟,资料相对丰富的版本入手。当然如果你拥有良好的英文阅读习惯的话,Openstack的官网就提供了非常完善的最新版本的文档资料。 二、OpenStack 组件 OpenStack包含了许多组件。有些组件会首先出现在孵化项目中,待成熟以后进入下一个OpenStack发行版的核心服务中。同时也有部分项目是为了更好地支持OpenStack社区和项目开发管理,不包含在发行版代码中,主要组件如下: Compute (Nova) 计算服务 Identity Service (Keystone) 认证服务 Image Service (Glance) 镜像服务 Networking (Neutron) 网络服务 Dashboard (Horizon) 仪表板 Object Storage (Swift) 对象存储 Block Storage (Cinder) 块存储 Orchestration (Heat) 编排 Telemetry (Ceilometer) 监控 Database Service (Trove) 数据库服务 Data Processing (Sahara) 数据处理 三、OpenStack 架构 OpenStack是由一系列具有RESTful接口的Web服务所实现的,是一系列组件服务集合。如下图为OpenStack的概念架构,我们看到的是一个标准的OpenStack项目组合的架构。这是比较典型的架构,但不代表这是OpenStack的唯一架构,我们可以选取自己需要的组件项目,来搭建适合自己的云计算平台。 OpenStack项目并不是单一的服务,其含有子组件,子组件内由模块来实现各自的功能,如下图为OpenStack的逻辑架构。通过消息队列和数据库,各个组件可以相互调用,互相通信。这样的消息传递方式解耦了组件、项目间的依赖关系,所以才能灵活地满足我们实际环境的需要,组合出适合我们的架构。每个项目都有各自的特性,大而全的架构并非适合每一个用户,譬如Glance在最早的A、B版本中并没有实际出现应用,Nova可以脱离镜像服务独立运行。当用户的云计算规模大到需要管理多种镜像时,才需要像Glance这样的组件。OpenStack的成长是在生产环境中不断被检验,然后再将需求反馈给社区,由社区来实现的一个过程,可以说OpenStack并非脱离实际的理想化开源社区项目,而是与生产实际紧密结合的,可以复制应用的云计算方案。 OpenStack 本身是一个分布式系统,不但各个服务可以分布部署,服务中的组件也可以分布部署。 这种分布式特性让 OpenStack 具备极大的灵活性、伸缩性和高可用性。 附录:其他图 概念架构图: 逻辑架构图: 参考:http://ken.pepple.info/openstack/2012/09/25/openstack-folsom-architecture/ https://ilearnstack.com/2013/04/23/introduction-to-openstack-2/ 本文转自 wzlinux 51CTO博客,原文链接:http://blog.51cto.com/wzlinux/1961337,如需转载请自行联系原作者

优秀的个人博客,低调大师

MAPREDUCE原理篇(1)

Mapreduce是一个分布式运算程序的编程框架,是用户开发“基于hadoop的数据分析应用”的核心框架; Mapreduce核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在一个hadoop集群上; 1.1为什么要MAPREDUCE (1)海量数据在单机上处理因为硬件资源限制,无法胜任 (2)而一旦将单机版程序扩展到集群来分布式运行,将极大增加程序的复杂度和开发难度 (3)引入mapreduce框架后,开发人员可以将绝大部分工作集中在业务逻辑的开发上,而将分布式计算中的复杂性交由框架来处理 设想一个海量数据场景下的wordcount需求: 单机版:内存受限,磁盘受限,运算能力受限 分布式: 1、文件分布式存储(HDFS) 2、运算逻辑需要至少分成2个阶段(一个阶段独立并发,一个阶段汇聚) 3、运算程序如何分发 4、程序如何分配运算任务(切片) 5、两阶段的程序如何启动?如何协调? 6、整个程序运行过程中的监控?容错?重试? 可见在程序由单机版扩成分布式时,会引入大量的复杂工作。为了提高开发效率,可以将分布式程序中的公共功能封装成框架,让开发人员可以将精力集中于业务逻辑。 而mapreduce就是这样一个分布式程序的通用框架,其应对以上问题的整体结构如下: 1、MRAppMaster(mapreduce application master) 2、MapTask 3、ReduceTask 1.2 MAPREDUCE框架结构及核心运行机制 1.2.1结构 一个完整的mapreduce程序在分布式运行时有三类实例进程: 1、MRAppMaster:负责整个程序的过程调度及状态协调 2、mapTask:负责map阶段的整个数据处理流程 3、ReduceTask:负责reduce阶段的整个数据处理流程 1.2.2MR程序运行流程 1.2.2.1流程示意图 1.2.2.2流程解析 1、一个mr程序启动的时候,最先启动的是MRAppMaster,MRAppMaster启动后根据本次job的描述信息,计算出需要的maptask实例数量,然后向集群申请机器启动相应数量的maptask进程 2、maptask进程启动之后,根据给定的数据切片范围进行数据处理,主体流程为: a)利用客户指定的inputformat来获取RecordReader读取数据,形成输入KV对 b)将输入KV对传递给客户定义的map()方法,做逻辑运算,并将map()方法输出的KV对收集到缓存 c)将缓存中的KV对按照K分区排序后不断溢写到磁盘文件 3、MRAppMaster监控到所有maptask进程任务完成之后,会根据客户指定的参数启动相应数量的reducetask进程,并告知reducetask进程要处理的数据范围(数据分区) 4、Reducetask进程启动之后,根据MRAppMaster告知的待处理数据所在位置,从若干台maptask运行所在机器上获取到若干个maptask输出结果文件,并在本地进行重新归并排序,然后按照相同key的KV为一个组,调用客户定义的reduce()方法进行逻辑运算,并收集运算输出的结果KV,然后调用客户指定的outputformat将结果数据输出到外部存储 1.3MapTask并行度决定机制 maptask的并行度决定map阶段的任务处理并发度,进而影响到整个job的处理速度 那么,mapTask并行实例是否越多越好呢?其并行度又是如何决定呢? 1.3.1 mapTask并行度的决定机制 一个job的map阶段并行度由客户端在提交job时决定 而客户端对map阶段并行度的规划的基本逻辑为: 将待处理数据执行逻辑切片(即按照一个特定切片大小,将待处理数据划分成逻辑上的多个split),然后每一个split分配一个mapTask并行实例处理 这段逻辑及形成的切片规划描述文件,由FileInputFormat实现类的getSplits()方法完成,其过程如下图: 1.3.2FileInputFormat切片机制 1、切片定义在InputFormat类中的getSplit()方法 2、FileInputFormat中默认的切片机制: a)简单地按照文件的内容长度进行切片 b)切片大小,默认等于block大小 c)切片时不考虑数据集整体,而是逐个针对每一个文件单独切片 比如待处理数据有两个文件: file1.txt 320M file2.txt 10M 经过FileInputFormat的切片机制运算后,形成的切片信息如下: file1.txt.split1-- 0~128 file1.txt.split2-- 128~256 file1.txt.split3-- 256~320 file2.txt.split1-- 0~10M 3、FileInputFormat中切片的大小的参数配置 通过分析源码,在FileInputFormat中,计算切片大小的逻辑:Math.max(minSize, Math.min(maxSize, blockSize));切片主要由这几个值来运算决定 minsize:默认值:1 配置参数:mapreduce.input.fileinputformat.split.minsize maxsize:默认值:Long.MAXValue 配置参数:mapreduce.input.fileinputformat.split.maxsize blocksize 因此,默认情况下,切片大小=blocksize maxsize(切片最大值): 参数如果调得比blocksize小,则会让切片变小,而且就等于配置的这个参数的值 minsize(切片最小值): 参数调的比blockSize大,则可以让切片变得比blocksize还大 选择并发数的影响因素: 1、运算节点的硬件配置 2、运算任务的类型:CPU密集型还是IO密集型 3、运算任务的数据量 1.4 map并行度的经验之谈 如果硬件配置为2*12core + 64G,恰当的map并行度是大约每个节点20-100个map,最好每个map的执行时间至少一分钟。 l如果job的每个map或者reduce task的运行时间都只有30-40秒钟,那么就减少该job的map或者reduce数,每一个task(map|reduce)的setup和加入到调度器中进行调度,这个中间的过程可能都要花费几秒钟,所以如果每个task都非常快就跑完了,就会在task的开始和结束的时候浪费太多的时间。 配置task的JVM重用可以改善该问题: (mapred.job.reuse.jvm.num.tasks,默认是1,表示一个JVM上最多可以顺序执行的task 数目(属于同一个Job)是1。也就是说一个task启一个JVM) l如果input的文件非常的大,比如1TB,可以考虑将hdfs上的每个block size设大,比如设成256MB或者512MB 1.5ReduceTask并行度的决定 reducetask的并行度同样影响整个job的执行并发度和执行效率,但与maptask的并发数由切片数决定不同,Reducetask数量的决定是可以直接手动设置: //默认值是1,手动设置为4 job.setNumReduceTasks(4); 如果数据分布不均匀,就有可能在reduce阶段产生数据倾斜 注意: reducetask数量并不是任意设置,还要考虑业务逻辑需求,有些情况下,需要计算全局汇总结果,就只能有1个reducetask 尽量不要运行太多的reduce task。对大多数job来说,最好rduce的个数最多和集群中的reduce持平,或者比集群的 reduce slots小。这个对于小集群而言,尤其重要。 1.6MAPREDUCE程序运行演示 Hadoop的发布包中内置了一个hadoop-mapreduce-example-2.4.1.jar,这个jar包中有各种MR示例程序,可以通过以下步骤运行: 启动hdfs,yarn 然后在集群中的任意一台服务器上启动执行程序(比如运行wordcount): hadoop jar hadoop-mapreduce-example-2.4.1.jar wordcount /wordcount/data /wordcount/out 本文转自yushiwh 51CTO博客,原文链接:http://blog.51cto.com/yushiwh/1912972 ,如需转载请自行联系原作者

优秀的个人博客,低调大师

VMware VDS原理详解--20170922

本文纯属个人理解,如有错误请留言指正。 上图为vSpere中一个简单的结构拓扑图,借用这个拓扑图来解释一下为什么VDS能够逻辑上跨越ESXi。 首先说明一下整个架构 1. 在底层用三台ESXi表示一个底层的网络,另外用Storage代表存储,在最左边ESXi中的最左边一台VM表示为VC。 2. 每一台ESXi配置4块网卡,两两一组,左边一组表示业务网卡,连接APP Switch;右边一组网卡为Storage网卡,连接Storage交换机,两张网卡进行LACP捆绑 3. APP Switch和Storage Switch都是纯二层物理交换机,上联和下联接口都是Trunk模式 4. Core Switch上有所有VM的网关 好了,基本架构情况说完了,下面开始VDS的从建立到设置到维护管理的整个过程 ===================华丽分割线======================= 本文转自snc_snc 51CTO博客,原文链接:http://blog.51cto.com/netsyscode/1967792 ,如需转载请自行联系原作者

优秀的个人博客,低调大师

InstantRun原理(2)——更新逻辑

上一篇博客我们介绍了InstantRun的初始化逻辑,接下来我们来看下在运行时阶段,InstantRun是如何加载修改的代码的。 上一篇博客的末尾我们介绍了InstantRun在初始化完成后,会启动一个server。不难猜测,这个server就是在监听是否有代码更新。当用户更改代码后,AndroidStudio会将相关更新发送给server,server获取到更新后执行修复逻辑。 1 SocketServerReplyThread server的主要实现由其内部类SocketServerReplyThread,首先来看下其实现: private class SocketServerReplyThread extends Thread { private final LocalSocket mSocket; Sock

优秀的个人博客,低调大师

Marble原理之线程池

本章节依赖于【Marble使用】,阅读本章节前请保证已经充分了解Marble 线程池概述 由于Marble属于框架性项目,用户接入Marble不关心Marble的实现机制。因此Marble在做相关处理时对资源的消耗要可控,不能因为Marble的原因导致接入的应用不可用(比如资源耗尽)。此外,Marble-Agent每次收到RPC调度为了不阻塞都会新开线程进行JOB执行,对线程的使用非常频繁,因此必须使用同一的线程池进行Marble的资源使用收口。 对于线程池 Java已经做了很好的封装,大部分的使用场景都能覆盖,枚举如下: newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程; newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待; newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行; newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行; 线程池new线程的流程(网络盗图): Marble线程池 线程池定义 由于Marble线程池一个很大的作用是为了控制资源使用,给Marble资源占用设定上限,Java本身提供的线程池虽然有最大线程数设置,但阻塞队列用的都是无界的,不适合做资源限定使用。因此,Marble对java线程池做了定制化。 使用有界阻塞队列 executor = new ThreadPoolExecutor( tpConfig.getMaxSize(), tpConfig.getCoreSize(), 0, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(tpConfig.getBlockQueueSize()), tpConfig.getRejectPolicy() ); 线程池自配置支持 为了方便用户进行线程池自配置,Marble提供配置文件的方式支持用户自定义线程池配置,配置方式为:在项目根目录下建立文件marble-config.properties 。文件中进行参数赋值,如下: #线程池最大线程数 tpool_max_size=5 #线程池核心线程数 tpool_core_size=5 #线程池阻塞有界队列长度 tpool_bq_size=3 #线程池满后的处理策略。1-AbortPolicy(抛出RejectedExecutionException异常); 2-CallerRunsPolicy; 3-DiscardOldestPolicy 4-DiscardPolicy(不抛出异常) tpool_reject_policy=1 Marble会首先在根目录下查找此配置文件,找不到会用默认配置。tpool_max_size=20tpool_core_size=20tpool_bq_size=5tpool_reject_policy=1 Marble的配置解析类如下: /** * Marble 配置解析 * * @author <a href="dongjianxing@aliyun.com">jeff</a> * @version 2017/3/31 20:15 */ public class MarbleConfigParser { private static ClogWrapper logger = ClogWrapperFactory.getClogWrapper(MarbleConfigParser.class); private static final String CONFIG = "marble-config.properties"; private static Properties prop = new Properties(); //默认配置 private static final int TPOOL_MAX_SIZE = 20;//线程池最大线程数 private static final int TPOOL_CORE_SIZE = 20;//线程池核心线程数 private static final int TPOOL_BQ_SIZE = 5;//线程池阻塞队列大小 private static final int TPOOL_REJECT_POLICY = 1;//线程池满的处理策略. 1-AbortPolicy(抛出RejectedExecutionException异常); 2-CallerRunsPolicy; 3-DiscardOldestPolicy 4-DiscardPolicy private MarbleConfigParser() { try { InputStream stream = PropertyUtils.class.getClassLoader().getResourceAsStream(CONFIG); if (stream == null) { logger.MARK("PARSE_CONFIG").warn("no marbleConfig.properties.xml is exist in the root directory of classpath, so default the config will be used."); return; } prop.load(stream); } catch (Exception e) { logger.MARK("PARSE_CONFIG").error("parse the marbleConfig.properties.xml in the root directory exception, detail: {}", Throwables.getStackTraceAsString(e)); } } //解析出thread pool配置 ThreadPoolConfig parseTPConfig() { ThreadPoolConfig tpConfig = null; try { Integer tpms = getInteger(prop, "tpool_max_size"); Integer tpcs = getInteger(prop, "tpool_core_size"); Integer tpqs = getInteger(prop, "tpool_bq_size"); Integer tprp = getInteger(prop, "tpool_reject_policy"); //修正参数 tpcs = (tpcs == null || tpcs < 0 || tpcs > 500) ? TPOOL_CORE_SIZE : tpcs; tpms = (tpms == null || tpms < tpqs) ? tpcs : tpms; tpqs = (tpqs == null || tpqs < 0 || tpqs > 100) ? TPOOL_BQ_SIZE : tpqs; tprp = (tprp == null || tprp > 4) ? 1 : tprp; RejectedExecutionHandler handler = new ThreadPoolExecutor.AbortPolicy(); switch (tprp) { case 1: handler = new ThreadPoolExecutor.AbortPolicy(); break; case 2: handler = new ThreadPoolExecutor.CallerRunsPolicy(); break; case 3: handler = new ThreadPoolExecutor.DiscardOldestPolicy(); break; case 4: handler = new ThreadPoolExecutor.DiscardPolicy(); break; } tpConfig = new ThreadPoolConfig(tpms,tpcs,tpqs,handler); } catch (Exception e) { logger.MARK("PARSE_CONFIG").error("parse the thread-pool config from marbleConfig.properties.xml exception, detail: {}", Throwables.getStackTraceAsString(e)); } if (tpConfig == null) { tpConfig = new ThreadPoolConfig(TPOOL_MAX_SIZE,TPOOL_CORE_SIZE, TPOOL_BQ_SIZE, new ThreadPoolExecutor.DiscardPolicy()); } return tpConfig; } private Integer getInteger(Properties prop, String key) { Integer result = null; try { String value = prop.getProperty(key); if (value != null && value.trim().length() > 0) { result = Integer.parseInt(value); } } catch (Exception e) { } return result; } //单例 private static class SingletonHolder { private static final MarbleConfigParser CONFIG_HELPER = new MarbleConfigParser(); } public static MarbleConfigParser getInstance() { return MarbleConfigParser.SingletonHolder.CONFIG_HELPER; } //线程池配置 class ThreadPoolConfig { private int maxSize;//线程池最大线程数 private int coreSize;//线程池核心线程数 private int blockQueueSize;//线程池阻塞队列大小 private RejectedExecutionHandler rejectPolicy;//线程池拒绝策略 ThreadPoolConfig(int maxSize, int coreSize, int blockQueueSize, RejectedExecutionHandler rejectPolicy) { this.maxSize = maxSize; this.coreSize = coreSize; this.blockQueueSize = blockQueueSize; this.rejectPolicy = rejectPolicy; } int getCoreSize() { return coreSize; } int getBlockQueueSize() { return blockQueueSize; } public int getMaxSize() { return maxSize; } RejectedExecutionHandler getRejectPolicy() { return rejectPolicy; } @Override public String toString() { return "ThreadPoolConfig{" + "maxSize=" + StringUtils.safeString(maxSize) + ", coreSize=" + StringUtils.safeString(coreSize) + ", blockQueueSize=" + StringUtils.safeString(blockQueueSize) + ", rejectPolicy=" + StringUtils.safeString(rejectPolicy.getClass().getSimpleName()) + '}'; } } } 线程池使用示例 以如下线程池配置为例:tpool_max_size=5tpool_core_size=5tpool_bq_size=3tpool_reject_policy=1 下图中同一台机器(10.2.37.137)连续收到11次Marble调度 > 第1~5次Marble-Agent成功从线程池中启动了5个线程进行执行; 第6~8次调用,核心线程数已满,有界阻塞队列开始进行填充; 第9~10次调用有界阻塞队列已被填满,最大线程数也已满,由于采用了 拒绝策略Abort,直接拒绝了10~11次的调度请求; 手动进行了“线程中断”调用; 第11次又成功执行;

优秀的个人博客,低调大师

CAP原理和BASE思想

分布式领域CAP理论,Consistency(一致性), 数据一致更新,所有数据变动都是同步的Availability(可用性), 好的响应性能Partition tolerance(分区容错性) 可靠性 定理:任何分布式系统只可同时满足二点,没法三者兼顾。忠告:架构师不要将精力浪费在如何设计能满足三者的完美分布式系统,而是应该进行取舍。 关系数据库的ACID模型拥有 高一致性 + 可用性 很难进行分区:Atomicity原子性:一个事务中所有操作都必须全部完成,要么全部不完成。Consistency一致性. 在事务开始或结束时,数据库应该在一致状态。Isolation隔离层. 事务将假定只有它自己在操作数据库,彼此不知晓。Durability. 一旦事务完成,就不能返回。跨数据库事务:2PC (two-phase commit), 2PC is the anti-scalability pattern (Pat Helland) 是反可伸缩模式的,JavaEE中的JTA事务可以支持2PC。因为2PC是反模式,尽量不要使用2PC,使用BASE来回避。 BASE模型反ACID模型,完全不同ACID模型,牺牲高一致性,获得可用性或可靠性:Basically Available基本可用。支持分区失败(e.g. sharding碎片划分数据库)Soft state软状态 状态可以有一段时间不同步,异步。Eventually consistent最终一致,最终数据是一致的就可以了,而不是时时高一致。 BASE思想的主要实现有1.按功能划分数据库2.sharding碎片 BASE思想主要强调基本的可用性,如果你需要High 可用性,也就是纯粹的高性能,那么就要以一致性或容错性为牺牲,BASE思想的方案在性能上还是有潜力可挖的。 现在NOSQL运动丰富了拓展了BASE思想,可按照具体情况定制特别方案,比如忽视一致性,获得高可用性等等,NOSQL应该有下面两个流派:1. Key-Value存储,如Amaze Dynamo等,可根据CAP三原则灵活选择不同倾向的数据库产品。2. 领域模型 + 分布式缓存 + 存储 (Qi4j和NoSql运动),可根据CAP三原则结合自己项目定制灵活的分布式方案,难度高。 这两者共同点:都是关系数据库SQL以外的可选方案,逻辑随着数据分布,任何模型都可以自己持久化,将数据处理和数据存储分离,将读和写分离,存储可以是异步或同步,取决于对一致性的要求程度。 不同点:NOSQL之类的Key-Value存储产品是和关系数据库头碰头的产品BOX,可以适合非Java如PHP RUBY等领域,是一种可以拿来就用的产品,而领域模型 + 分布式缓存 + 存储是一种复杂的架构解决方案,不是产品,但这种方式更灵活,更应该是架构师必须掌握的 BASE讲究soft state,这种状态是一种非即时性的状态,是一种无连接,或者说是尽量短连接的状态,而ACID是讲究强的一致性,要求即时性的事务hard state,这是一种完全面向连接的状态。强的一致性就以牺牲性能和高可用性为代价,目前 JDON的风格是一种符合BASE策略的架构风格。 http://www.jdon.com/37625

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册