思维导图
导语
Hadoop是一个开源框架,允许在分布式环境中使用简单的编程模型来存储和处理大数据,跨计算机集群。它被设计成可以从单个服务器扩展到数千台机器,每台机器都提供本地计算和存储。
Big Data概述
大数据中的数据分为三种类型
- 结构化数据:关系型数据。
- 半结构化数据:XML数据。
- 非结构化数据:Word、PDF、文本和媒体日志。
研究处理大数据的技术时将考虑以下两类技术
- 操作性大数据:像MongoDB这样的系统,为实时、交互式工作负载提供操作能力,其中数据主要被捕获和存储。使得操作性大数据工作负载更易于管理、更便宜、更快速实施。
- 分析大数据:包括大规模并行处理(MPP)数据库系统和MapReduce等系统,它们提供对回顾性和复杂分析的能力,可以触及大部分或全部数据。
大数据相关的主要挑战如下:
- 数据捕获
- 筹建
- 存储
- 搜索
- 共享
- 传输
- 分析
- 呈现
Hadoop
Hadoop框架应用程序在提供分布式存储和计算的环境中运行于计算机集群。Hadoop被设计为可以从单个服务器扩展到成千上万台机器,并且每台机器都提供本地计算和存储。
Hadoop框架四个模块
- Hadoop公共模块:这些是其他Hadoop模块所需的Java库和实用程序。这些库提供文件系统和操作系统级别的抽象,并包含启动Hadoop所需的必要Java文件和脚本。
- Hadoop YARN模块:这是一个用于作业调度和集群资源管理的框架。
- Hadoop分布式文件系统模块:一个提供高吞吐量访问应用程序数据的分布式文件系统。
- Hadoop MapReduce模块:这是基于YARN系统的用于并行处理大数据集的系统。
MapReduce
Hadoop MapReduce是一个软件框架,可以轻松编写应用程序,在可靠且容错的方式下并行处理大量数据,利用大规模集群(数千个节点)上的廉价硬件。
MapReduce指的是Hadoop程序执行的两个不同任务:
- Map任务:这是第一个任务,它将输入数据转换为一组数据,其中各个元素被分解为元组(键/值对)。
- 减少任务:该任务以映射任务的输出作为输入,并将这些数据元组合并为较小的元组集。减少任务始终在映射任务之后执行。通常,输入和输出都存储在文件系统中。框架负责调度任务,监视任务并重新执行失败的任务。
MapReduce框架由一个主JobTracker和每个集群节点一个从TaskTracker组成。主节点负责资源管理,跟踪资源消耗/可用性,并在从节点上调度任务组件任务,监视任务并重新执行失败的任务。从节点的TaskTracker按照主节点的指示执行任务,并定期向主节点提供任务状态信息。
HDFS
Hadoop分布式文件系统Hadoop可以直接与任何可挂载的分布式文件系统(如本地FS、HFTP FS、S3 FS等)一起使用,但Hadoop最常用的文件系统是Hadoop分布式文件系统(HDFS)。
Hadoop分布式文件系统(HDFS)基于Google文件系统(GFS),提供了一个设计用于可靠、容错的方式在大型集群(数千台计算机)上运行的分布式文件系统。HDFS使用主/从架构,其中主节点包含一个单独的NameNode来管理文件系统元数据,以及一个或多个从节点DataNode来存储实际数据。
一个HDFS命名空间中的文件被分割成多个块,并且这些块被存储在一组DataNode中。NameNode决定了块与DataNode之间的映射关系。DataNode负责与文件系统进行读写操作,还负责根据NameNode的指令进行块的创建、删除和复制。
HDFS提供了一个类似于其他文件系统的shell,并且提供了一系列的命令来与文件系统进行交互。
Hadoop的工作步骤
第一步:用户/应用程序可以通过指定以下项目来将作业提交给Hadoop进行所需处理:
- 在分布式文件系统中输入和输出文件的位置。
- 以jar文件的形式包含map和reduce函数实现的Java类。
- 通过设置特定于作业的不同参数来进行作业配置。
第二步:Hadoop作业客户端将作业(jar/可执行文件等)和配置提交给JobTracker,然后JobTracker负责将软件/配置分发给从节点、调度任务并监测任务的状态,并向作业客户端提供状态和诊断信息。
第三步:不同节点上的TaskTracker按照MapReduce的实现执行任务,并将reduce函数的输出存储到文件系统上的输出文件中。
Hadoop的优势
- 允许用户快速编写和测试分布式系统。
- 高效的,会自动将数据和工作分布到机器上,并利用CPU核心的底层并行性。
- 不依赖硬件提供容错性和高可用性(FTHA)
- 动态地添加或移除集群中的服务器,并且 Hadoop 可继续正常运行而不中断
- 兼容所有平台,因为它是基于Java的
Hadoop环境设置
alternatives --install /usr/bin/java java usr/local/java/bin/java 2alternatives --install /usr/bin/javac javac usr/local/java/bin/javac 2alternatives --install /usr/bin/jar jar usr/local/java/bin/jar 2alternatives --set java usr/local/java/bin/javaalternatives --set javac usr/local/java/bin/javacalternatives --set jar usr/local/java/bin/jar
Hadoop操作模式
- 本地/单机模式:默认情况下配置为独立模式。没有守护进程在运行,一切都在单个JVM中运行。单机模式适用于在开发过程中运行MapReduce程序,因为易于测试和调试。
- 伪分布模式:这是在单台机器上的分布式模拟。每个Hadoop守护进程(如hdfs、yarn、MapReduce等)将作为一个单独的Java进程运行。这种模式对于开发非常有用。
- 完全分布模式:这种模式是完全分布式的,至少需要两台或更多的机器作为集群。
Hadoop分布式文件系统(HDFS)
Hadoop文件系统采用分布式文件系统设计开发。它在廉价硬件上运行。与其他分布式系统不同,HDFS具有高度容错性,并使用低成本硬件设计。HDFS存储了大量的数据并提供更简单的访问。为了存储如此巨大的数据量,文件被存储跨多台计算机。这些文件以冗余的方式存储,以防止系统在发生故障时可能丢失数据。
HDFS的特点
- 适用于分布式存储和处理。
- Hadoop提供了一个命令接口来与HDFS进行交互。
- namenode和datanode的内置服务器帮助用户轻松检查群集的状态。
- 流式访问文件系统数据。
- HDFS提供文件权限和身份验证。
HDFS架构
Namenode:Namenode是包含GNU/Linux操作系统和Namenode软件的商业硬件。它是可以在商业硬件上运行的软件。具有Namenode的系统充当主服务器,并执行以下任务:
- 管理文件系统命名空间。
- 控制客户端对文件的访问。
Datanode:Datanode是具有GNU/Linux操作系统和Datanode软件的商业硬件。在集群中的每个节点(商业硬件/系统)都会有一个Datanode。这些节点管理其系统的数据存储。
- Datanode根据客户端的请求执行读写操作。
- 根据namenode的指令执行块的创建、删除和复制等操作。
一般用户数据存储在HDFS文件中。文件系统中的文件会被分成一个或多个段并/或存储在单独的数据节点中。这些文件段被称为块。换句话说,HDFS可以读取或写入的最小数据量称为块。默认块大小为64MB,但可以根据需要在HDFS配置中进行增加。
HDFS的目标
- 故障检测和恢复:由于HDFS包含大量的通用硬件,组件故障经常发生。因此,HDFS应该具备快速和自动的故障检测和恢复机制。
- 大型数据集:HDFS应该有每个集群的数百个节点来管理具有大型数据集的应用程序。
- 数据位置硬件:当计算发生在数据附近时,请求的任务可以高效完成。特别是在涉及大型数据集时,它可以减少网络流量并增加吞吐量
HDFS操作
- 对配置的HDFS文件系统进行格式化
$ hadoop namenode -format
- 启动分布式文件系统。以下命令将启动名节点和数据节点作为一个集群
$ start-dfs.sh
- 查找文件列表和文件状态
$ $HADOOP_HOME/bin/hadoop fs -ls <args>
将数据插入HDFS
本地系统中有一个名为file.txt的文件,希望将其保存在HDFS文件系统中
- 创建一个输入目录
$ $HADOOP_HOME/bin/hadoop fs -mkdir /user/input
- 将数据文件从本地系统传输并存储到Hadoop文件系统
$ $HADOOP_HOME/bin/hadoop fs -put /home/file.txt /user/input
- ls命令验证文件
$ $HADOOP_HOME/bin/hadoop fs -ls /user/input
从HDFS检索数据
HDFS中有一个名为outfile的文件
- 使用cat命令查看HDFS中的数据
$ $HADOOP_HOME/bin/hadoop fs -cat /user/output/outfile
- 使用get命令将文件从HDFS获取到本地文件系统
$ $HADOOP_HOME/bin/hadoop fs -get /user/output/ /home/hadoop_tp/
- 关闭HDFS
$ stop-dfs.sh
Hadoop命令参考
命令 | 描述 |
ls <path> | 列出由路径指定的目录的内容,显示每个条目的名称、权限、所有者、大小和修改日期。 |
lsr <path> | 行为类似于 ls,但递归显示路径下所有子目录中的条目。 |
du <path> | 显示与路 |
moveFromLocal <localSrc> <dest> | 将由localSrc在本地文件系统中确定的文件或目录复制到HDFS中的dest位置,并在成功时删除本地副本。 |
get [-crc] <src> <localDest> | 将由src在HDFS中确定的文件或目录复制到由localDest确定的本地文件系统路径。 |
getmerge <src> <localDest> | 检索在HDFS中与路径src匹配的所有文件,并将它们复制到本地文件系统中的单个合并文件中。 |
cat <filename> | 在stdout上显示filename的内容。 |
copyToLocal <src> <localDest> | 与 get 命令相同。 |
moveToLocal <src> <localDest> | 与 get 命令相同,但成功后会删除HDFS中的副本。 |
mkdir <path> | 在HDFS中创建名为path的目录。创建path中缺失的任何父目录(例如,在Linux中使用mkdir -p)。 |
setrep [-R] [-w] rep <path> | 将路径为path的文件的目标副本数设置为rep。(实际副本数会随时间逐渐向目标数靠拢) |
touchz <path> | 在path处创建一个包含当前时间的时间戳的文件。如果path处已经存在文件,则失败,除非该文件已经为大小为0。 |
test -[ezd] <path> | 如果路径path存在、长度为零或是一个目录,则返回1,否则返回0。 |
stat [format] <path> | 打印有关路径path的信息。格式是一个字符串,可以接受文件大小(以块为单位)(%b)、文件名(%n)、块大小(%o)、副本数(%r)和修改日期(%y、%Y)。 |
tail [-f] <filename> | 在stdout上显示文件file的最后1KB内容。 |
chmod [-R] mode,mode<path> | 更改与路径path关联的文件权限。 |
Hadoop Mapreduce框架
术语 | 描述 |
MapReduce | 一个编写并行处理大量数据的应用程序的框架,可在大规模集群的通用硬件上运行。 |
基于Java | MapReduce 是基于Java编程语言的。 |
Map和Reduce 任务 | Map任务将一组数据分解成多个元组(键/值对),而Reduce任务则将这些数据元组合并成一个更小的集合。 |
顺序 | Reduce任务总是在Map任务后执行,因此得名 MapReduce。 |
可扩展性 | MapReduce最大的优势在于可以轻松地扩展数据处理到多个计算节点上。 |
Mapper和Reducer | 在MapReduce模型中,数据处理的基本操作被称为Mapper(映射器)和Reducer(规约器)。 |
易扩展 | 一旦将应用程序以MapReduce形式编写,只需更改配置就可以扩展到在集群中运行数百、数千或数万台机器。 |
数据处理 | MapReduce算法一般采用“将计算发送至数据所在地”的策略进行数据处理。 |
MapReduce MapReduce 是一个框架,我们可以使用它来编写并行处理大量数据的应用程序,该应用程序在大型集群的通用硬件上运行。
MapReduce是一种基于Java的分布式计算处理技术和程序模型。MapReduce算法包含两个重要的任务,即Map和Reduce。Map将一组数据转换为另一组数据,其中个体元素被分解为元组(键/值对)。其次,Reduce任务将来自Map的输出作为输入,并将这些数据元组合并为一个较小的元组集合。正如名称MapReduce的顺序所示,Reduce任务总是在Map任务之后执行。MapReduce的主要优势在于可轻松扩展数据处理到多个计算节点上。在MapReduce模型下,数据处理的基本操作被称为Mapper和Reducer。将数据处理应用程序分解为Mapper和Reducer有时不容易。但是,一旦我们用MapReduce的形式编写了应用程序,将应用程序扩展到在集群中运行数百、数千甚至数万台机器上仅仅是一个配置更改。这种简单的可扩展性吸引了许多程序员使用MapReduce模型。算法通常基于将计算机发送到数据所在的地方!
MapReduce程序分为三个阶段执行,即Map阶段、Shuffle阶段和Reduce阶段。Map阶段:Map或Mapper的任务是处理输入数据。通常输入数据以文件或目录的形式存在,并存储在Hadoop文件系统(HDFS)中。输入文件逐行传递给Mapper函数。Mapper处理数据并创建多个小数据块。Reduce阶段:这个阶段是Shuffle阶段和Reduce阶段的组合。Reducer的任务是处理来自Mapper的数据。处理后,它产生一组新的输出,这将是存储在HDFS中。
阶段 | 输入 | 输出 |
映射(Map) | <k1,v1> | 列表(<k2,v2>) |
减少(Reduce) | <k2,列表(v2)> | 列表(<k3,v3>) |
术语
术语 | 描述 |
Payload | 应用实现Map和Reduce函数,构成作业的核心。 |
Mapper | Mapper将输入键/值对映射到一组中间键/值对。 |
命名节点 | 管理 Hadoop 分布式文件系统(HDFS)的节点。 |
数据节点 | 在任何处理之前,数据首先被提供的节点。 |
主节点 | JobTracker 运行的节点,并接受来自客户端的作业请求。 |
从节点 | Map 和 Reduce 程序运行的节点。 |
JobTracker | 调度作业并跟踪分配给任务跟踪器的作业。 |
任务跟踪器 | 跟踪任务并向 JobTracker 报告状态。 |
作业 | 程序对数据集的 Mapper 和 Reducer 的执行。 |
任务 | 在数据切片上执行 Mapper 或 Reducer。 |
任务尝试 | 在从节点上执行任务的特定实例。 |
MapReduce 包 hadoop 的示例
ProcessUnits.java
编译和执行Process Units程序的步骤
- 创建一个目录来存储已编译的Java类
$ mkdir units
- 下载Hadoop-core-1.2.1.jar,该jar文件用于编译和执行MapReduce程序
- 编译ProcessUnits.java程序并创建一个jar文件
$ javac -classpath hadoop-core-1.2.1.jar -d units ProcessUnits.java$ jar -cvf units.jar -C units/ .
- HDFS中创建一个输入目录
$ $HADOOP_HOME/bin/hadoop fs -mkdir input_dir
- 将名为sample.txt的输入文件复制到HDFS的输入目录中
$ $HADOOP_HOME/bin/hadoop fs -put /home/hadoop/sample.txt input_dir
- 验证输入目录中的文件
$ $HADOOP_HOME/bin/hadoop fs -ls input_dir/
- 从输入目录中获取输入文件并运行Eleunit_max应用程序
$ $HADOOP_HOME/bin/hadoop jar units.jar hadoop.ProcessUnits input_dir output_dir
执行后,输出将包含输入分片数、Map任务数、reducer任务数等信息。
INFO mapreduce.Job: Job job_1414748220717_0002 Completed successfullyDate: 14/10/31 06:02:52INFO mapreduce.Job: Counters: 49File System Counters:- FILE: - Number of bytes read=61 - Number of bytes written=279400 - Number of read operations=0 - Number of large read operations=0 - Number of write operations=0- HDFS: - Number of bytes read=546 - Number of bytes written=40 - Number of read operations=9 - Number of large read operations=0
- 验证输出文件夹中的结果文件
$ $HADOOP_HOME/bin/hadoop fs -ls output_dir/$ $HADOOP_HOME/bin/hadoop fs -cat output_dir/part-00000
- 查看Part-00000文件中的输出
$ $HADOOP_HOME/bin/hadoop fs -cat output_dir/part-00000
- 将输出文件夹从HDFS复制到本地文件系统进行分析
$ $HADOOP_HOME/bin/hadoop fs -cat output_dir/part-00000/bin/hadoop dfs get output_dir /home/hadoop
hadoop 命令
选项 | 描述 |
namenode-format | 格式化DFS文件系统。 |
secondarynamenode | 运行DFS辅助名称节点。 |
namenode | 运行DFS名称节点。 |
datanode | 运行DFS数据节点。 |
dfsadmin | 运行DFS管理客户端。 |
mradmin | 运行Map-Reduce管理客户端。 |
fsck | 运行DFS文件系统检查工具。 |
fs | 运行通用文件系统用户客户端。 |
balancer | 运行集群平衡工具。 |
oiv | 将离线fsimage查看器应用于fsimage。 |
fetchdt | 从NameNode获取委派令牌。 |
jobtracker | 运行MapReduce作业跟踪节点。 |
pipes | 运行Pipes作业。 |
tasktracker | 运行MapReduce任务跟踪节点。 |
historyserver | 作为独立守护进程运行作业历史记录服务器。 |
job | 操纵MapReduce作业。 |
queue | 获取有关JobQueues的信息。 |
version | 打印版本。 |
jar <jar> | 运行jar文件。 |
distcp<srcurl> <desturl> | 递归复制文件或目录。 |
distcp2<srcurl> <desturl> | DistCp版本2。 |
archive -archiveName NAME -p <parent path> <src>* <dest> | 创建一个hadoop归档文件。 |
classpath | 打印获取Hadoop jar和所需的库。 |
daemonlog | 获取/设置每个守护程序的日志级别。 |
hadoop job 命令
通用选项 | 描述 |
-submit <job-file> | 提交作业。 |
-status <job-id> | 显示地图和减少完成百分比和所有作业计数器。 |
-counter <job-id> <group-name> <countername> | 显示计数器值。 |
-kill <job-id> | 终止作业。 |
-events <job-id> <fromevent-#> <#-of-events> | 显示作业跟踪器为给定范围接收的事件详情。 |
-history [all] <jobOutputDir> | 显示作业详情,失败和终止的任务详情。通过指定[all]选项可以查看每个任务的成功任务和任务尝试的更多详情。 |
-list[all] | 显示所有作业。-list仅显示尚未完成的作业。 |
-kill-task <task-id> | 终止任务。终止的任务不计入失败尝试。 |
-fail-task <task-id> | 失败任务。失败的任务计入失败尝试。 |
-set-priority <job-id> <priority> | 更改作业的优先级。允许的优先级值为VERY_HIGH,HIGH,NORMAL,LOW,VERY_LOW |
查看作业状态的示例:
$ $HADOOP_HOME/bin/hadoop job -status <JOB-ID>$ $HADOOP_HOME/bin/hadoop job -status job_201310191043_0004