HDFS datanode阅读手记

2013年1月28日 没有评论

1. Hign Level Module View

datanode modules

  • HttpServer: 提供http service, 展示内部状态信息
  • IPCServer: Rpc service framework, 模块间的交互都通过rpc来完成(Block数据传输除外)
  • DataXceiverServer: 数据传输server, 提供Block数据的读写修改等功能
  • BlockPoolManager: 提供管理BlockPool的相关API。其中,BlockOfferService为每个Namespace下每个BlockPool一个实例,提供BlockPool对它所对应的Namespace的操作的相关API, BlockServiceActor为指定Namespace中每个namenode一个实例,自已持有线程,定时向它所对应的namenode发heartbeat, blockreport, 并执行namenode通过heartbeat/blockreport response传回来的command
  • FsDataset: 封装了datanode所管理的所有的block相关数据,提供相关的API,其中FsVolume封装了对单块盘的相关的操作
  • 阅读全文…

分类: BigData, HDFS 标签: , , 1,971 views

Hadoop, Hbase, Zookeeper安全实践

2012年12月31日 19 条评论

过去的一个月,一直在折腾Hadoop, Hbase, Zookeeper的安全,中间碰到各种坑,在这里做一个简单的总结,希望能够抛砖引玉,与感兴趣的朋友交流一些实践经验。说到安全,这里主要包括两个方面,一个是Authentication,一个是Authorization:

  • Authentication要做的事情,是认证用户的身份,即你说你是A用户, Authentication要确保你真的是A,而不是B;
  • Authorization要做的是权限控制,就是对A用户只能操作它自己有权限的实体(比如HDFS的文件,Hbase的表),对于他没有权限的他不能操作。

有了Authentication和Authorization,总体上算是比较安全了,基本上不会出现,像A用户误删了B用户的数据的事情。在Hbase/Hadoop/Zookeeper中,Authentication是通过Kerberos是实现的,Authorization有各自的实现,相比而言,Authentication的实现相对复杂一些,里面的坑也比较多,因此本篇文章的大部分篇幅会以Authentication为主。对Kerberos之前没了解的同学,可以看一下这篇文章:[Hadoop Kerberos安全机制介绍][1],里面介绍Kerberos认证原理的部分讲得比较清楚。下面就我在实践过程中遇到的一些坑做一个总结。

在实践开始之前,先安装好Kerberos服务器,kerberos的安装比较简单,也不是本文要讨论的内容,直接在google搜索,相关的tutorial应该比较多,照着一步步做下来一般都不会有问题,需要注意的就是区分OS发行版,比如Ubuntu和CentOS,会有一些细微的差别。 阅读全文…

Hadoop/Hbase配置集成Ganglia

2012年11月11日 3 条评论

Hadoop/Hbase是开源版的google Bigtable, GFS, MapReduce的实现,随着互联网的发展,大数据的处理显得越发重要,Hadoop/Hbase的用武之地也越发广泛。为了更好的使用Hadoop/Hbase系统,需要有一套完善的监控系统,来了解系统运行的实时状态,做到一切尽在掌握。Hadoop/Hbase有自己非常完善的metrics framework, 里面包种各种维度的系统指标的统计,另外,这套metrics framework设计的也非常不错,用户可以很方便地添加自定义的metrics。更为重要的一点是metrics的展示方式,目前它支持三种方式:一种是落地到本地文件,一种是report给Ganglia系统,另一种是通过JMX来展示。本文主要介绍怎么把Hadoop/Hbase的metrics report给Ganglia系统,通过浏览器来查看。

介绍后面的内容之前有必要先简单介绍一下Ganglia系统。Ganglia是一个开源的用于系统监控的系统,它由三部分组成:gmond, gmetad, webfrontend, 三部分是这样分工的:

  • gmond: 是一个守护进程,运行在每一个需要监测的节点上,收集监测统计,发送和接受在同一个组播或单播通道上的统计信息
  • gmetad: 是一个守护进程,定期检查gmond,从那里拉取数据,并将他们的指标存储在RRD存储引擎中
  • webfrontend: 安装在有gmetad运行的机器上,以便读取RRD文件,用来做前台展示

