posts - 24, comments - 27, trackbacks - 0, articles - 0

2012年5月20日

     摘要:      最近这些天学习了classLoader的原理, 原因是因为服务器上的一个java进程启动时加载两个不同版本的jar包, 含有相同名字的类, 而且服务端的jar包排在前面, 我上传的jar包排在后面, 于是每次都使用服务端的jar包, 我的jar包便无法生效, 因此希望修改classLader, 让它按相反的顺序加载jar包.  ...  阅读全文

posted @ 2012-05-20 19:43 俞灵 阅读(922) | 评论 (0)编辑 收藏

2012年3月24日

     摘要: High Availability for the HDFS Namenode Sanjay Radia, Suresh Srinivas Yahoo! Inc  (本文为namdnoe HA的设计文档翻译) 1.       问题阐述 有许多方法可以改善HDFS Namednoe(NN)的可用性,包括减少启动时间,更...  阅读全文

posted @ 2012-03-24 21:38 俞灵 阅读(1446) | 评论 (2)编辑 收藏

2011年11月28日

本文转自:
http://blog.csdn.net/zhouysh/article/details/304767

JAVA代码编写的30条建议
(1) 类名首字母应该大写。字段、方法以及对象(句柄)的首字母应小写。对于所有标识符,其中包含的所有单词都应紧靠在一起,而且大写中间单词的首字母。例如:
ThisIsAClassName
thisIsMethodOrFieldName
若在定义中出现了常数初始化字符,则大写static final基本类型标识符中的所有字母。这样便可标志出它们属于编译期的常数。
Java包(Package)属于一种特殊情况:它们全都是小写字母,即便中间的单词亦是如此。对于域名扩展名称,如com,org,net或者edu等,全部都应小写(这也是Java 1.1和Java 1.2的区别之一)。

(2) 为了常规用途而创建一个类时,请采取"经典形式",并包含对下述元素的定义:

equals()
hashCode()
toString()
clone()(implement Cloneable)
implement Serializable

(3) 对于自己创建的每一个类,都考虑置入一个main(),其中包含了用于测试那个类的代码。为使用一个项目中的类,我们没必要删除测试代码。若进行了任何形式的改动,可方便地返回测试。这些代码也可作为如何使用类的一个示例使用。

(4) 应将方法设计成简要的、功能性单元,用它描述和实现一个不连续的类接口部分。理想情况下,方法应简明扼要。若长度很大,可考虑通过某种方式将其分割成较短的几个方法。这样做也便于类内代码的重复使用(有些时候,方法必须非常大,但它们仍应只做同样的一件事情)。

(5) 设计一个类时,请设身处地为客户程序员考虑一下(类的使用方法应该是非常明确的)。然后,再设身处地为管理代码的人考虑一下(预计有可能进行哪些形式的修改,想想用什么方法可把它们变得更简单)。
(6) 使类尽可能短小精悍,而且只解决一个特定的问题。下面是对类设计的一些建议:
■一个复杂的开关语句:考虑采用"多形"机制
■数量众多的方法涉及到类型差别极大的操作:考虑用几个类来分别实现
■许多成员变量在特征上有很大的差别:考虑使用几个类

(7) 让一切东西都尽可能地"私有"--private。可使库的某一部分"公共化"(一个方法、类或者一个字段等等),就永远不能把它拿出。若强行拿出,就可 能破坏其他人现有的代码,使他们不得不重新编写和设计。若只公布自己必须公布的,就可放心大胆地改变其他任何东西。在多线程环境中,隐私是特别重要的一个 因素--只有private字段才能在非同步使用的情况下受到保护。

(8) 谨惕"巨大对象综合症"。对一些习惯于顺序编程思维、且初涉OOP领域的新手,往往喜欢先写一个顺序执行的程序,再把它嵌入一个或两个巨大的对象里。根据编程原理,对象表达的应该是应用程序的概念,而非应用程序本身。

(9) 若不得已进行一些不太雅观的编程,至少应该把那些代码置于一个类的内部。

(10) 任何时候只要发现类与类之间结合得非常紧密,就需要考虑是否采用内部类,从而改善编码及维护工作(参见第14章14.1.2小节的"用内部类改进代码")。

(11) 尽可能细致地加上注释,并用javadoc注释文档语法生成自己的程序文档。

