一、浅谈
hadoop名字源自于DougCutting的儿子的玩具大象,叫hadoop。
形成过程:Lucene-->nutch-->hadoop。
在hadoop上做开发最主流的手段是java。
二、术语解释
NDFS:Nutch Distributed FileSystem 分布式文件系统
Pig:轻量级语言,一些不懂java的开发者可以在pig上输入一些命令,通过pig,可以将这些命令提交到map-reduce上,进行map-reduce的工作,然后再把结果返回来给用户。起到的作用就是用户和map-reduce中间的一个转换器的作用。
Hive:相当于sql语言到map-reduce的映射器,面向只懂得用sql语言去操作数据库的工程师,只需要在命令提示符下输入sql,则Hive可以将sql自动转变成map-reduce,转变成分布式任务,在各个节点去运行。运行的结果在通过Hive返回来给工程师。也可以将Hive理解为一个关系型数据库,但是Hive的功能比较简单,不能支持全部的sql,大概只能支持到sql92标准的其中的大部分。
HBase:是一种NoSQL数据库,即非关系型的数据库。是列式数据库,使用链式存储。传统的关系型数据库是行式数据库,如Oracle;而HBase是主要面向数据分析的,所以他的数据不是按行来存放,而是按列来存放。这样可以提高响应的速度,并且减少IO的量。HBase本身也可以做成一个分布式集群,是目前比较热门的东西。
ZooKeeper:主要负责服务器节点以及进程间通讯,是一种通讯的协调工具。
Chukwa:相当于一个数据集成工具。比如我们有很多数据源,那么怎样将分布的数据源(如日志信息)等按时抓取到我们的hadoop中呢?Chukwa这个软件可以帮忙。
三、Hadoop架构
Hadoop架构:
四、Hadoop的后台进程
与Oracle一样,Hadoop也有后台进程。各个后台进程中,最重要的是NameNode(名称节点)。
JobTacker、NameNode、Secondary NameNode称为Master节点,他们组成了NDFS的体系。
DataNode称为slave节点。
第一个后台进程:NameNode(名称节点)
1,他是HDFS的守护程序,是HDFS的核心程序,它起到这个分布式文件系统的总控的作用。
2,记录数据是如何分割成数据块的,以及这些数据块被存储在哪些节点上(分布式)。
3,对内存和IO进行集中的管理。当用户跟整个hadoop的集群打交道的时候,一般首先会访问NameNode来获得他要的文件的分布状态的信息,也就是说先找出需要的文件是在哪些数据节点里面,然后用户再跟数据节点打交道,把数据拿到手。所以NameNode在整个Hadoop中起到一个核心的功能。
4,但是,Hadoop一直以来都是把NameNode作为一个单点,也就是整个hadoop中只有一个 NameNode服务器,所以一旦NameNode节点发生故障,将使整个集群崩溃。
第二个后台进程:Secondary NameNode(辅助名称节点)
主要作为NameNode的后备,它可以将NameNode中的元数据信息再多保存一份副本,也就是说NameNode会不断跟Secondary NameNode通讯,不断把它里面的数据往辅助名称节点这边放。一旦NameNode崩溃了,我们可以用Secondary NameNode去代替它。保护集群的运行。但是现在还不能实现二者之间的自动切换,也就是说,现在不能在NameNode倒下以后,自动将Secondary NameNode启动起来,必须手工做。所以在hadoop中,NameNode还是一个事实上的单点。
1,监控HDFS状态的辅助后台程序。
2,每个集群都有一个。
3,与NameNode进行通讯,定期保存HDFS元数据快照。
4,当NameNode故障,可以作为备用NameNode使用。
第三个后台进程:DataNode(数据节点)
运行在各个子节点里面。一般放在从服务器上,负责文件系统的具体的数据块的读写。
1,每个服务器都运行一个。
2,负责把HDFS数据块读写到本地文件系统。
Map-Reduce体系的两个后台进程:
JobTacker进程(支柱):作业跟踪器
运行在主节点上的一个很重要的进程,起到了对Map-Reduce体系总控(总调度)的作用。
1,用于处理作业(用户提交的代码)的后台程序。
2,决定有那些文件参与处理,然后切割成task并分配节点。
它决定有哪些文件参与这个作业的处理,然后把这个作业切割成一个一个的小任务,在把这些任务分配到数据所在的节点里面去。Hadoop的运行是 就近原则,就是程序要跟数据在同一个物理节点里面,数据在哪里,这个小任务就应该跑去哪里。
3,监控task,重启失败的task(于不同的节点),释放死掉的程序所占用的资源。
4,每个集群只有唯一一个JobTacker,位于Master节点。
TaskTacker进程:任务跟踪器
1,位于slave节点上,于DataNode结合,即代码与数据一起的原则。在从服务器节点里,既有管理HDFS的DataNode,又有管理Map-Reduce任务的TaskTracker,作用就是管理这个节点上的task,这个task是由JobTacker分配过来的。根据JobTacker的第二点所述,每一个小任务都要去它需要操作的那些数据的DataNode节点,如上图所示。
2,管理各自节点上的task(由JobTacker)分配。在上条中已经提到。
3,每个节点只有一个TaskTracker,但一个TaskTacker可以启动多个JVM,用于并行执行map或reduce任务。对于hadoop来说,这些map-reduce任务也都是java。
4,与JobTacker交互。这些task会跟JobTacker进行通讯,只用通讯才能让JobTacker知道每个节点任务完成的状态情况,比如任务有没有失败,进程有没有死掉,都可以通过通讯来了解。
五、Master与Slave解释:
Master:就是运行了NameNode或Secondary NameNode或JobTacker的那个节点。在hadoop中,Master不一定是唯一的, 有可能是好几台机器,比如NameNode是一台机器,Secondary NameNode又是一台机器,JobTacker又是一台机器。但更多的是将NameNode和JobTacker和在一个机器里面,将Secondary NameNode单独的放在一个机器里面。
Slave:就是运行DataNode和TaskTacker的机器。
安虚拟机安三个节点比较好,一个放置NameNode,JobTacker(至于Secondary NameNode可以与NameNode,JobTacker放置在一台机器上,在学习的过程中一般不考虑集群失败的问题),另外两个用于放Slave。也就是一个用于放Master,两个用于放Slave。
如果只有两个节点就比较不好,因为一个放Master,一个放Slave,就体现不出分布式集群是怎么工作的。
六、为什么选择Hadoop?
案例:
比如你有个朋友打电话给你,但是信号不好听不到声音,然后就挂断,过不了多久一般他还会再打回来,或者你给他打过去。那这种情况就说明这个基站的信号不好,需要改善。我们可以用hadoop进行分析,通过判断条件查找,如:找出那些接通电话马上会挂断,过不了多久又通话的基站。那么一旦某一个地区这种情况发生的很多,则说明很可能这个地区的基站通讯情况不好,需要改善。
目前的瓶颈:
数据量的上涨,似的性能强悍的小型机主键无法满足大数据的处理,且一般公司不会去买大型服务器机群,因为可能投入大于回报。例如HP那种128G内存,48个CPU的小型机器已经无法处理越来越庞大的数据量。多买几台?用户的腰包也是有瓶颈的。
需求:
完美解决性能瓶颈,在可见未来不易出现新的瓶颈。
过去所拥有的技术可以平稳的过度。也就是这个解决方案尽量不要出现新的技术,不然学习新技术费时费力费资金,是大部分开发人员不愿意看到的。
转移平台的成本尽可能的降低。
Hadoop的思想:
那台HP机就相当于高富帅,hadoop的思想就是用100个屌丝(一般的机器)干掉高富帅。
分布式的思想。
Hadoop可以很好的消除性能瓶颈。因为要在性能上突破很简单,只要添加节点即可。而且成本是线性增长,一般也就是一台PC服务器的价格。
hadoop是开源免费的,不需要成本。
七、阻碍使用hadoop的因素
1,技术限制-->Java,如果公司没有java程序员,则不好办。
2,由于开源的原因,里面的很多技术都不友好,开发Hadoop的人假设每个使用Hadoop的都是高手,而且各个版本之间的继承性不是很好。不好驾驭。
3,数据集成困难。如何将关系型数据库的数据放到hadoop中呢,会不太容易,会有很多跟以前不一样的地方。
八、hadoop体系下的分析手段
1,主流-->java程序。
2,轻量级的脚本语言:Pig
3,SQL技巧平稳过渡:Hive
4,NoSQL:HBase