简单总结它们三者的各自的功用,gmond收集数据各个node上的metrics数据,gmetad汇总gmond收集到的数据,webfrontend在前台展示gmetad汇总的数据。Ganglia缺省是对系统的一些metric进行监控,比如cpu/memory/net等。不过Hadoop/Hbase内部做了对Ganglia的支持,只需要简单的改配置就可以将Hadoop/Hbase的metrics也接入到ganglia系统中进行监控。 阅读全文…

分类: BigData, HBase, HDFS, MapReduce 标签: , , , , 3,859 views

我在腾讯的四年

2012年10月24日 21 条评论

不知不觉,来深圳已经四年了,大四的时候实习近一年,毕业以后正式工作三年。终于到了要说再见,离开的时候了。离别总是会让人伤感,过去的四年,有太多太多的回忆。希望能够写些什么,以此为自已的这四年划上一个句点,也是想以后自已回忆这四年的时候,所经历的人,所经历的事,都还能想起。谨以此文,记述过往四年。

2008年5月,拿到腾讯搜索技术研发中心暑期实习的Offer。2008年7月,我们一行8人,怀着满腔热血,来到了深圳这片热土。我被分到了下载组,就是现在下载中心的前身。当时的人还不多,加上编辑和测试MM,20人左右。当时我的Mentor,也就是后来我的Leader Welkin,他是我步入职场引路人,我后面的成长与进步,他都给予了非常大的帮助与支持。实习的日子,虽说没有KPI考核的压力,但是一直以来,对自已有比较高的要求,这是从上中学时就形成的习惯,同时也是因为是自已的第一份相对比较正式的工作,所以,每次Mentor分配任务下来,我都尽最大的努力,以我力所能及的最快的速度、最好的质量完成,然后及时反馈给Mentor。当时确实对这些也没想太多,只是简单的想尽自已的努力把事情做好。等到了2个月以后的实习生留用的时候,过去2个月的表现起到了非常大的作用。Mentor和当时下载组的Leader都找我谈话,希望我能留下来,他们也为我争取了不错的Offer,比当时普通的硕士生的Offer还要好一些。因为当时我在ZJU也够了保研的资格,所以在保研和工作之间犹豫了很久,不过最终还是决定留了下来。既然决定要留下来了,也就意味着放弃了ZJU保研的机会,加上大四除了毕设也没有别的课程,所以,就继续留在深圳,即没有回去参加学校的保研面试,也没和找工作的同学再去挤校园招聘的独木桥。 阅读全文…

分类: 生活感悟 标签: , , , , 6,663 views

Haskell学习笔记(1)

2012年7月21日 4 条评论

之前看过一些对函数式编程(Function Programming,简称FP)的介绍,一直想通过学习一门FP的语言,来深入了解一下FP。Haskell,就是众多FP语言中的一门,它是一门纯粹的FP语言,是学习FP不错的选择。今天这篇文章主要是对Haskell的一个简单介绍,以及一些正式开始学习之前的准备工作。

  • 1. 什么是Haskell
  • Haskell, 是一门纯粹的函数式的程序设计语言,它是基于Lambda Calculus的。做为一门函数式的语言(Funcitonal Language),与传统的命令式的语言(Imperative Language)相比,它的主要优势在于,代码更为简洁,可靠性更好,语义非常直观,在很大程度上提高了程序员的产出率。
    在开始学习Haskell之前,我们先来看一个例子,相信通过这个例子,读者朋友会对Haskell有一个直观的印象,想学习FP的朋友,会爱上Haskell的:

    1
    2
    
    qsort [] = []
    qsort (p:xs) = qsort [x | x< -xs, x<p] ++ [p] ++ qsort [x | x<-xs, x>=p]

    上面是一个Haskell版本的quick sort,学习过C/C++/Java等命令式语言的朋友,应该知道通过命令式语言实现的quicksort, 大概需要10-20行的代码。相比而言,Haskell版本的quick sort,是多么的简洁、直观。下面简单解释一下上面的代码:第一行是初始化,输入一个空的list, 返回也是一个空的list; 第二行,qsort的输入一个list,把这个list分成两部分,一部分是单独的元素p, 一部分是除去p之外剩下的部分xs,xs也是一个list. 那么,对入p:xs这个list排序的结果就是:对xs中小于p的部分排序的结果,p和对xs中不小于p的部分排序的结果这三部分组成的list。Isn’t it amazing? 阅读全文…