(12) 避免使用"魔术数字",这些数字很难与代码很好地配合。如以后需要修改它,无疑会成为一场噩梦,因为根本不知道"100"到底是指"数组大小"还是"其他 全然不同的东西"。所以,我们应创建一个常数,并为其使用具有说服力的描述性名称,并在整个程序中都采用常数标识符。这样可使程序更易理解以及更易维护。

(13) 涉及构建器和异常的时候,通常希望重新丢弃在构建器中捕获的任何异常--如果它造成了那个对象的创建失败。这样一来,调用者就不会以为那个对象已正确地创建,从而盲目地继续。

(14) 当客户程序员用完对象以后,若你的类要求进行任何清除工作,可考虑将清除代码置于一个良好定义的方法里,采用类似于cleanup()这样的名字,明确表 明自己的用途。除此以外,可在类内放置一个boolean(布尔)标记,指出对象是否已被清除。在类的finalize()方法里,请确定对象已被清除, 并已丢弃了从RuntimeException继承的一个类(如果还没有的话),从而指出一个编程错误。在采取象这样的方案之前,请确定 finalize()能够在自己的系统中工作(可能需要调用System.runFinalizersOnExit(true),从而确保这一行为)。

(15) 在一个特定的作用域内,若一个对象必须清除(非由垃圾收集机制处理),请采用下述方法:初始化对象;若成功,则立即进入一个含有finally从句的try块,开始清除工作。

(16) 若在初始化过程中需要覆盖(取消)finalize(),请记住调用super.finalize()(若Object属于我们的直接超类,则无此必 要)。在对finalize()进行覆盖的过程中,对super.finalize()的调用应属于最后一个行动,而不应是第一个行动,这样可确保在需要 基础类组件的时候它们依然有效。

(17) 创建大小固定的对象集合时,请将它们传输至一个数组(若准备从一个方法里返回这个集合,更应如此操作)。这样一来,我们就可享受到数组在编译期进行类型检查的好处。此外,为使用它们,数组的接收者也许并不需要将对象"造型"到数组里。

(18) 尽量使用interfaces,不要使用abstract类。若已知某样东西准备成为一个基础类,那么第一个选择应是将其变成一个interface(接 口)。只有在不得不使用方法定义或者成员变量的时候,才需要将其变成一个abstract(抽象)类。接口主要描述了客户希望做什么事情,而一个类则致力 于(或允许)具体的实施细节。

(19) 在构建器内部,只进行那些将对象设为正确状态所需的工作。尽可能地避免调用其他方法,因为那些方法可能被其他人覆盖或取消,从而在构建过程中产生不可预知的结果(参见第7章的详细说明)。

(20) 对象不应只是简单地容纳一些数据;它们的行为也应得到良好的定义。

(21) 在现成类的基础上创建新类时,请首先选择"新建"或"创作"。只有自己的设计要求必须继承时,才应考虑这方面的问题。若在本来允许新建的场合使用了继承,则整个设计会变得没有必要地复杂。

(22) 用继承及方法覆盖来表示行为间的差异,而用字段表示状态间的区别。一个非常极端的例子是通过对不同类的继承来表示颜色,这是绝对应该避免的:应直接使用一个"颜色"字段。

(23) 为避免编程时遇到麻烦,请保证在自己类路径指到的任何地方,每个名字都仅对应一个类。否则,编译器可能先找到同名的另一个类,并报告出错消息。若怀疑自己碰到了类路径问题,请试试在类路径的每一个起点,搜索一下同名的.class文件。

(24) 在Java 1.1 AWT中使用事件"适配器"时,特别容易碰到一个陷阱。若覆盖了某个适配器方法,同时拼写方法没有特别讲究,最后的结果就是新添加一个方法,而不是覆盖现 成方法。然而,由于这样做是完全合法的,所以不会从编译器或运行期系统获得任何出错提示--只不过代码的工作就变得不正常了。

(25) 用合理的设计方案消除"伪功能"。也就是说,假若只需要创建类的一个对象,就不要提前限制自己使用应用程序,并加上一条"只生成其中一个"注释。请考虑将 其封装成一个"独生子"的形式。若在主程序里有大量散乱的代码,用于创建自己的对象,请考虑采纳一种创造性的方案,将些代码封装起来。

(26) 警惕"分析瘫痪"。请记住,无论如何都要提前了解整个项目的状况,再去考察其中的细节。由于把握了全局,可快速认识自己未知的一些因素,防止在考察细节的时候陷入"死逻辑"中。

