Hadoop学习笔记Word格式文档下载.docx
《Hadoop学习笔记Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《Hadoop学习笔记Word格式文档下载.docx(17页珍藏版)》请在冰点文库上搜索。
●用函数式编程(MapReduce)代替声明式查询(SQL)
在MapReduce中,实际的数据处理步骤是由程序员指定的,而SQL是非过程化的语言。
●用离线批量处理代替在线处理
Hadoop是专为离线处理和大规模数据分析而设计的,它并不适合那种对几个记录随机读写的在线事务处理模式。
Hadoop最适合一次写入、多次读取的数据存储需求。
在这方面它就像SQL世界中的数据仓库。
4.理解MapReduce
MapReduce也是一种数据处理模型,它最大的优点是容易扩展到多个计算节点上处理数据。
在MapReduce模型中,数据处理原语被称为mapper和reducer。
分解一个数据处理应用为mapper和reducer有时是很繁琐的,但是一旦以MapReduce的形式写好一个应用程序,仅需修改配置就可以将它扩展到集群上运行。
正是这种简单的可扩展性使得MapReduce模型吸引了众多程序员。
5.当你用MapReduce模型来编写应用程序时,Hadoop将替你管理所有与可扩展性相关的底层问题。
6.相同程序在MapReduce中的扩展
Mapper作用:
将输入进行过滤与转换
Reducer作用:
将mapper的输出进行聚合
MapReduce使用列表和键/值对作为其主要的数据原语。
在MapReduce框架中编写应用程序就是定制化mapper和reducer的过程。
map和reduce函数必须遵循以下对键和值类型的约束:
1)应用的输入必须组织为一个键/值对的列表list(<
k1,v1>
)。
输入格式可能看起来是不受约束的,但在实际中它非常简洁。
用于处理多个文件的输入格式通常为list(<
Stringfilename,Stringfile_content>
用于处理日志文件这种大文件的输入格式为list(<
Integerline_number,Stringlog_event>
2)含有键/值对的列表被拆分,进而通过调用mapper的map函数对每个单独的键/值对<
进行处理。
在这里,键k1经常被mapper所忽略。
mapper转换每个<
对并将之放入<
k2,v2>
对的列表中。
这种转换的细节很大程度上决定了MapReduce程序的行为。
值得注意的是,处理键/值对可以采用任意的顺序。
而且,这种转换必须是封闭的,使得输出仅依赖于一个单独的键/值对。
3)所有mapper的输出(在概念上)被聚合到一个包含<
对的巨大列表中。
所有共享相同k2的对被组织在一起形成一个新的键/值对<
k2,list(v2)>
。
框架让reducer来分别处理每一个被聚合起来的<
7.Hadoop脚本
Usage:
hadoop[--configconfdir]COMMAND
这里COMMAND为下列其中一个:
namenode-format格式化DFS文件系统
secondarynamenode运行DFS的第二个namenode
namenode运行DFS的namenode
datanode运行一个DFS的datanode
dfsadmin运行一个DFS的admin客户端
fsck运行一个DFS文件系统的检查工具
fs运行一个普通的文件系统用户客户端
balancer运行一个集群负载均衡工具
jobtracker运行MapReduce的jobTracker节点
pipes运行一个Pipes作业
tasktracker运行一个MapReduce的taskTracker节点
job处理MapReduce作业
version打印版本
jar<
jar>
运行一个jar文件
distcp<
srcurl>
<
desturl>
递归地复制文件或者目录
archive-archiveNameNAME<
src>
*<
dest>
生成一个Hadoop档案
daemonlog获取或设置每个daemon的log级别
或CLASSNAME运行名为CLASSNAME的类大多数命令会在使用w/o参数时打出帮助信息。
8.运行一个(java)Hadoop程序的命令为bin/hadoopjar<
就像命令中显示的那样,用Java写的Hadoop程序被打包为jar执行文件。
9.wordcount的源码,安装后放在src/examples/org/apache/hadoop/examples/WordCount.java中。
第2章初始Hadoop
◆Hadoop的结构组成
◆安装Hadoop及其3种工作模式:
单机、伪分布、全分别。
◆用于监控Hadoop安装的Web工具
一台机器来运行Hadoop,则为单机或伪分布模式,用于程序的开发。
2.1Hadoop的构造模块
在一个全配置的集群上,“运行Hadoop”意味着在网络分布的不同服务器上运行一组守护进程(daemon)。
这些守护进程有特殊的角色,一些仅存在单个服务器上,一些则运行在多个服务器上。
它们包括:
NameNode(名称节点)
DataNode(数据节点)
SecondaryNameNode(次名称节点)
JobTracker(作业跟踪节点)
TaskTracker(任务跟踪节点)
1)NameNode
Hadoop在分布式计算与分布式存储中都采用了主/从(master/slave)结构。
分布式存储系统被称为Hadoop文件系统(HDFS)。
NameNode位于HDFS的主端,它指导从端的DataNode执行底层的I/O任务。
NameNode是HDFS的书记员,它跟踪文件如何被分割成文件块,而这些块又被哪些节点存储,以及分布式文件系统的整体运行状态是否正常。
运行NameNode消耗大量的内存和I/O资源。
因此,为了减轻机器的负载,驻留NameNode的服务器通常不会存储用户数据或执行MapReduce程序的计算任务。
这意味着NameNode服务器不会同时是DataNode或者TaskTracker。
不过NameNode的重要性也带来了一个负面影响——Hadoop集群的单点失效。
对于任何其他的守护进程,如果它们所驻留的节点发生软件或硬件失效,Hadoop集群很可能还会继续平稳运行,不然你还可以快速重启这个节点。
但这样的方法并不适用于NameNode。
2)DataNode
每一个集群上的从节点都会驻留一个DataNode守护进程,来执行分布式文件系统的繁重工作——将HDFS数据块读取或者写入到本地文件系统的实际文件中。
当希望对HDFS文件进行读写时,文件被分割为多个块,由NameNode告知客户端每个数据块驻留在哪个DataNode。
客户端直接与DataNode守护进程通信,来处理与数据块相对应的本地文件。
而后,DataNode会与其他DataNode进行通信,复制这些数据块以实现冗余。
DataNode不断向NameNode报告。
初始化时,每个DataNode将当前存储的数据块告知NameNode。
在这个初始映射完成后,DataNode任会不断地更新NameNode,为之提供本地修改的相关信息,同时接收指令创建、移动或删除本地磁盘上的数据块。
3)SecondaryNameNode
SecondaryNameNode(SNN)是一个用于监测HDFS集群状态的辅助守护进程。
像NameNode一样,每个集群有一个SNN,它通常也独占一台服务器。
SNN与NameNode的不同在于它不接收或记录HDFS的任何实时变化。
相反,它与NameNode通信,根据集群所配置的时间间隔获取HDFS元数据的快照。
由于NameNode是Hadoop集群的单一故障点,而SNN的快照可以有助于减少停机的时间并降低数据丢失的风险,然而,NameNode的失效处理需要人工的干预,即手动地重新配置集群,将SNN用作主要的NameNode。
4)JobTracker
JobTracker守护进程是应用程序和Hadoop之间的纽带。
一旦提交代码到集群上,JobTracker就会确定执行计划,包括决定处理哪些文件、为不同的任务分配节点以及监控所有任务的运行。
如果任务失败,JobTracker将自动重启任务,但所分配的节点可能会不同,同时受到预定义的重试次数限制。
每个Hadoop集群只有一个JobTracker守护进程。
它通常运行在服务器集群的主节点上。
5)TaskTracker
与存储的守护进程一样,计算的守护进程也遵循主/从架构:
JobTracker作为主节点,监测MapReduce作业的整个执行过程,同时,TaskTracker管理各个任务在每个从节点上的执行情况。
每个TaskTracker负责执行由JobTracker分配的单项任务。
虽然每个从节点上仅有一个TaskTracker,但每个TaskTracker可以生成多个JVM(Java虚拟机)来并行地处理许多map或reduce任务。
图:
JobTracker和TaskTracker的交互。
当客户端调用JobTracker来启动一个数据处理作业时,JobTracker会将工作切分,并分配不同的map和reduce任务到集群中的每个TaskTracker上
一个典型Hadoop集群的拓扑图。
这是一个主/从架构,其中NameNode和JobTracker为主端,DataNode和TaskTracker为从端
2.2为Hadoop集群安装SSH
为使主节点能远程地访问到集群中的每个节点,Hadoop使用了无口令的SSH(SecureShell)协议。
SSH采用标的公钥加密来生成一对用户验证密钥——一个公钥、一个私钥。
公钥被存储在集群的每个节点上,私钥则由主节点在试图访问远端节点时发送过来。
结合这两段信息,目标机可以对这次登录尝试进行验证。
1)验证SSH安装:
使用“which”命令
若没安装,则可以通过以下步骤安装:
2)生成SSH密钥对
执行ssh-keygen命令生成密钥文件,如下图所示:
3)将公钥分布并登录验证
2.3运行Hadoop
在运行Hadoop之前需要做一些配置:
hadoop-env.sh:
JAVA_HOME
(hadoop-env.sh还包含定义Hadoop环境的其他变量,如日志目录的位置、Java类所在的目录,等待)
Hadoop的设置主要包含在XML配置文件中。
在0.20版本以前,它们是hadoop-default.xml和hadoop-site.xml。
在0.20及其以后的版本中,hadoop的设置主要包含在3个XML文件中:
core-site.xml,hdfs-site.xml和mapred-site.xml。
1)本地(单机)模式
单机模式是Hadoop的默认模式。
当首次解压Hadoop的源码包是,Hadoop无法了解硬件安装环境,便保守地选择了最小配置。
在这种模式下3个XML文件均为空。
当配置文件为空时,Hadoop会完全运行在本地。
因为不需要与其他节点交互,单机模式就不使用HDFS,也不加载任何Hadoop的守护进程。
该模式主要用于开发调试MapReduce程序的应用逻辑,而不会与守护进程交互,避免引起额外的复杂性。
2)伪分布模式
伪分布模式在“单节点集群”上运行Hadoop,其中所有的守护进程都运行在同一台机器上。
该模式在单机模式上增加了代码调试功能,允许你检查内存使用情况、HDFS输入输出,以及其他的守护进程交互。
此种模式,3个配置文件的配置实例入戏:
core-site.xml
mapred-site.xml
hdfs-site.xml
core-site.xml和mapred-site.xml中分别指定了NameNode和JobTracker的主机名与端口。
在hdfs-site.xml中指定了HDFS的默认副本数,因为仅运行在一个节点上,这里副本数为1。
我们还需要在文件masters中指定SNN的位置,并在文件slaves中指定从节点的位置。
虽然所有的守护进程都运行在同一节点上,它们任然像分布在集群中一样,彼此通过相同的SSH协议进行通信。
对于单节点的操作,仅需检查一下机器是否允许对自己运行ssh。
在启动Hadoop之前,还需要格式化HDFS:
启动Hadoop:
结束Hadoop:
单机模式和伪分布模式均用于开发与调试的目的。
真实Hadoop集群的运行采用的是第三种模式,即全分布模式。
3)全分布模式
服务器名称:
master—集群的主节点,驻留NameNode和JobTracker守护进程。
backup—驻留SNN守护进程的节点。
hadoop1,hadoop2,hadoop3,…—集群的从节点,驻留DataNode和TaskTracker守护进程。
全分布式模式的配置文件样例:
主要不同在于以下两点:
⏹明确地声明了NameNode和JobTracker守护进程所在的主机名。
⏹增大了HDFS的备份参数以发挥分布式存储的优势。
还需要更新master和slaves文件来指定其他的守护进程的位置:
将这些文件复制到集群上的所有节点之后,一定要格式化HDFS以准备好存储数据:
启动Hadoop守护进程:
2.4基于Web的集群用户界面
以下介绍Hadoop用于监控集群健康状态的Web界面。
与搜寻日志和目录相比,通过浏览器的界面,可以更快地获得所需的信息。
NameNode通过端口50070提供常规报告,描绘集群上HDFS的状态视图。
通过这个界面,可以浏览文件系统,检查集群每个DataNode的状态,并详细查看Hadoop守护进程的日志来判断集群当前运行是否正确。
Hadoop还提供了一个MapReduce作业运行时状态的近视视图。
它包括大量的信息,如MapReduce中任务的运行时状态,以及整个作业的详细报告。
后者尤为重要——这些日志描述了哪个节点执行了哪个任务,以及需要完成每个任务所需的时间或资源。
最后,还可以获得Hadoop对每个作业的配置。
MapReduce的Web界面快照。
这个工具可以监控活跃的MapReduce作业,并访问每个map和reduce任务的日志。
还可以获得以前提交作业的日志,以辅助程序的调试
一个特定MapReduce作业的详细配置,这些信息在通过调整参数来优化程序性能时可能有用
第3章Hadoop组件
◆管理HDFS中的文件
◆分析MapReduce框架中的组件
◆读写输入输出数据
HDFS,它存储着Hadoop应用将要处理的数据。
3.1HDFS文件操作
HDFS是一种文件系统,专为MapReduce这类框架下的大规模分布式数据处理而设计。
可以把一个大数据集(比如说100TB)在HDFS中存储为单个文件,而大多数其他的文件系统无力实现这一点。
因为HDFS并不是一个天生的Unix文件系统,不支持像ls和cp这种标准的Unix文件命令,也不支持如fopen()和fread()这样的标准文件读写操作。
另一方面,Hadoop确也提供了一套与Linux文件命令类似的命令行工具。
1.基本文件命令
Hadoop的文件命令采取的形式为:
Hadoopfs-cmd<
args>
cmd:
是具体的文件命令。
<
:
是一组数目可变的参数。
Hadoop中最常用的文件管理任务,其中包括:
Ø
添加文件和目录
获取文件
删除文件
指定文件和目录确切位置的URI:
Hadoop的文件命令既可以与HDFS文件系统交互,也可以和本地文件系统交互。
URI可以精确地定位一个特定文件或目录的位置。
完整的URI格式为:
scheme:
//authority/path
Scheme类似一个协议。
它可以使hdfs或file,分别指定HDFS文件系统或本地文件系统。
Authority是NameNode的主机名
Path是文件或目录的路径
例如:
Hadoopfs-cathdfs:
//localhost:
9000/user/chuck/example.txt
当在本地文件系统和HDFS之间复制文件时,Hadoop中的命令(如put和get)会分别把本地文件系统作源和目的,而不需要指定scheme为file。
对于其他命令,如果未设置URI中scheme:
//authority,就会采用Hadoop的默认配置。
该配置在core-site.xml文件中:
在此配置下,URIhdfs:
9000/user/chuck/example.txt缩短为/user/chuck/example.txt
HDFS默认当前工作目录为/user/$USER,其中$USER是你的登录用户名。
1)添加文件和目录
2)索引文件
3)删除文件
4)查阅帮助
2.编程读写HDFS