分类: Haskell 标签: 1,931 views

C++模板类继承中的Name Lookup

2012年6月26日 5 条评论

今天这篇文章说说C++中的模板类继承时的名称(变量/类型)查找(Name Lookup)。普通的继承关系中的Name Lookup对于熟悉C++的同学来说,都是非常直观的,因此在这里就不再赘言。模板类(Template Class)的继承中,由于模板本身特殊性,使其在Name Lookup时,有着一定的特殊性,我们从一个例子来说明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
template< typename T>
class A
{
protected:
    int m_data;
};
 
template< typename T>
class B : public A< T>
{
public:
    void Test(int t)
    {   
        m_data = t;
    }   
};
 
int main(int argc, char** argv)
{
    B< int> b;
    b.Test();
}

阅读全文…

分类: 程序人生 标签: , , , 1,829 views

python MySQLdb连接mysql失败

2012年6月1日 6 条评论

最近了解了一下django,数据库选用了mysql, 在连接数据库的过程中,遇到一点小问题,在这里记录一下,希望能够对遇到同样的问题的朋友有所帮助,少走一些弯路。关于django,想在这里也额外说一句。django是很优秀的基于python的web开发框架,对于有python基础的后台程序员,如果有要做一些前台的需求,强烈推荐django。下面言归正传。

  • 1. 问题的现象
  • 下面是连接数据库的代码,用的是python的MySQLdb模块:

    1
    2
    3
    4
    5
    
    db = MySQLdb.connect(host='localhost',
                         port=3306,
                         user='root',
                         passwd='root98',
                         db='mysite')

    下面是运行的时候报的错误: 阅读全文…

分类: 技术杂记 标签: , , 6,640 views

《高效程序员的45个习惯-敏捷开发修炼之道》(下)

2012年5月13日 没有评论

四. 敏捷反馈
一步行动,胜过千万专家的意见。

  • 19. 守护天使:编写能产生反馈的代码,单元测试是不错的实践。使用自动化的单元测试,好的单元测试能够让你的代码问题提供及时的警报。可以使用一些成熟的单元测试框架,比如gtest for C/C++, PyUnit for python, Junit for Java, etc。
  • 20. 先使用它再实现它:测试驱动开发,编程之前,先写测试
  • 21. 不同环境, 就有不同问题:使用持续集成工具,在每一种支持的平台和环境中运行单元测试。要积极地寻找问题,而不是等问题来找你。
  • 22. 自动验收测试:为核心的业务逻辑创建测试,让你的客户单独验证这些测试,要让他们像一般的测试一样可以自动运行。
  • 23. 度量真实的进度:不要用不恰当的度量来来欺骗自己或者团队,要评估那些需要完成的待办事项,可以做成待办事项列表,完成一项移除一项,真实的度量剩下的工作量。
  • 24. 倾听用户的声音:每一个抱怨背后都隐藏了一个事实,找出真相,修复真正的问题。没有愚蠢的用户,只有愚蠢、自大的开发人员。

阅读全文…

《高效程序员的45个习惯-敏捷开发修炼之道》(上)

2012年5月12日 没有评论

敏捷精神:一种把以人为本、团队合作、快速响应变化和可工作的软件作为宗旨的开发方法

一. 态度决定一切
选定了要走的路,就是选定了字通往的目的地。

  • 1. 做事: 指责不会修复bug, 把矛头对准问题解决的方法,而不是人。一个重大的错误应该被当作是一次学习而不是指责他人的机会。团队成员在一起工作,应相互帮助,而不是相互指责。
  • 2. 欲速则不达:不要因为时间紧迫给自己找接口,而坠入快速简单的修复之中。在没有真正解理代码之前,不要急于进行bug修复。必须要投入时间和精力来了解代码是如何工作的,保证修复后的代码是整洁、敞亮的,修复本身是没有副作用的。
  • 3. 对事不对人:每个人都会有好的想法,也会有不对的想法,团队中的每个人都需要自由地表达观点。让我们骄傲的应该是解决了问题,而不是比较出谁的主意更好。团队leader既要做到不带个人情绪,又要做到不盲目接受所有观点。
  • 4.排除万难,奋勇前进:做正确的事,要诚实,要有勇气说出实情。

