ZooKeeper是一个分布式应用所涉及的开源协调服务。 可以为用户提供同步,配置管理,分组和命名等服务。 用户可以实现一致性,组管理,leader选举等协议。 设计目的是为了减轻分布式应用程序所承担的协调任务。 Zookeeper的设计目标:简单化,健壮性,有序性,速度优势。 Znode是客户端要访问的ZooKeeper的主要实体,主要特征有: 客户端可以在节点是设置watch即监视器。当节点的状态发生改变时就会触发watch对应的操作,此时,Zookeeper会向客户端仅发送一个通知,因为watch只能被触发一次。 每个节点上存储的数据需要被原子性的操作。读操作会获取与节点相关的所有数据,写操作也将替换节点的所有数据。另外,每一个节点都拥有自己的ACL即访问控制列表,这个列表规定了用户的权限,即限定了特定用户对目标节点可以执行的操作。 有两种节点即临时节点和永久节点。节点类型在创建时被确认并且不能改变。一单创建节点的会话结束,临时节点将会被自动删除。临时节点不允许拥有子节点。 顺序节点可以保证唯 继续阅读 >>


张瑞 15/04/03 14:34:24
Hadoop Mapreduce的局限性:JobTracker单点瓶颈;TaskTracker端;作业延迟高;编程框架不够灵活。 Mapreduce2的设计需求:可靠性;可用性;扩展性;向后兼容;演化;可预测延迟;集群利用率;支持除Mapreduce编程框架外的其他框架;支持受限和短期的服务。   Mapreduce2的主要设计思路是将JobTracker承担的两大任务块——集群资源管理和作业管理进行分离,其中分离出来的集群资源管理由全局的资源管理器管理,分离出来的作业管理由针对每个作业的应用主体管理。然偶TaskTracker演化成节点管理器。这样全局的资源管理器和局部的节点管理器就组成了数据计算框架,其中资源管理器将成为整个集群中资源最终分配者。   根据功能不同将资源管理器分为两个组件:调度器和应用管理器。调度器负责资源的分配,而不负责监控各个应用的执行情况和任务失败,应用失败或硬件失败时的重启任务。应用管理器负责接收作业,协商获取第一个资源容器用于执行应用的任务主题并为重启失败的应用主题分配容 继续阅读 >>


张瑞 15/04/03 10:56:42
Kerberos:网络认证服务系统,给予私匙体制。 Kerberos协议主要用于计算机网络的身份鉴别,其特点是用户只需要输入一次身份验证信息就可以凭借此验证访问多个服务,即SSO。由于每个Client和Service之间建立了共享密匙,是得该协议具有相当的安全性。 client与KDC,KDC与service在协议工作前已经有了各自的共享密匙,并且由于协议中的消息无法穿透防火墙,这些条件就限制了kerberos协议往往用于一个组织的内部。 Kerberos协议分为两个部分: 1.client向KDC发送自己的身份信息,KDC从Ticket Granting Service得到TGT,并用协议开始前Client与KDC之间的密匙将TGT加密恢复给Client。此时只有真正的Client才能利用它与KDC之间的密钥将加密后的TGT解密,从而获得TGT。 2.Client利用之前获得的TGT向KDC请求其他Service的Ticket,从而通过其他Service的身份鉴别。 Client将之前获得TGT 继续阅读 >>


张瑞 15/04/03 10:51:23
昨晚接到百度电话面试,其中有道题并不难但很有意思,不过当时可能脑子打弯,只是列出了公式没有把具体的解决方案拿出来,今天早上突然想起来怎么做了,打算记录下来。 这是一个关于梦境的题,暂且叫做“盗梦空间”吧: 假设人有多重梦境,现实生活中的1s在第一层梦境的虚拟时间是0.05s,在第二层梦境度过的虚拟时间就是第一层梦境的0.05倍,以此类推...如果这个人有1层梦境,那么他在现实中度过一秒,就相当于真实时间+梦境的虚拟时间也就是1.05s,那如果这个人有n层梦境,那他相当于度过了多少时间? 如果按照一个数学思路来解析的话可以抽象成这样一个公式:(y就是度过的时间,x是真实时间,p是梦境中的时间换算倍数,n是多少层梦境) y = x+x*p^1+x*p^2+...+x*p^n 其实抽象成递归解决思路很容易,为了方便我用python写了出来: 其中num是梦境层数,p是梦境中的时间换算倍数,x是真实时间,返回值就是度过的时间了。 上边的程序运行结果: 继续阅读 >>


张瑞 14/08/13 11:35:24
因为工作需要开始了解Hadoop,做一个小小的学习笔记,总结下今天看的。 Hadoop:一个分布式系统架构,能够对大量数据进行分布式处理的软件框架。 可靠(维护多个工作数据副本),高效(并行处理),可伸缩(可以处理PB级数据)的方式进行处理。 优点:高可靠性,高扩展性,高效性,高容错性,低成本。 核心设计:HDFS(海量数据的存储)和MapReduce(海量数据的计算)   接下来主要介绍下HDFS: HDFS(Hadoop Distributed File System)由Hadoop实现的一个分布式文件系统。高容错性的特点,并且设计用来部署在低廉的硬件上。而且它提供高传输率来访问应用程序的数据,是为以流的方式存取大文件而设计的,适合那些有着超大数据集的应用程序。HDFS支持大数据文件,能够提供大数据传输的带宽和数百个节点的集群的服务,能够支持千万级别的文件。并适合写一次读多次的场合。而对于低延时数据访问、大量小文件、同时写和任意的文件修改,则并不是十分适合存储Hadoop集群众所有存储节点上的文 继续阅读 >>


