hadoop高可靠性HA集群

概述   简单hdfs高可用架构图     在hadoop2.x中通常由两个NameNode组成,一个处于active状态,另一个处于standby状态。Active NameNode对外提供服务,而Standby NameNode则不对外提供服务,仅同步active namenode的状态,以便能够在它失败时快速进行切换。    hadoop2.x官方提供了两种HDFS HA的解决方案,一种是NFS,另一种是QJM。这里楼主使用简单的QJM。在该方案中,主备NameNode之间通过一组JournalNode同步元数据信息,一条数据只要成功写入多数JournalNode即认为写入成功。通常配置奇数个JournalNode(我配了3个)。    这里还配置了一个zookeeper集群,用于ZKFC(DFSZKFailoverController)故障转移,当Active NameNode挂掉了,会自动切换Standby NameNode为standby状态。hadoop2.4以前的版本中依然存在一个问题,就是ResourceManager只有一个,存在单点故障,2.4以后解决了这个问题,有两个ResourceManager,一个是Active,一个是Standby,状态由zookeeper进行协调。yarn的HA配置楼主会给出配置文件,受环境影响,这里就不搭建yarn的高可用性了。 主要步骤   备6台Linux机器 安装JDK、配置主机名、修改IP地址、关闭防火墙 配置SSH免登陆 安装zookeeper集群 zookeeper、hadoop环境变量配置 核心配置文件修改 启动zookeeper集群 启动journalnode 格式化文件系统、格式化zk 启动hdfs、启动yarn… Read More »hadoop高可靠性HA集群

Hadoop之HDFS原理及文件上传下载源码分析(下)

  上篇Hadoop之HDFS原理及文件上传下载源码分析(上)楼主主要介绍了hdfs原理及FileSystem的初始化源码解析, Client如何与NameNode建立RPC通信。本篇将继续介绍hdfs文件上传、下载源解析。 文件上传   先上文件上传的方法调用过程时序图:          其主要执行过程:    FileSystem初始化,Client拿到NameNodeRpcServer代理对象,建立与NameNode的RPC通信(楼主上篇已经介绍过了)    调用FileSystem的create()方法,由于实现类为DistributedFileSystem,所有是调用该类中的create()方法    DistributedFileSystem持有DFSClient的引用,继续调用DFSClient中的create()方法    DFSOutputStream提供的静态newStreamForCreate()方法中调用NameNodeRpcServer服务端的create()方法并创建DFSOutputStream输出流对象返回    通过hadoop提供的IOUtil工具类将输出流输出到本地   下面我们来看下源码:   首先初始化文件系统,建立与服务端的RPC通信    1 HDFSDemo.java 2 OutputStream os… Read More »Hadoop之HDFS原理及文件上传下载源码分析(下)

Hadoop之HDFS原理及文件上传下载源码分析(上)

HDFS原理   首先说明下,hadoop的各种搭建方式不再介绍,相信各位玩hadoop的同学随便都能搭出来。   楼主的环境:   操作系统:Ubuntu 15.10   hadoop版本:2.7.3   HA:否(随便搭了个伪分布式) 文件上传 下图描述了Client向HDFS上传一个200M大小的日志文件的大致过程:   首先,Client发起文件上传请求,即通过RPC与NameNode建立通讯。   NameNode与各DataNode使用心跳机制来获取DataNode信息。NameNode收到Client请求后,获取DataNode信息,并将可存储文件的节点信息返回给Client。   Client收到NameNode返回的信息,与对应的DataNode节点取得联系,并向该节点写文件。   文件写入到DataNode后,以流水线的方式复制到其他DataNode(当然,这里面也有DataNode向NameNode申请block,这里不详细介绍),至于复制多少份,与所配置的hdfs-default.xml中的dfs.replication相关。   元数据存储   先明确几个概念:   fsimage:元数据镜像文件。存储某一时段NameNode内存元数据信息。  edits:操作日志文件。  fstime:保存最近一次checkpoint的时间   checkpoint可在hdfs-default.xml中具体配置,默认为3600秒: 1 property> 2 name>dfs.namenode.checkpoint.periodname> 3 value>3600value> 4 description>The… Read More »Hadoop之HDFS原理及文件上传下载源码分析(上)