阅读全文…

jQuery and Highcharts

2012年4月3日 没有评论

最近新做的系统刚刚上线,前段时间的努力终于有了阶段性的成果,可以小小的庆贺一下。当然,这只是题外话了,主要目的是为了引入今天的正题——Jquery和Highcharts。在进入正式的内容之前,有必要先简单介绍一下jQuery和Highcharts分别是什么:
jQuery (http://jquery.com)
jQuery is a fast and concise JavaScript Library that simplifies HTML document traversing, event handling, animating, and Ajax interactions for rapid web development. jQuery is designed to change the way that you write JavaScript.
(jQuery是一个快速、简洁的Javascript库,它的主要功能是简化Html文档的遍历、事件处理、动画和ajax交互,从而加快web端的开发。jQuery设计的初衷是改变程序员使用Javascript写程序的方式。)

Highcharts (http://www.highcharts.com)
Highcharts is a charting library written in pure JavaScript, offering intuitive, interactive charts to your web site or web application. Highcharts currently supports line, spline, area, areaspline, column, bar, pie and scatter chart types.
(Highchars是一个用纯Javascript写的图表绘制的库,它可以为你的web app提供直观、交互式的图表。当前,用Highcharts可以实现直线图、曲线图、区域图、曲线区域图、柱状图、条形图、饼图、散点图等一系列的图表。) 阅读全文…

谈谈定时器(Timer)的使用

2012年3月11日 1 条评论

过去的半年,陆陆续续看过不少新同学写的代码,自己也写了不少代码。在这过程中,还是有不少感触的。我们知道,定时器(Timer)在程序中的是非常有用的一种utility。今天这篇文章,就结合自己看代码、写代码过程中的一些经验,来谈谈定时器的使用,包括基本的用法,还有使用过程中的一些误区。

在介绍定时器的使用之前,先简单介绍一下常见的定时器的实现。通常,定时器的是由一个单独的线程+一个最小堆来实现的。单独的线程基本上保证定时事件不被其他事件而阻塞,能够及时调度到,从而保证定时器的在时间上的“准确性”;用最小堆来做为核心的数据结构,主要是为了性能考虑,以时间为key,这样堆顶的元素就是最先到期的,因此每次check的时候,直接从堆顶开始check, 只到遇到第一个没到期的元素为止,这里的复杂度与在堆里的元素个数无关,可以看作是O(1)的,因此性能上还是比较有保障的。

接下来说说定时器的基本用法,通常情况下,定时器有两类主要的应用:一类是周期性的执行某个指定的动作;一类是延后特定的时间,执行指定的动作。第一类我们通常叫周期性定时器(PeriodTimer),第二类叫一次型定时器(OneshotTimer) 。 阅读全文…

分类: 程序人生 标签: , 1,277 views

让你的Linux终端色彩斑斓!

2012年3月4日 没有评论

做为一名linux后台开发工程师,每天面对着只有黑白两色的linux终端,你是否曾想过,让你的终端也能五彩斑斓起来,让每天的开发生活不再只是黑白那么的单调。只要你能想到,就一定会有实现的办法。接下来,我将一步步为你接开Linux终端显示彩色的神秘面纱。
1. 先照下面的例子,在你的终端操作,来一个直观的印象。

相信细心的朋友通过对比上面的例子,应该能看出上面的例子的一些特点,我在这里就不卖关子了,基本的格式是:

1
echo "< ctrl-v >< escape >[xxmHello world< ctrl-v >< escape >[yym"

其中,xx和yy分别是各种颜色的代码,通过它们可以来控制要显示的色彩的种类。在色彩码前面有三个特殊的字符,一个是< ctrl-v >,一个是< escape >,一个是[,这些都是必须的。 阅读全文…

分类: 技术杂记 标签: , , 4,391 views

HttpTunnel技术介绍

2012年2月13日 3 条评论

1. 概述

HttpTuunnel(也叫Http隧道,Http穿梭),是这样一种技术: 它用HTTP协议在要通信的Client和Server建立起一条”Tunnel”,然后Client和Server之间的通信,都是在这条Tunnel的基础之上。

HttpTunnel通常被用在受限的网络环境中,比如在NAT环境中的Client,受防火墙限制的环境中的Client等,在这样的环境中,Client不能直接连接到公网(WAN)的Server,这时候就可以通过HttpTunnel技术,来解决上述问题。
2. 原理
阅读全文…

分类: 技术杂记 标签: , 3,321 views

再见,2011!

2012年1月15日 2 条评论

又一年过去了,每年到了年底的时候,总会感叹光阴比箭还快,离开家又整整一年了。回看了一下年初给自己制定的计划,感慨满满,总觉得要写点什么,来对过去的一年有个交待,那就写点什么吧。

首先说一下工作,过去的一年,是整个搜索后台大重构最重要的一年,从基础的云平台,到基本的搜索的后台,几乎都在重构。说实话,这一年大家都很累,但换个角度来讲,这对我们来说也是一个机会,一个深入了解搜索引擎后台各个系统的机会。从我个人的角度而言,这一年确实学到不少。下半年有幸以PM的身份,带领小团队做了其中的一个子系统。从项目整体的进度和质量来讲,还是令人满意的,期望后面接入业务后也能让人满意。从单纯的工程师,到PM的转变,对我来讲,是一种考验。单纯做为一名工程师,只要高质量地完成好自己所负责的模块,配合好与相关模块之间的调试即可;但是做为PM,同是也是工程师,一方面要完成好自己所负责的模块,另一方面,更重要的是协调好整个团队的资源,帮助团队成员一起成长。在这个期间,真正的感受到了“众人拾材火焰高”,大家共同成长,团队才会出成绩。另外,这期间,也确实发现了自身存在的一些问题,因为团队成员中大多是这两年新入职的毕业生,项目经验还相对比较少,所以有时候,出现一些这样那样的问题的时候,自己还是有点急性子了。事后自己也反省了一下,对新人更重要的是要耐心,耐心地帮助新人成长,当每个新人都成长起来,能独挡一面的时候,就是整个团队战斗力最强的时候。所以,这半年来讲,不仅是技术上的成长,更为感到欣慰的是,自己不再只是考虑只要做好自己就行了,更重要的是学会如何在做好自己的同时,处理好与团队成员之间的关系,与团队成员共同成长,这是职场中最为重要的财富。 阅读全文…

分类: 我的观点, 生活感悟 标签: 441 views

用google-perftool分析程序的内存/CPU使用

2012年1月3日 3 条评论

最近,用到了google-perftool分析程序的内存和CPU的使用情况,总结一下使用的一些方法和体会,分享给有需要的朋友。首先,说说google-perftool,它是由google开发的用来分析C/C++程序性能的一套工具,这里的性能分析主要包括内存和CPU两个方面,内存分析使用google-perftool所提供的tcmalloc,CPU分析使用它所提供的profiler。下面先分别介绍一下tcmalloc和profiler,然后再给出一些使用的例子,及一些使用时的注意事项。

  • 1. tcmalloc
  • tcmalloc的全称是thread cache malloc,顾名思义,它是带有thread cache的内存管理工具,具体的实现细节这里不做过多的介绍,感兴趣的朋友可以参考google官方提供的文档,或者阅读源码。这里需要注明一下tcmalloc的一些优点,和它所提供的一些分析程序内存使用的一些功能。
    tcmalloc的主要优点有两个方面,一个是内存allocate/deallocate的速度,通常情况下它的速度比glibc所提供的malloc要快;另一个方面是小内存(< =32K)的管理,它的小内存是在thread cache里面管理的,一方面减少了加锁的开销,另一方面用来表示小内存所用的额外的空间也比较小,比较节省空间。因此,对于多线程下,经常小内存的allocation/deallocation的程序(尤其多线程下使用STL比较多的程序),可以尝试使用一下tcmalloc。 阅读全文…