(27) 警惕"过早优化"。首先让它运行起来,再考虑变得更快--但只有在自己必须这样做、而且经证实在某部分代码中的确存在一个性能瓶颈的时候,才应进行优化。 除非用专门的工具分析瓶颈,否则很有可能是在浪费自己的时间。性能提升的隐含代价是自己的代码变得难于理解,而且难于维护。

(28) 请记住,阅读代码的时间比写代码的时间多得多。思路清晰的设计可获得易于理解的程序,但注释、细致的解释以及一些示例往往具有不可估量的价值。无论对你自 己,还是对后来的人,它们都是相当重要的。如对此仍有怀疑,那么请试想自己试图从联机Java文档里找出有用信息时碰到的挫折,这样或许能将你说服。

(29) 如认为自己已进行了良好的分析、设计或者实施,那么请稍微更换一下思维角度。试试邀请一些外来人士--并不一定是专家,但可以是来自本公司其他部门的人。 请他们用完全新鲜的眼光考察你的工作,看看是否能找出你一度熟视无睹的问题。采取这种方式,往往能在最适合修改的阶段找出一些关键性的问题,避免产品发行 后再解决问题而造成的金钱及精力方面的损失。

(30) 良好的设计能带来最大的回报。简言之,对于一个特定的问题,通常会花较长的时间才能找到一种最恰当的解决方案。但一旦找到了正确的方法,以后的工作就轻松 多了,再也不用经历数小时、数天或者数月的痛苦挣扎。我们的努力工作会带来最大的回报(甚至无可估量)。而且由于自己倾注了大量心血,最终获得一个出色的 设计方案,成功的快感也是令人心动的。坚持抵制草草完工的诱惑--那样做往往得不偿失

posted @ 2011-11-28 14:34 俞灵 阅读(55) | 评论 (0)编辑 收藏

2011年11月21日

本文转自it186云计算频道,原文地址:cloud.it168.com

在互联网这个领域一直有这样的说法:“如果老二无法战胜老大,那么就把老大赖以生存的东西开源吧”。当年Yahoo!与Google还是处在 强烈竞争关系时候,招聘了Doug(Hadoop创始人),把Google老大赖以生存的DFS与Map-Reduce开源了,开始了Hadoop的童年 时期。差不多在2008年的时候,Hadoop才算逐渐成熟。

从初创到现在,Hadoop经过了至少7年的积累,现在的Hadoop不仅是当年的老二Yahoo的专用产品了,从Hadoop长长的用户名单中, 可以看到Facebook、Linkedin、Amazon,可以看到EMC、eBay、Twitter、IBM、Microsoft,、Apple、 HP…国内的公司有淘宝、百度等等。

