Hadoop学习笔记

来源:互联网 发布:php和java哪个好学 编辑:程序博客网 时间:2024/05/29 05:54
一.安装与配置Hadoop
1.1.配置SSH在Mac OS上比较顺利
1.2.格式化HDFS文件系统 hadoop namenode -format
1.3.所有的启动脚本均在$HADOOP_HOME/sbin/目录下,『$HADOOP_HOME/sbin/start-all.sh』即可运行

MapReduce数据流:
MapReduce作业(job)是客户端需要执行的一个工作单元,有两类节点控制着作业的执行过程:一个jobtracker和一系列tasktracker。jobtracker通过调度tasktracker上运行的任务,来协调所有运行在系统上的作业。tasktracker有次记录每项作业任务的整体进度情况,如果其中一个任务失败,jobtracker可以在另外一个tasktracker节点上重新调度该任务

二.HDFS
HDFS数据块(block)默认为64MB,目的是为了最小化寻址开销。HDFS中小于一个块大小的文件不会占据整个块的空间
FSDataInputStream:
seek:定位文件位置,超过文件长度会抛出IOException。seek高开销,慎用,建议用流数据来构建应用的访问模式减少seek使用
read:从文件的指定position处读取到至多为length字节的数据并存入缓冲区buffer的指定偏移量offset处,返回实际读到的字节数
readFully:将指定length长度字节数数据读取大buffer中,读到文件末尾会抛出EOFException

HDFS文件写入:
DistributedFileSystem对象调用create函数对namenode创建一个RPC调用,在文件系统的命名空间中创建文件
FSDataOutputStream封装一个DFSOutoutStream对象负责处理datanode和namenode之间的通信
客户端写入数据时,DFSOutoutStream将数据划分成小的数据包写入数据队列(data queue)
DFSOutputStream维护确认队列(ack queue)等待datanode的收到确认回执,当收到管道中所有datanode确认信息后,数据包移除ack queue
如果数据包写入期间datanode故障,首先关闭管线,把ack queue中数据包添加回data queue,为存储在另一个正常的datanode的当前数据块指定一个新的标记,并将标记传送给namenode,一遍故障datanode在回复后可以删除存储的部分数据块,从管线中移除故障的datanode并把余下的数据块写入管线的两个正常的datanode。如果namenode的副本量不足,会在另一个节点上创建一个新的版本。

HDFS一致性:
sync方法:强制所有的缓存与数据节点同步

并行复制:hadoop distcp hdfs://namenode1/foo hfs://namenode2/copyfoo 第一个路径为绝对路径

三.MapReduce的工作机制
1.MapReduce working flow:
1.1. Client:submit a MapReduce job
     向JobTracker申请一个新的JobID
     检查作业的输出说明
     计算作业的输入分片
     将运行作业所需要的资源赋值到一个以作业ID命名的目录下jobtracker的文件系统中
     告知JobTracker作业准备执行(JobTracker.submitJob方法)
1.2. JobTracker:coordinate jobs’ operation。A JobTracker is  a Java Application,Main class is JobTracker
1.3. TaskTracker: 运行作业划分后的任务。A TaskTracker is  a Java Application, Main class is TaskTracker
1.4. HDFS: 用来与其他实体间共享作业文件
2.作业的初始化:JobTracker.submitJob方法执行后,交由作业调度器(job scheduler)调度,并初始化jobtracker
3.任务的执行:TaskTracker从共享文件系统把作业的Jar文件复制到TaskTracker所在的文件系统,实现作业的本地化;同时将application所需要的全部文件从分布式缓存复制到本地磁盘;TaskTracker新建一个TaskRunner实例运行任务。
TaskRunner启动一个新的JVM运行每个任务,也可以在JobConf中的setNumTasksTOExecutePerJvm()方法设定重用JVM数量(默认1,如果是-1则同一个作业的任务都在一个JVM中)
Streaming和Pipes运行特殊的map和reduce任务,Pipes监听socket,Streaming负责标准IO通信,与父Java Pipes建立持久化socket连接。