Hadoop之RPC简单使用(远程过程调用协议)

  一、RPC概述   RPC是指远程过程调用,也就是说两台不同的服务器(不受操作系统限制),一个应用部署在Linux-A上,一个应用部署在Windows-B或Linux-B上,若A想要调用B上的某个方法method(),由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语意和传达调用的参数。   楼主在接触RPC之前,用得最多的莫过于WebService。WebService可以说是在RPC发展的基础之上。RPC的协议有很多,比如最早的CORBA,Java RMI,Web Service等,又比如现在阿里巴巴的Dubbo,Apache下的hadoop项目。该篇楼主主要以hadoop的RPC为例。   hadoop为何要使用RPC?在HDFS中,我们通过jsp可查看到有DataNode,NameNode,SecondaryNameNode主要进程(楼主只启动了HDFS),我们客户端Client与NameNode通信,NameNode与DataNode的通信,都是在不同进程间,不同系统间的通信。      二、RPC流程     通过下图,我们简单分析RPC的执行流程:        首先,要解决通讯的问题,主要是通过在Client和Server之间建立TCP连接,远程过程调用的所有交换的数据都在这个连接里传输。连接可以是按需连接,调用结束后就断掉,也可以是长连接,多个远程过程调用共享同一个连接。   第二,要解决寻址的问题,也就是说,A服务器上的应用怎么告诉底层的RPC框架,如何连接到B服务器(如主机或IP地址)以及特定的端口,方法的名称名称是什么,这样才能完成调用。   第三,当Client上的应用发起远程过程调用时,方法的参数需要通过底层的网络协议如TCP传递到Server,由于网络协议是基于二进制的,内存中的参数的值要序列化成二进制的形式,也就是序列化(Serialize),通过寻址和传输将序列化的二进制发送给B服务器。   第四,Server收到请求后,需要对参数进行反序列化(序列化的逆操作),恢复为内存中的表达方式,然后找到对应的方法(寻址的一部分)进行本地调用,然后得到返回值。   三、hadoop—RPC的简单使用   定义接口Bizable:    1 package cn.jon.hadoop.rpc; 2 3 public… Read More »Hadoop之RPC简单使用(远程过程调用协议)

JavaScript数据结构——链表的实现

  前面楼主分别讨论了数据结构栈与队列的实现,当时所用的数据结构都是用的数组来进行实现,但是数组有的时候并不是最佳的数据结构,比如在数组中新增删除元素的时候需要将其他元素进行移动,而在javascript中使用spit()方法不需要访问其他元素。如果你在使用数组的时候发现很慢,就可以考虑使用链表。     链表的概念   链表是一种常见的数据结构。它是动态地进行存储分配的一种结构。链表有一个“头指针”变量,以head表示,它存放一个地址,指向一个元素。每个结点都使用一个对象的引用指标它的后继,指向另一个结点的引用叫做链。        数组元素依靠下标(位置)来进行引用,而链表元素则是靠相互之间的关系来进行引用。因此链表的插入效率很高,下图演示了链表结点d的插入过程:     删除过程:      基于对象的链表   我们定义2个类,Node类与LinkedList类,Node为结点数据,LinkedList保存操作链表的方法。   首先看Node类:   1 function Node(element){ 2 this.element = element; 3 this.next = null; 4 }… Read More »JavaScript数据结构——链表的实现

JavaScript数据结构——队列的实现

  前面楼主简单介绍了JavaScript数据结构栈的实现,http://www.cnblogs.com/qq503665965/p/6537894.html,本次将介绍队列的实现。     队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。   队列的两种主要操作是:向队列中插入新元素和删除队列中的元素。插入操作也叫做入队,删除操作也叫做出队。入队操作在队尾插入新元素,出队操作删除队头的元素。下图演示了这两个操作。     队列的另外一项重要操作是读取队头的元素。这个操作叫做 peek() 。该操作返回队头元素,但不把它从队列中删除。除了读取队头元素,我们还想知道队列中存储了多少元素,可以使用 length 属性满足该需求;要想清空队列中的所有元素,可以使用 clear() 方法来实现。下表定义了队列的一些主要方法:  dataStorage Array 存储数据的底层数据结构 enqueue int 入队 dequeue fucntion 出队 front fucntion 返回队首元素 back… Read More »JavaScript数据结构——队列的实现