本文将对Hadoop七年(2004-2011)的发展历程进 行梳理。读完本文后,将不难看出,Hadoop的发展基本上经历了这样一个过程:从一个开源的Apache基金会项目,随着越来越多的用户的加入,不断地 使用、贡献和完善,形成一个强大的生态系统,从2009年开始,随着云计算和大数据的发展,Hadoop作为海量数据分析的最佳解决方案,开始受到许多 IT厂商的关注,从而出现了许多Hadoop的商业版以及支持Hadoop的产品,包括软件和硬件。

  • 2004年,Google发表论文,向全世界介绍了MapReduce。
  • 2005年初,为了支持Nutch搜索引擎项目,Nutch的开发者基于Google发布的MapReduce报告,在Nutch上开发了一个可工作的MapReduce应用。
  • 2005年年中,所有主要的Nutch算法被移植到使用MapReduce和NDFS(Nutch Distributed File System )来运行。
  • 2006年1月,Doug Cutting加入雅虎,Yahoo!提供一个专门的团队和资源将Hadoop发展成一个可在网络上运行的系统。
  • 2006年2月,Apache Hadoop项目正式启动以支持MapReduce和HDFS的独立发展。
  • 2007年,百度开始使用Hadoop做离线处理,目前差不多80%的Hadoop集群用作日志处理。
  • 2007年,中国移动开始在“大云”研究中使用Hadoop技术,规模超过1000台。
  • 2008年,淘宝开始投入研究基于Hadoop的系统——云梯,并将其用于处理电子商务相关数据。云梯1的总容量大概为9.3PB,包含了1100台机器,每天处理约18000道作业,扫描500TB数据。
  • 2008年1月,Hadoop成为Apache顶级项目。
  • 2008年2月,Yahoo!宣布其搜索引擎产品部署在一个拥有1万个内核的Hadoop集群上。
  • 2008年7月,Hadoop打破1TB数据排序基准测试记录。Yahoo!的一个Hadoop集群用209秒完成1TB数据的排序 ,比上一年的纪录保持者保持的297秒快了将近90秒。
  • 2009 年 3 月,Cloudera推出CDH(Cloudera’s Distribution including Apache Hadoop)平台,完全由开放源码软件组成,目前已经进入第3版。
  • 2009年5月,Yahoo的团队使用Hadoop对1 TB的数据进行排序只花了62秒时间。
  • 2009年7月 ,Hadoop Core项目更名为Hadoop Common;
  • 2009年7月 ,MapReduce 和 Hadoop Distributed File System (HDFS) 成为Hadoop项目的独立子项目。
  • 2009年7月 ,Avro 和 Chukwa 成为Hadoop新的子项目。
  • 2010年5月 ,Avro脱离Hadoop项目,成为Apache顶级项目。
  • 2010年5月 ,HBase脱离Hadoop项目,成为Apache顶级项目。
  • 2010年5月,IBM提供了基于Hadoop 的大数据分析软件——InfoSphere BigInsights,包括基础版和企业版。
  • 2010年9月,Hive( Facebook) 脱离Hadoop,成为Apache顶级项目。
  • 2010年9月,Pig脱离Hadoop,成为Apache顶级项目。
  • 2011年1月,ZooKeeper 脱离Hadoop,成为Apache顶级项目。
  • 2011年3月,Apache Hadoop获得Media Guardian Innovation Awards 。
  • 2011年3月, Platform Computing 宣布在它的Symphony软件中支持Hadoop MapReduce API。
  • 2011年5月,Mapr Technologies公司推出分布式文件系统和MapReduce引擎——MapR Distribution for Apache Hadoop。
  • 2011年5月,HCatalog 1.0发布。该项目由Hortonworks 在2010年3月份提出,HCatalog主要用于解决数据存储、元数据的问题,主要解决HDFS的瓶颈,它提供了一个地方来存储数据的状态信息,这使得 数据清理和归档工具可以很容易的进行处理。
  • 2011年4月,SGI( Silicon Graphics International )基于SGI Rackable和CloudRack服务器产品线提供Hadoop优化的解决方案。
  • 2011年5月,EMC为客户推出一种新的基于开源Hadoop解决方案的数据中心设备——GreenPlum HD,以助其满足客户日益增长的数据分析需求并加快利用开源数据分析软件。Greenplum是EMC在2010年7月收购的一家开源数据仓库公司。
  • 2011年5月,在收购了Engenio之后, NetApp推出与Hadoop应用结合的产品E5400存储系统。
  • 2011年6月,Calxeda公司(之前公司的名字是Smooth-Stone)发起了“开拓者行动”,一个由10家软件公司组成的团队将为基于Calxeda即将推出的ARM系统上芯片设计的服务器提供支持。并为Hadoop提供低功耗服务器技术。
  • 2011年6月,数据集成供应商Informatica发布了其旗舰产品,产品设计初衷是处理当今事务和社会媒体所产生的海量数据,同时支持Hadoop。
  • 2011年7月,Yahoo!和硅谷风险投资公司 Benchmark Capital创建了Hortonworks 公司,旨在让Hadoop更加鲁棒(可靠),并让企业用户更容易安装、管理和使用Hadoop。
  • 2011年8月,Cloudera公布了一项有益于合作伙伴生态系统的计划——创建一个生态系统,以便硬件供应商、软件供应商以及系统集成商可以一起探索如何使用Hadoop更好的洞察数据。
  • 2011年8月,Dell与Cloudera联合推出Hadoop解决方案——Cloudera Enterprise。Cloudera Enterprise基于Dell PowerEdge C2100机架服务器以及Dell PowerConnect 6248以太网交换机

在梳理的过程中,笔者发现了上图,它很好地展现了Hadoop生态系统是如何在使用中一步一步成长起来的。

posted @ 2011-11-21 09:04 俞灵 阅读(105) | 评论 (0)编辑 收藏

2011年11月15日

