初识Hadoop(1)

来源:互联网 发布:数据关联算法 编辑:程序博客网 时间:2024/04/27 15:01

一些基本问题:

1 避免数据丢失的常见做法是复制:通过系统保存数据的冗余副本,在故障发生时,可以使用数据的另一个副本,这就是冗余磁盘阵列的工作方式。

Hadoop的文件系统HDFS(Hadoop Distributed Filesystem)

2 大部分分析任务需要通过某种方式把数据合并起来。MapReduce提供一个编程模型,其抽象出磁盘读写的问题,将其转换为计算一个由成对键值组成的数据集。这个计算由来那个部分组成:Map 和Reduce。这两者的接口就是“整合”之地。

3 简而言之,Hadoop提供了一个稳定的共享存储和分析系统,存储由HDFS实现,分析由MapReduce实现。

4 寻址时间的提高速度远远慢于传输速率的提高速度。

5 MapReduce(批处理)适合数据被一次写入和多次读取的应用,而关系型数据库适合持续更新的数据集。

6 结构化数据是拥有准确定义的实体化数据,如XML和数据库表定义的格式,符合特定的预定义模式。MapReduce对于非结构化或半结构化数据非常有效,因为它被设计为在处理时间内解释数据。换句话说:MapReduce输入的键值并不是数据固有的属性,它们是由分析数据的人来选择的。如Web服务器日志是记录集的一个i很好的非规范化例子。

7 基于MapReduce的高级查询语言(如pig,Hive)做MapReduce的系统更接近传统的数据库编程人员。

8 数据本地化的功能是MapReduce的核心功能。MapReduce是一个无共享的框架,这意味着各个任务之间彼此并不依赖。

9 MapReduce被设计为用来运行那些需要数分钟或数小时的作业,这些作业在一个聚集带宽很高的数据中心中可信任的专用硬件设备上运行。

10 Hadoop的组成:Pig : 一种数据流语言和运行环境可以用来检索非常大的数据集

                                    HDFS:分布式文件系统,运行于大型商用机集群。

                                    MapReduce:分布式数据处理模式和执行环境。

                                    Hbase:一个分布式的、列存储数据库。Hbase使用HDFS作为底层存储,同时支持MapReduce的批量式计算和点查询。

                                    ZooKeeper:一个分布式的,高可用性的协调服务。提供分布式锁之类的基本服务用于构建分布式应用。

                                    Hive:分布式数据仓库。Hive管理HDFS中存储的数据,并提供基于SQL的查询语言用以查询数据。

                                    Chukwa:分布式数据收集和分析系统。Chukwa运行HDFS中存储数据的收集器,它使用MapReduce来生成报告。

一 MapReduce

1 MapReduce的优势在于处理大型数据集。

2 气象数据举例: 数据文件按照日期和气象站进行组织。每一年都有一个目录,每一个目录都包含一个打包文件,文件中的每一个气象站都带有当年的数据。

每年记录中的全球最高气温是多少?传统处理工具是awk

使用Hadoop进行数据分析。

把查询表示成MapReduce作业,经过一些本地的小规模测试,我们将能够在机器集群上运行它。

MapReduce的工作过程分为两个阶段:map阶段和reduce阶段。

map阶段输入的是原始的NCDC数据。我们选择的是一种文本输入格式,一遍数据集的每一行都会是一个文本值。键是文件开头部分文本行起始处的偏移量。

map函数来找出年份和气温。map函数只是一个数据准备阶段,通过这种方式来建立数据,使得reducer函数能在此基础上进行工作:找出每年的最高气温。map函数也适合去除已损坏的记录。

map函数的功能仅仅是提取年份和气温,并将其作为输出被发送。map函数的输出先由MapReduce框架处理,然后再被发送到reduce函数。这一处理过程根据键来对键值对进行排序和处理。所有reduce函数现在必须重复对这个列表并找出最大的读数。


