Hadoop大数据初学者指南

IT知识
207
0
0
2024-01-07

思维导图

导语

Hadoop是一个开源框架,允许在分布式环境中使用简单的编程模型来存储和处理大数据,跨计算机集群。它被设计成可以从单个服务器扩展到数千台机器,每台机器都提供本地计算和存储。

Big Data概述

大数据中的数据分为三种类型

  1. 结构化数据:关系型数据。
  2. 半结构化数据:XML数据。
  3. 非结构化数据:Word、PDF、文本和媒体日志。

研究处理大数据的技术时将考虑以下两类技术

  1. 操作性大数据:像MongoDB这样的系统,为实时、交互式工作负载提供操作能力,其中数据主要被捕获和存储。使得操作性大数据工作负载更易于管理、更便宜、更快速实施。
  2. 分析大数据:包括大规模并行处理(MPP)数据库系统和MapReduce等系统,它们提供对回顾性和复杂分析的能力,可以触及大部分或全部数据。

大数据相关的主要挑战如下:

  1. 数据捕获
  2. 筹建
  3. 存储
  4. 搜索
  5. 共享
  6. 传输
  7. 分析
  8. 呈现

Hadoop

Hadoop框架应用程序在提供分布式存储和计算的环境中运行于计算机集群。Hadoop被设计为可以从单个服务器扩展到成千上万台机器,并且每台机器都提供本地计算和存储。

Hadoop框架四个模块

  1. Hadoop公共模块:这些是其他Hadoop模块所需的Java库和实用程序。这些库提供文件系统和操作系统级别的抽象,并包含启动Hadoop所需的必要Java文件和脚本。
  2. Hadoop YARN模块:这是一个用于作业调度和集群资源管理的框架。
  3. Hadoop分布式文件系统模块:一个提供高吞吐量访问应用程序数据的分布式文件系统。
  4. Hadoop MapReduce模块:这是基于YARN系统的用于并行处理大数据集的系统。

MapReduce

Hadoop MapReduce是一个软件框架,可以轻松编写应用程序,在可靠且容错的方式下并行处理大量数据,利用大规模集群(数千个节点)上的廉价硬件。

MapReduce指的是Hadoop程序执行的两个不同任务:

  1. Map任务:这是第一个任务,它将输入数据转换为一组数据,其中各个元素被分解为元组(键/值对)。
  2. 减少任务:该任务以映射任务的输出作为输入,并将这些数据元组合并为较小的元组集。减少任务始终在映射任务之后执行。通常,输入和输出都存储在文件系统中。框架负责调度任务,监视任务并重新执行失败的任务。

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进行所需处理:

  1. 在分布式文件系统中输入和输出文件的位置。
  2. 以jar文件的形式包含map和reduce函数实现的Java类。
  3. 通过设置特定于作业的不同参数来进行作业配置。

第二步:Hadoop作业客户端将作业(jar/可执行文件等)和配置提交给JobTracker,然后JobTracker负责将软件/配置分发给从节点、调度任务并监测任务的状态,并向作业客户端提供状态和诊断信息。

第三步:不同节点上的TaskTracker按照MapReduce的实现执行任务,并将reduce函数的输出存储到文件系统上的输出文件中。

Hadoop的优势

  1. 允许用户快速编写和测试分布式系统。
  2. 高效的,会自动将数据和工作分布到机器上,并利用CPU核心的底层并行性。
  3. 不依赖硬件提供容错性和高可用性(FTHA)
  4. 动态地添加或移除集群中的服务器,并且 Hadoop 可继续正常运行而不中断
  5. 兼容所有平台,因为它是基于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操作模式

  1. 本地/单机模式:默认情况下配置为独立模式。没有守护进程在运行,一切都在单个JVM中运行。单机模式适用于在开发过程中运行MapReduce程序,因为易于测试和调试。
  2. 伪分布模式:这是在单台机器上的分布式模拟。每个Hadoop守护进程(如hdfs、yarn、MapReduce等)将作为一个单独的Java进程运行。这种模式对于开发非常有用。
  3. 完全分布模式:这种模式是完全分布式的,至少需要两台或更多的机器作为集群。

Hadoop分布式文件系统(HDFS)

Hadoop文件系统采用分布式文件系统设计开发。它在廉价硬件上运行。与其他分布式系统不同,HDFS具有高度容错性,并使用低成本硬件设计。HDFS存储了大量的数据并提供更简单的访问。为了存储如此巨大的数据量,文件被存储跨多台计算机。这些文件以冗余的方式存储,以防止系统在发生故障时可能丢失数据。