JavaScript数据结构——栈的实现

  栈(stack)是一种运算受限的线性表。栈内的元素只允许通过列表的一端访问,这一端被称为栈顶,相对地,把另一端称为栈底。装羽毛球的盒子是现实中常见的栈例子。栈被称为一种后入先出(LIFO,last-in-first-out)的数据结构。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。   下图演示了入栈和出栈的过程:      我们知道pop()方法虽然可以访问栈顶元素,但是调用该方法后,栈顶元素被删除,而peek()方法返回栈顶元素,并不改变栈。push(),pop(),peek()是实现栈的三个主要方法,下表定义了栈的主要方法: 主要方法及属性 dataStorage Array 存储数据的底层数据结构 top int 记录栈顶元素位置 push fucntion 入栈方法 pop fucntion 出栈方法 peek fucntion 返回栈顶元素 length     fucntion   返回栈内元素个数 clear function  … Read More »JavaScript数据结构——栈的实现

多线程等待唤醒机制之生产消费者模式

  上篇楼主说明了多线程中死锁产生的原因并抛出问题——死锁的解放方案,那么在本篇文章,楼主将引用一个KFC生产汉堡,顾客购买汉堡的过程来说明死锁解决方案及多线程的等待唤醒机制。 简单地用一幅图来说明KFC生产汉堡,顾客来消费的过程: 场景分析: 资源类:Hamburger    设置汉堡数据:SetThread(生产者) 获取汉堡数据:GetThread(消费者) 测试类:HamburgerTest 不同种类的线程(生产者、消费者)针对同一资源(汉堡)的操作 当汉堡有存货的时候,汉堡师傅不再生产,顾客可消费;反之,汉堡师傅生产,顾客不可消费 是否有线程安全问题?当然。楼主在《线程安全问题》那篇文章给出了判定方式,在该场景全部满足。 代码构建:类里面的i属性是楼主为了效果好一些特意加的,与本文要说明的问题无关;   首先是资源类Hamburger.java,楼主这里为了模拟只简单的构造了3个字段,其中flag用来表示资源是否有数据。 1 package com.jon.hamburger; 2 3 public class Hamburger { 4 private String name;//汉堡名称… Read More »多线程等待唤醒机制之生产消费者模式

多线程之死锁产生

本篇楼主接着上篇多线程的安全问题继续讨论多线程的死锁问题。 我们可以构造这样一种场景:传统(理想)情况下,楼主吃饭必须用两支筷子,而楼主老板(美国人)吃饭必须要用一刀,一叉;现在,楼主手上有一支筷子和一把刀,老板手上有一支筷子和一把叉;当我们都在互相等待对方把餐具给我们时,出现相互等待的现象,都吃不了饭,从而形成死锁。 所以上篇所说到的解决多线程同步的安全问题又衍生出了:如果出现同步嵌套,就容易产生死锁的问题。上面的场景我们先用代码来实现看一看。 构建MyLock类,创建楼主,老板两个锁对象: 1 package com.jon.dielock; 2 3 public class MyLock{ 4 //创建2把所对象 5 public static final Object objA = new Object(); 6 public… Read More »多线程之死锁产生

线程安全问题

本文楼主主要以用户在售票厅购买车票为背景进行多线程的实现。假设A市到B市的车票共50张,共有3个售票窗口在进行售票,使用多线程来模拟理想情况下的用户购票: 实现Runnable的Ticket类: 1 package com.jon.thread; 2 3 public class TicketSell implements Runnable { 4 private int tickets = 50;//设置车票数量 5 @Override 6 public void run()… Read More »线程安全问题