代码实现上述流程:一个map函数,一个reduce函数,和一些来运行作业的代码。

map函数是由一个Mapper接口来实现的,其中声明了一个map()方法,

JobConf对象指定了作业的各种参。它授予你对整个作业如何运行的控制权。当我们在Hadoop集群上运行这个作业时,我们把代码打包成一个JAR文件,然后分发这个包到集群上。

在创建JobConf对象后,我们将指定输入和输出的路径。

接下来,通过setMapperClass()和setReduceClass()这两个方法来指定要使用的map和reduce类型。

在调试MapReduce作业时,知道作业和任务的ID是非常有用的。

3 分布化

典型的HDFS,以允许Hadoop把MapReduce的计算移到承载部分数据的各台机器。

MapReduce作业是客户端执行的单位:它包括输入数据,MapReduce程序和配置信息。Hadoop通过把作业分成若干个小任务来工作,其包括两种类型的任务:map任务和reduce任务。

jobtracker和多个tasktracker这两种节点控制着作业执行过程。 jobtracker通过调度任务在tasktracker上运行,来协调所有运行在系统上的作业。tasktracker运行任务的同时,把进度报告传送到jobtracker,jobtracker则记录着每项任务的整体进展情况。如果其中一个任务失败,jobtracker可以重新调度任务到另外一个tasktracker。Hadoop把输入数据划分为等长的小数据发送到MapReduce,成为输入分片或分片。Hadoop为每个分片创建一个map任务,由它来运行用户自定义的map函数来分析每个分片中的记录。

另一方面,如果分片太小,那么管理分片的总时间和map任务创建的总时间将决定作业的执行的总时间。对于大多数作业,一个理想的分片大小往往是一个HDFS块的大小,默认是64M。map任务的执行节点和输入数据的存储节点是同一结点时,Hadoop的性能达到最佳。64M可最大的保证存储在单个节点上的数据量。当分区跨块时,要增加网络传输到节点的时间。

map任务把输出写入到本地硬盘,而不是HDFS。因为map的输出并不是最终输出,只是中间输出,中间输出则被reduce任务处理后产生最终的输出。

reduce任务并不具备数据本地读取的优势——一个单一的reduce任务的输入旺旺来自于所有mapper的输出。reduce的输出通常存储在HDFS中。reduce任务的书目并不是由输入的大小来决定的,而是单独具体指定的。


多个reduce任务之间的数据流为shuffle(洗牌)。


唯一的非本地节点数据传输是当map任务写入到HDFS中。

集群的可用带宽限制了MapReduce作业的数量,因此map和reduce之间数据传输的代价是最小的。combiner是map和reduce函数之间的优化方法,不调用该方法后者调用该方法多次,reducer的输出结果都一样的。

4 Hadoop流

Hadoop提供一个API来运行MapReduce。

流适用于文字处理,在文本模式下它有一个面向行的数据试图。

reduce和map输入的格式是相同的,通过制表符来分隔键值对。

在一个集群上运行一个庞大的数据集时,要使用-combiner选项来设置combiner。

-file的使用,在集群上运行流程序把脚本传输到集群上时,可使用此选项。

Hadoop流支持任何可以从标准输入读取和写入到标准输出中的编程语言。

5 Hadoop管道

Hadoop管道是Hadoop MapReduce的C++接口的代称。与流不同,流使用标准输入和输出让map和reduce节点之间相互交流,管道使用sockets作为tasktracker与C++编写的map或者reduce函数的进程之间的管道。

C++接口中的键值是字节缓冲,表示为标准模版库的字符串。

要运行管道作业,我们需要在伪分布式模式下运行Hadoop。管道不在独立模式下运行,因为它依赖于Hadoop的分布式缓存机制,仅在HDFS运行时才运行。

Ha守护进程开始运行后,第一步是把可执行文件复制到HDFS,以便它们启动Map和reduce任务,它能够被tasktracker取出。



原创粉丝点击