HDFS的特点

  1. 适用于分布式存储和处理。
  2. Hadoop提供了一个命令接口来与HDFS进行交互。
  3. namenode和datanode的内置服务器帮助用户轻松检查群集的状态。
  4. 流式访问文件系统数据。
  5. HDFS提供文件权限和身份验证。

HDFS架构

Namenode:Namenode是包含GNU/Linux操作系统和Namenode软件的商业硬件。它是可以在商业硬件上运行的软件。具有Namenode的系统充当主服务器,并执行以下任务:

  1. 管理文件系统命名空间。
  2. 控制客户端对文件的访问。

Datanode:Datanode是具有GNU/Linux操作系统和Datanode软件的商业硬件。在集群中的每个节点(商业硬件/系统)都会有一个Datanode。这些节点管理其系统的数据存储。

  1. Datanode根据客户端的请求执行读写操作。
  2. 根据namenode的指令执行块的创建、删除和复制等操作。

一般用户数据存储在HDFS文件中。文件系统中的文件会被分成一个或多个段并/或存储在单独的数据节点中。这些文件段被称为块。换句话说,HDFS可以读取或写入的最小数据量称为块。默认块大小为64MB,但可以根据需要在HDFS配置中进行增加。

HDFS的目标

  1. 故障检测和恢复:由于HDFS包含大量的通用硬件,组件故障经常发生。因此,HDFS应该具备快速和自动的故障检测和恢复机制。
  2. 大型数据集:HDFS应该有每个集群的数百个节点来管理具有大型数据集的应用程序。
  3. 数据位置硬件:当计算发生在数据附近时,请求的任务可以高效完成。特别是在涉及大型数据集时,它可以减少网络流量并增加吞吐量

HDFS操作

  1. 对配置的HDFS文件系统进行格式化
$ hadoop namenode -format
  1. 启动分布式文件系统。以下命令将启动名节点和数据节点作为一个集群
$ start-dfs.sh
  1. 查找文件列表和文件状态
$ $HADOOP_HOME/bin/hadoop fs -ls <args>

将数据插入HDFS

本地系统中有一个名为file.txt的文件,希望将其保存在HDFS文件系统中

  1. 创建一个输入目录
$ $HADOOP_HOME/bin/hadoop fs -mkdir /user/input
  1. 将数据文件从本地系统传输并存储到Hadoop文件系统
$ $HADOOP_HOME/bin/hadoop fs -put /home/file.txt /user/input
  1. ls命令验证文件
$ $HADOOP_HOME/bin/hadoop fs -ls /user/input

从HDFS检索数据

HDFS中有一个名为outfile的文件

  1. 使用cat命令查看HDFS中的数据
$ $HADOOP_HOME/bin/hadoop fs -cat /user/output/outfile
  1. 使用get命令将文件从HDFS获取到本地文件系统
$ $HADOOP_HOME/bin/hadoop fs -get /user/output/ /home/hadoop_tp/
  1. 关闭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程序的步骤

  1. 创建一个目录来存储已编译的Java类
$ mkdir units
  1. 下载Hadoop-core-1.2.1.jar,该jar文件用于编译和执行MapReduce程序
  2. 编译ProcessUnits.java程序并创建一个jar文件
$ javac -classpath hadoop-core-1.2.1.jar -d units ProcessUnits.java$ jar -cvf units.jar -C units/ .
  1. HDFS中创建一个输入目录
$ $HADOOP_HOME/bin/hadoop fs -mkdir input_dir
  1. 将名为sample.txt的输入文件复制到HDFS的输入目录中
$ $HADOOP_HOME/bin/hadoop fs -put /home/hadoop/sample.txt input_dir
  1. 验证输入目录中的文件
$ $HADOOP_HOME/bin/hadoop fs -ls input_dir/
  1. 从输入目录中获取输入文件并运行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
  1. 验证输出文件夹中的结果文件
$ $HADOOP_HOME/bin/hadoop fs -ls output_dir/$ $HADOOP_HOME/bin/hadoop fs -cat output_dir/part-00000
  1. 查看Part-00000文件中的输出
$ $HADOOP_HOME/bin/hadoop fs -cat output_dir/part-00000
  1. 将输出文件夹从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