4.作业的调度
Fair Scheduler:公平共享集群能力
Capacity Scheduler:每个队列有分配能力,在每个队列是FIFO的
Priority Scheduler:优先级高的优先占用,不支持抢占式,是FIFO的

5.shuffle和排序
5.1.MapReduce确保每个reducer的输入都按照键排序
5.2.deducer通过HTTP方式得到输出文件的分区,用于文件分区的工作线程的数量由任务的tracker.http.threads属性控制,此设置针对每个tasktracker而不是针对每个map任务槽,默认值是40个线程。
5.3.有一个tasktracker任务完成,reduce任务就开始复制。reduce任务有少量的复制线程,能够并行取得map输出,默认值是5个线程。

四.HIVE
Hive与RDBMS比较:

查询语言

HQL

SQL

数据存储位置

HDFSRaw Device 或者 Local FS

数据格式

用户定义系统决定

数据更新

支持不支持

索引

执行

MapRedcueExecutor

执行延迟

可扩展性

数据规模

  1. 查询语言。由于 SQL 被广泛的应用在数据仓库中,因此,专门针对 Hive 的特性设计了类 SQL 的查询语言 HQL。熟悉 SQL 开发的开发者可以很方便的使用 Hive 进行开发。
  2. 数据存储位置。Hive 是建立在 Hadoop 之上的,所有 Hive 的数据都是存储在 HDFS 中的。而数据库则可以将数据保存在块设备或者本地文件系统中。
  3. 数据格式。Hive 中没有定义专门的数据格式,数据格式可以由用户指定,用户定义数据格式需要指定三个属性:列分隔符(通常为空格、”\t”、”\x001″)、行分隔符 (”\n”)以及读取文件数据的方法(Hive 中默认有三个文件格式 TextFile,SequenceFile 以及 RCFile)。由于在加载数据的过程中,不需要从用户数据格式到 Hive 定义的数据格式的转换,因此,Hive 在加载的过程中不会对数据本身进行任何修改,而只是将数据内容复制或者移动到相应的 HDFS 目录中。而在数据库中,不同的数据库有不同的存储引擎,定义了自己的数据格式。所有数据都会按照一定的组织存储,因此,数据库加载数据的过程会比较耗时。
  4. 数据更新。由于 Hive 是针对数据仓库应用设计的,而数据仓库的内容是读多写少的。因此,Hive 中不支持对数据的改写和添加,所有的数据都是在加载的时候中确定好的。而数据库中的数据通常是需要经常进行修改的,因此可以使用 INSERT INTO …  VALUES 添加数据,使用 UPDATE … SET 修改数据。
  5. 索引。之前已经说过,Hive 在加载数据的过程中不会对数据进行任何处理,甚至不会对数据进行扫描,因此也没有对数据中的某些 Key 建立索引。Hive 要访问数据中满足条件的特定值时,需要暴力扫描整个数据,因此访问延迟较高。由于 MapReduce 的引入, Hive 可以并行访问数据,因此即使没有索引,对于大数据量的访问,Hive 仍然可以体现出优势。数据库中,通常会针对一个或者几个列建立索引,因此对于少量的特定条件的数据的访问,数据库可以有很高的效率,较低的延迟。由于数据 的访问延迟较高,决定了 Hive 不适合在线数据查询。
  6. 执行。Hive 中大多数查询的执行是通过 Hadoop 提供的 MapReduce 来实现的(类似 select * from tbl 的查询不需要 MapReduce)。而数据库通常有自己的执行引擎。
  7. 执行延迟。之前提到,Hive 在查询数据的时候,由于没有索引,需要扫描整个表,因此延迟较高。另外一个导致 Hive 执行延迟高的因素是 MapReduce 框架。由于 MapReduce 本身具有较高的延迟,因此在利用 MapReduce 执行 Hive 查询时,也会有较高的延迟。相对的,数据库的执行延迟较低。当然,这个低是有条件的,即数据规模较小,当数据规模大到超过数据库的处理能力的时 候,Hive 的并行计算显然能体现出优势。
  8. 可扩展性。由于 Hive 是建立在 Hadoop 之上的,因此 Hive 的可扩展性是和 Hadoop 的可扩展性是一致的(世界上最大的 Hadoop 集群在 Yahoo!,2009年的规模在 4000 台节点左右)。而数据库由于 ACID 语义的严格限制,扩展行非常有限。目前最先进的并行数据库 Oracle 在理论上的扩展能力也只有 100 台左右。
  9. 数据规模。由于 Hive 建立在集群上并可以利用 MapReduce 进行并行计算,因此可以支持很大规模的数据;对应的,数据库可以支持的数据规模较小。