本文转自:
http://linuxtoy.org/archives/bash-shortcuts.html

生活在 Bash shell 中,熟记以下快捷键,将极大的提高你的命令行操作效率。

编辑命令

  • Ctrl + a :移到命令行首
  • Ctrl + e :移到命令行尾
  • Ctrl + f :按字符前移(右向)
  • Ctrl + b :按字符后移(左向)
  • Alt + f :按单词前移(右向)
  • Alt + b :按单词后移(左向)
  • Ctrl + xx:在命令行首和光标之间移动
  • Ctrl + u :从光标处删除至命令行首
  • Ctrl + k :从光标处删除至命令行尾
  • Ctrl + w :从光标处删除至字首
  • Alt + d :从光标处删除至字尾
  • Ctrl + d :删除光标处的字符
  • Ctrl + h :删除光标前的字符
  • Ctrl + y :粘贴至光标后
  • Alt + c :从光标处更改为首字母大写的单词
  • Alt + u :从光标处更改为全部大写的单词
  • Alt + l :从光标处更改为全部小写的单词
  • Ctrl + t :交换光标处和之前的字符
  • Alt + t :交换光标处和之前的单词
  • Alt + Backspace:与 Ctrl + w 相同类似,分隔符有些差别 [感谢 rezilla 指正]

重新执行命令

  • Ctrl + r:逆向搜索命令历史
  • Ctrl + g:从历史搜索模式退出
  • Ctrl + p:历史中的上一条命令
  • Ctrl + n:历史中的下一条命令
  • Alt + .:使用上一条命令的最后一个参数

控制命令

  • Ctrl + l:清屏
  • Ctrl + o:执行当前命令,并选择上一条命令
  • Ctrl + s:阻止屏幕输出
  • Ctrl + q:允许屏幕输出
  • Ctrl + c:终止命令
  • Ctrl + z:挂起命令

Bang (!) 命令

  • !!:执行上一条命令
  • !blah:执行最近的以 blah 开头的命令,如 !ls
  • !blah:p:仅打印输出,而不执行
  • !$:上一条命令的最后一个参数,与 Alt + . 相同
  • !$:p:打印输出 !$ 的内容
  • !*:上一条命令的所有参数
  • !*:p:打印输出 !* 的内容
  • ^blah:删除上一条命令中的 blah
  • ^blah^foo:将上一条命令中的 blah 替换为 foo
  • ^blah^foo^:将上一条命令中所有的 blah 都替换为 foo

友情提示

  1. 以上介绍的大多数 Bash 快捷键仅当在 emacs 编辑模式时有效,若你将 Bash 配置为 vi 编辑模式,那将遵循 vi 的按键绑定。Bash 默认为 emacs 编辑模式。如果你的 Bash 不在 emacs 编辑模式,可通过 set -o emacs 设置。
  2. ^S、^Q、^C、^Z 是由终端设备处理的,可用 stty 命令设置。

posted @ 2011-11-15 10:04 俞灵 阅读(58) | 评论 (0)编辑 收藏


希望大家喜欢,自己留个备份,没事逛逛!!

http://www.javaalmanac.com - Java开发者年鉴一书的在线版本. 要想快速查到某种Java技巧的用法及示例代码, 这是一个不错的去处.
http://www.onjava.com - O'Reilly的Java网站. 每周都有新文章.
http://java.sun.com - 官方的Java开发者网站 - 每周都有新文章发表.
http://www.developer.com/java - 由Gamelan.com 维护的Java技术文章网站.
http://www.java.net - Sun公司维护的一个Java社区网站.
http://www.builder.com - Cnet的Builder.com网站 - 所有的技术文章, 以Java为主.
http://www.ibm.com/developerworks/java - IBM的Developerworks技术网站; 这是其中的Java技术主页.
http://www.javaworld.com - 最早的一个Java站点. 每周更新Java技术文章.
http://www.devx.com/java - DevX维护的一个Java技术文章网站.
http://www.fawcette.com/javapro - JavaPro在线杂志网站.
http://www.sys-con.com/java - Java Developers Journal的在线杂志网站.
http://www.javadesktop.org - 位于Java.net的一个Java桌面技术社区网站.
http://www.theserverside.com - 这是一个讨论所有Java服务器端技术的网站.
http://www.jars.com - 提供Java评论服务. 包括各种framework和应用程序.
http://www.jguru.com - 一个非常棒的采用Q&A形式的Java技术资源社区.
http://www.javaranch.com - 一个论坛,得到Java问题答案的地方,初学者的好去处。
http://www.ibiblio.org/javafaq/javafaq.html - comp.lang.java的FAQ站点 - 收集了来自comp.lang.java新闻组的问题和答案的分类目录.
http://java.sun.com/docs/books/tutorial/ - 来自SUN公司的官方Java指南 - 对于了解几乎所有的java技术特性非常有帮助.
http://www.javablogs.com - 互联网上最活跃的一个Java Blog网站.
http://java.about.com/ - 来自About.com的Java新闻和技术文章网站.