张瑞 14/07/14 22:42:52
     由于最近要着手做pcduino上的视频聊天的项目,从未接触过pcduino,经过讨论决定使用qt来实现。其实qt和opencv我都没有接触过,也打算趁机学习一下。言归正传,首先得搭建好需要的环境,第一步是安装配置opencv,然后在qt中使用opencv的库。 (opencv的安装方法部分参考雷雨同鞋哒~) 首先,在官网http://opencv.org/中下载opencv原码,选择linux版本进行下载。 以opencv2.4.8为例: 1.将压缩包解压到/usr/local/ 2.直接使用sudo apt-get install cmake下载并安装cmake 3.为了方便后续摄像头捕捉等功能还需要下载opencv依赖的一些包:   apt-cache search opencv   使用此命令可以直接查到需要下载的依赖包 4.安装上述所依赖的包(sudo apt-get install xxx就ok) 5.接着就要编译opencv的原码并安装:   执行以下命令:   sudo mv 继续阅读 >>


张瑞 14/04/11 17:59:50
  最近因为要准备找实习,偶尔看了些互联网公司的智力题,每次都觉得自己智商很捉鸡,总是捉摸不透其中的逻辑(PS:最不理解几句对话就能得知答案),今天看了道算是简单的猜测年龄的题,终于摸透了。 来自某公司的一个面试题:   经理有3个女儿,年龄和是13岁,年龄的乘积等于经理的年龄。有个员工知道经理的年龄,但是不能确定他3个女儿都是多大。这时经理告诉他:“我只有一个女儿超过5岁”,于是那个员工说:“哦,那我知道了。”   问:经理的3个女儿各是多大?    我个人的解析方式:   假设3个女儿的年龄分别为:x, y, z   其中:x > 5, z <= 5, y <= 5, x + y + z = 13, x * y * z = A (经理年龄)   结合以上条件以及经理年龄不可能太大或者太小我找出了以下几种可能:   1,5,7   1,4,8   2,2,9   但是我仅仅猜测出了这三种合理的可能,不知道为什么那名员工就可以知道确切的年龄呢。最后忍不住看了解析:   原来忽略了员工 继续阅读 >>


张瑞 14/03/19 21:38:35
  RTTI也就是运行时的类型识别,程序能够使用基类的指针或引用来检索这些指针或引用所指对象的实际派生类型。   对于带虚函数的类,在运行时执行RTTI操作符,但对于其他类型,在编译时计算RTTI操作符。   当具有基类的引用或指针,但需要执行不是基类组成部分的派生类操作的时候,需要动态的强制类型转换。通常,从基类指针获得派生类行为最好的方法是通过虚函数。当使用虚函数的时候,编译器会自动根据对象的实际类型选择正确的函数。   但是,在某些情况下,不可能使用虚函数,此时RTTI提供了可选的机制。值得小心的是,这种机制要比使用虚函数更容易出错。 下面介绍的是提供RTTI的两个操作符: 1.dynamic_cast操作符:   可以使用它操作符将基类类型对象的引用或指针转换为同一继承层次中其他类型的引用或指针。与dynamic_cast一起使用的指针必须是有效的(即为0或者指向一个对象)。   与其他强制类型转换不同,dynamic_cast涉及到了运行时类型检查。如果绑定到引用或指针的对象不是目标类型的 继续阅读 >>


张瑞 14/03/13 08:47:58
       在编程中,类型转换在所难免,在此我将介绍一下C++中常用的隐式转换和强制类型转换。 关于隐式转换:        在C++中,某些类型之间存在相关的依赖关系,若两种类型相关,则可以再需要某种类型的操作数位置上,使用该类型的相关类型对象或值。        C++并不是吧两个不同类型的值直接加在一起,而提供了一组转换规则,一边在执行算数操作之前,将两个操作数转换为同一种数据类型。这些转换规则由编译器自动执行,无需我们再介入。因此,也被成为隐式转换。 发生隐式转换的情况:        1.在混合类型的表达式中,其操作数被转换为相同类型。        2.用作条件的表达式(?:,!,&&,||,if,while,for,do while)被转换为bool类型。        3.用一表达式初始化某个变量,或将一表达式被转换为该变量的类型。 隐式转换类型:        1.指针转换:在使用数组时,大多数情况下数组都会自动转换为指向第一个元素的指针。 int ia[10]; 继续阅读 >>


张瑞 14/03/05 22:40:28
汉诺塔问题的描述:   汉诺塔(Tower of Hanoi)问题又称“世界末日问题”有这样一个故事。古代有一个焚塔,塔内有3个基座A,B,C,开始时A基座上有64个盘子,盘子大小不等,大的在下,小的在上。有一个老和尚想把这64个盘子从A座移到B座,但每次只容许移动一个盘子,且在移动过程中,3个基座上的盘子都始终保持大盘在下,小盘在上。移动过程中可以利用C基座做辅助。      这个问题当时老和尚和众僧们,经过计算后,预言当所有的盘子都从基柱A移到基座B上时,世界就将在一声霹雳中消灭,而梵塔、庙宇和众生也都将同归于尽。其实,不管这个传说的可信度有多大,如果考虑把64个盘子,由一个塔柱上移到另一根塔柱上,并且始终保持上小下大的顺序。假设有n个盘子,移动次数是f(n).显然f(1)=1,f(2)=3,f(3)=7,且f(k+1)=2*f(k)+1。此后不难证明f(n)=2n-1。n=64时, f(64)= 2^64-1=18446744073709551615     假如每秒钟一次,共需多长时间呢?一 继续阅读 >>


张瑞 14/02/13 01:30:32