五.HBASE

1.两者分别是什么?

Apache Hive是一个构建在Hadoop基础设施之上的数据仓库。通过Hive可以使用HQL语言查询存放在HDFS上的数据。HQL是一种类SQL语言,这种语言最终被转化为Map/Reduce. 虽然Hive提供了SQL查询功能,但是Hive不能够进行交互查询--因为它只能够在Haoop上批量的执行Hadoop。

Apache HBase是一种Key/Value系统,它运行在HDFS之上。和Hive不一样,Hbase的能够在它的数据库上实时运行,而不是运行MapReduce任务。Hive被分区为表格,表格又被进一步分割为列簇。列簇必须使用schema定义,列簇将某一类型列集合起来(列不要求schema定义)。例如,“message”列簇可能包含:“to”, ”from” “date”, “subject”, 和”body”. 每一个 key/value对在Hbase中被定义为一个cell,每一个key由row-key,列簇、列和时间戳。在Hbase中,行是key/value映射的集合,这个映射通过row-key来唯一标识。Hbase利用Hadoop的基础设施,可以利用通用的设备进行水平的扩展。

2.两者的特点

Hive帮助熟悉SQL的人运行MapReduce任务。因为它是JDBC兼容的,同时,它也能够和现存的SQL工具整合在一起。运行Hive查询会花费很长时间,因为它会默认遍历表中所有的数据。虽然有这样的缺点,一次遍历的数据量可以通过Hive的分区机制来控制。分区允许在数据集上运行过滤查询,这些数据集存储在不同的文件夹内,查询的时候只遍历指定文件夹(分区)中的数据。这种机制可以用来,例如,只处理在某一个时间范围内的文件,只要这些文件名中包括了时间格式。

HBase通过存储key/value来工作。它支持四种主要的操作:增加或者更新行,查看一个范围内的cell,获取指定的行,删除指定的行、列或者是列的版本。版本信息用来获取历史数据(每一行的历史数据可以被删除,然后通过Hbase compactions就可以释放出空间)。虽然HBase包括表格,但是schema仅仅被表格和列簇所要求,列不需要schema。Hbase的表格包括增加/计数功能。

3.限制

Hive目前不支持更新操作。另外,由于hive在hadoop上运行批量操作,它需要花费很长的时间,通常是几分钟到几个小时才可以获取到查询的结果。Hive必须提供预先定义好的schema将文件和目录映射到列,并且Hive与ACID不兼容。

HBase查询是通过特定的语言来编写的,这种语言需要重新学习。类SQL的功能可以通过Apache Phonenix实现,但这是以必须提供schema为代价的。另外,Hbase也并不是兼容所有的ACID特性,虽然它支持某些特性。最后但不是最重要的--为了运行Hbase,Zookeeper是必须的,zookeeper是一个用来进行分布式协调的服务,这些服务包括配置服务,维护元信息和命名空间服务。

4.应用场景

Hive适合用来对一段时间内的数据进行分析查询,例如,用来计算趋势或者网站的日志。Hive不应该用来进行实时的查询。因为它需要很长时间才可以返回结果。

Hbase非常适合用来进行大数据的实时查询。Facebook用Hbase进行消息和实时的分析。它也可以用来统计Facebook的连接数。

5.总结

Hive和Hbase是两种基于Hadoop的不同技术--Hive是一种类SQL的引擎,并且运行MapReduce任务,Hbase是一种在Hadoop之上的NoSQL 的Key/value数据库。当然,这两种工具是可以同时使用的。就像用Google来搜索,用FaceBook进行社交一样,Hive可以用来进行统计查询,HBase可以用来进行实时查询,数据也可以从Hive写到Hbase,设置再从Hbase写回Hive。 
3 0