posted @ 2011-11-15 09:45 俞灵 阅读(51) | 评论 (0)编辑 收藏

2011年11月14日

本文转自

http://trinea.iteye.com/blog/1196400

 

1、jps的作用

jps类似linux的ps命令,不同的是ps是用来显示进程,而jps只显示java进程,准确的说是当前用户已启动的部分java进程信息,信息包括进程号和简短的进程command。

 

2、某个java进程已经启动,用jps却显示不了该进程进程号

这个问题已经碰到过两次了,所以在这里总结下。

现象:

用ps -ef|grep java能看到启动的java进程,但是用jps查看却不存在该进程的id。待会儿解释过之后就能知道在该情况下,jconsole、jvisualvm可能无法监控该进程,其他java自带工具也可能无法使用

 

分析:

java程序启动后,默认(请注意是默认)会在/tmp/hsperfdata_userName目录下以该进程的id为文件名新建文件,并在该文件中存储jvm运行的相关信息,其中的userName为当前的用户名,/tmp/hsperfdata_userName目录会存放该用户所有已经启动的java进程信息。对于windows机器/tmp用Windows存放临时文件目录代替。

 

而jps、jconsole、jvisualvm等工具的数据来源就是这个文件(/tmp/hsperfdata_userName/pid)。所以当该文件不存在或是无法读取时就会出现jps无法查看该进程号,jconsole无法监控等问题

 

原因:

(1)、磁盘读写、目录权限问题

若该用户没有权限写/tmp目录或是磁盘已满,则无法创建/tmp/hsperfdata_userName/pid文件。或该文件已经生成,但用户没有读权限

 

(2)、临时文件丢失,被删除或是定期清理

对于linux机器,一般都会存在定时任务对临时文件夹进行清理,导致/tmp目录被清空。这也是我第一次碰到该现象的原因

这个导致的现象可能会是这样,用jconsole监控进程,发现在某一时段后进程仍然存在,但是却没有监控信息了。

 

(3)、java进程信息文件存储地址被设置,不在/tmp目录下

上面我们在介绍时说默认会在/tmp/hsperfdata_userName目录保存进程信息,但由于以上1、2所述原因,可能导致该文件无法生成或是丢失,所以java启动时提供了参数,可以对这个文件的位置进行设置,而jps、jconsole都只会从/tmp目录读取,而无法从设置后的目录读物信息,

         这个问题只会在jdk 6u23和6u24上出现,在6u23和6u24上,进程信息会保存在-Djava.io.tmpdir下, 因此如果它被设置为非/tmp目录则会导致 jps,jconsole等无法读取的现象, 但在其他版本的jdk上,即使设置-Djava.io.tmpdir为非/tmp,  也会在/tmp/hsperfdata_userName下保存java进程信息.因此可以说这是6u23和6u24的bug,

         以下是jdk对该bug的描述地址:

bug描述:
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7021676
bug的修复描述:
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7009828
bug修改代码:
http://hg.openjdk.java.net/jdk7/hotspot/hotspot/rev/34d64ad817f4

 

 

关于设置该文件位置的参数为-Djava.io.tmpdir

posted @ 2011-11-14 16:15 俞灵 阅读(145) | 评论 (0)编辑 收藏

2011年11月11日

1.       根据上一章配好的集群,现为Myhost1配置backupNodeSecondaryNamenode, 由于机器有限,这里就不为Myhost2配置backupNodeSecondaryNamenode,但是方法相同.

2.       我们选定Myhost4SecondaryNamenode, Myhost5backupNode.

配置并启动SecondaryNamenode:

1.       配置:Myhost1 hdfs-site.xml 加入如下配置,指定SecondaryNamenode.

  <property>
    <name>dfs.namenode.secondary.http-address</name>
    <value> Myhost4:9001</value>
  </property>

2.       Myhost4hdfs-site.xml 加入如下配置,指定nnurl和本地的checkpoint.dir.

  <property>
    <name>dfs.federation.nameservice.id</name>
    <value> Myhost1:50070</value>
  </property>

  <property>
    <name>dfs.namenode.checkpoint.dir</name>
    <value>/home/yuling.sh/checkpoint-data</value>
  </property>

3.       启动SecondaryNamenode. Myhost1上运行命令:sbin/star-dfs.sh或者在Myhost4上运行sbin/hadoop-daemo.sh start SecondaryNamenode 即可以启动SecondaryNamenode. 可以通过log或者网页Myhost4:50090查看其状态. 另外在checkpoint.dir下会有元数据信息.

 

配置并启动backupNode:

1.       配置Myhost5hdfs-site.xml, 加入如下配置信息:

  <property>
    <name>dfs.namenode.backup.address</name>
    <value> Myhost5:9002</value>
  </property>
  <property>
    <name>dfs.namenode.backup.http-address</name>
    <value> Myhost5:9003</value>
  </property>
  <property>
    <name>dfs.namenode.http-address</name>
    <value> Myhost1:50070</value>
  </property>

  <property>
    <name>dfs.namenode.name.dir</name>
    <value>/home/yuling.sh/ backup-data</value>
  </property>

2.       启动backupNode, Myhost5上运行bin/hdfs namenode –backup &

3.       dfs.namenode.name.dir下查看元数据信息.


下一篇博客将讲述如何搭建hadoop 0.23 的mapreduce

posted @ 2011-11-11 14:59 俞灵 阅读(1423) | 评论 (1)编辑 收藏

2011年11月10日

使用hadoop-0.23 搭建hdfs,  namenode + datanode

1.       HDFS-1052引入了多namenode, HDFS架构变化较大, 可以参考hortonworks的文章: http://hortonworks.com/an-introduction-to-hdfs-federation/.

我将在接下来的博客里把此文章翻译一下(另外还有: http://developer.yahoo.com/blogs/hadoop/posts/2011/03/mapreduce-nextgen-scheduler/).

所有namenode共享datanode, 各个namenode相互独立, 互不影响, 每个namenode都有一个backupNodeSecondaryNamenode,提供主备切换功能和备份元数据的功能.

下文的配置信息主要参考HDFS-2471.

2.       环境:

a)         五台机器 ,linux系统,

b)         互相添加ssh-key,后应该可以不用密码互连

c)         编译好的0.23版本的包: hadoop-0.23.0-SNAPSHOT.tar.gz

d)         每台机器需要安装java1.6或以上版本.并把JAVA_HOME加到$PATH.

e)         最好加上psshpscp工具.

这里把五台机器命名为:

 Myhost1

      Myhost2

      Myhost3

Myhost4

      Myhost5

     假设我们需要搭建如下集群:

Myhost1Myhost2开启 namenode, 另外三台机器启动datanode服务.

3.       首先把分配到五台机器上,然后解压.(推荐使用pscp, pssh命令)

4.       然后在五台机器上安装java,并把JAVA_HOME加到$PATH

5.       进入解压后的hadoop目录, 编辑 etc/hadoop/hdfs-site.xml

a)         Myhost1的配置如下(其中hadoop存放在/home/yuling.sh/目录下):

 <property>
    <name>fs.defaultFS</name>
    <value>hdfs:// Myhost1:9000</value>
  </property>

  <property>
    <name>dfs.namenode.name.dir</name>
    <value>/home/yuling.sh/cluster-data</value>
  </property>

b)         Myhost2的配置如下(其中hadoop存放在/home/yuling.sh/目录下):

 <property>
    <name>fs.defaultFS</name>
    <value>hdfs:// Myhost2:9000</value>
  </property>

  <property>
    <name>dfs.namenode.name.dir</name>
    <value>/home/yuling.sh/cluster-data</value>
  </property>

 

c) 这里把Myhost1集群起名ns1, Myhost1集群起名ns2, 三台slavaetc/hadoop/hdfs-site.xml配置如下:

 <property>
    <name>dfs.federation.nameservices</name>
    <value>ns1,ns2</value>
  </property>


  <property>
    <name>dfs.namenode.rpc-address.ns1</name>
    <value>hdfs:// Myhost1:9000</value>
  </property>


  <property>
    <name>dfs.namenode.http-address.ns1</name>
    <value> Myhost1:50070</value>
  </property>

  <property>
    <name>dfs.namenode.rpc-address.ns2</name>
    <value>hdfs:// Myhost2:9000</value>
  </property>
  <property>
    <name>dfs.namenode.http-address.ns1</name>
    <value> Myhost2:50070</value>
  </property>

  <property>
    <name>dfs.datanode.data.dir</name>
    <value>/home/yuling.sh/datanode</value>
  </property>  

d) 解释:namenode需要指定两个参数, 用于存放元数据和文件系统的URL. Datanode需指定要连接的namenode rpc-addresshttp-address. 以及数据存放位置dfs.datanode.data.dir.

6.       然后编辑两台namenodehadoop目录下 etc/hadoop/slaves文件. 加入三台slave机器名:

Myhost3

Myhost4

      Myhost5

 

7.       现在需要格式化namenode, 由于namenode共享datanode, 因此它们的clusterid需要有相同的名字.这里我们把名字设为 yuling .命令如下:

bin/hdfs namenode –format –clusterid yuling

两台机器格式话之后会在/home/yuling.sh/cluster-data下生成元数据目录.

8.       启动Myhost1Myhost2上的namenodeslavedatanode服务. 命令如下:

   sbin/start-hdfs.sh

分别在Myhost1Myhost2下运行.

9.       启动之后打开浏览器, 分别查看两namenode启动后状态. URL:

Myhost1:50070Myhost2:50070

10.   这期间可能会遇到许多问题, 但是可以根据抛出的异常自己解决, 我这里就不多说了.

下一篇博客将讲述如何启动backupNodeSecondaryNamenode

 

posted @ 2011-11-10 21:29 俞灵 阅读(910) | 评论 (3)编辑 收藏

编译(环境linux, 需要联网)

1.       首先下载hadoop 0.23版本

svn checkout http://svn.apache.org/repos/asf/hadoop/common/tags/release-0.23.0-rc0/

2.       进入release-0.23.0-rc0目录下能看到INSTALL.TXT文件, 这里有编译hadoop 0.23的教程.

编译前的准备:.

a)         * Unix System

b)         * JDK 1.6

c)         * Maven 3.0

d)         * Forrest 0.8 (if generating docs)

e)         * Findbugs 1.3.9 (if running findbugs)

f)          * ProtocolBuffer 2.4.1+ (for MapReduce)

g)         * Autotools (if compiling native code)

h)         * Internet connection for first build (to fetch all Maven and Hadoop dependencies)

可以根据需要安装全部或部分的工具,然后把它们加入到$PATH. 这里介绍一下ProtocolBuffer的安装方法:下载2.4.1版本后解压,进入目录,运行如下命令即可.

$ ./configure --prefile=/usr/local

$ make

$ sudo make install

3.       经过第二步准备之后,由于从hadoop0.23开始使用Maven编译,因此必需联网,命令如下:

mvn package [-Pdist][-Pdocs][-Psrc][-Pnative][-Dtar]

建议先运行命令: mvn package -Pdist -DskipTests –Dtar (前提Maven 3.0ProtocolBuffer2.4.1以上), 此命令成功之后会在release-0.23.0-rc0/下生成 hadoop-dist/target/hadoop-0.23.0-SNAPSHOT.tar.gz. 可以使用这个包搭建集群.

使用-Pdocs选项可以生成文档,当然前提是安装了Forrest 0.8Findbugs 1.3.9. 可以参考如下命令手动指定:FORREST_HOMEFINDBUGS_HOME.

mvn package -Pdocs -DskipTests -Dtar -Dmaven.test.skip -Denv.FORREST_HOME=/usr/local/apache-forrest-0.9  -Denv.FINDBUGS_HOME=/usr/local/findbugs-1.3.9

生成的文档在各自的target/site目录下.

经过以上步骤,我们已经编译好了hadoop-0.23,现在可以使用hadoop-0.23.0-SNAPSHOT.tar.gz来搭建集群了.

 

下一篇博客将讲述如何使用hadoop-0.23 搭建hdfs集群

posted @ 2011-11-10 21:26 俞灵 阅读(1659) | 评论 (6)编辑 收藏