
Hadoop是一个开源框架,允许在分布式环境中使用简单的编程模型来存储和处理大数据,跨计算机集群。它被设计成可以从单个服务器扩展到数千台机器,每台机器都提供本地计算和存储。
Hadoop框架应用程序在提供分布式存储和计算的环境中运行于计算机集群。Hadoop被设计为可以从单个服务器扩展到成千上万台机器,并且每台机器都提供本地计算和存储。
Hadoop MapReduce是一个软件框架,可以轻松编写应用程序,在可靠且容错的方式下并行处理大量数据,利用大规模集群(数千个节点)上的廉价硬件。
MapReduce指的是Hadoop程序执行的两个不同任务:
MapReduce框架由一个主JobTracker和每个集群节点一个从TaskTracker组成。主节点负责资源管理,跟踪资源消耗/可用性,并在从节点上调度任务组件任务,监视任务并重新执行失败的任务。从节点的TaskTracker按照主节点的指示执行任务,并定期向主节点提供任务状态信息。
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/可执行文件等)和配置提交给JobTracker,然后JobTracker负责将软件/配置分发给从节点、调度任务并监测任务的状态,并向作业客户端提供状态和诊断信息。
第三步:不同节点上的TaskTracker按照MapReduce的实现执行任务,并将reduce函数的输出存储到文件系统上的输出文件中。
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/jarHadoop文件系统采用分布式文件系统设计开发。它在廉价硬件上运行。与其他分布式系统不同,HDFS具有高度容错性,并使用低成本硬件设计。HDFS存储了大量的数据并提供更简单的访问。为了存储如此巨大的数据量,文件被存储跨多台计算机。这些文件以冗余的方式存储,以防止系统在发生故障时可能丢失数据。
Namenode:Namenode是包含GNU/Linux操作系统和Namenode软件的商业硬件。它是可以在商业硬件上运行的软件。具有Namenode的系统充当主服务器,并执行以下任务:
Datanode:Datanode是具有GNU/Linux操作系统和Datanode软件的商业硬件。在集群中的每个节点(商业硬件/系统)都会有一个Datanode。这些节点管理其系统的数据存储。
一般用户数据存储在HDFS文件中。文件系统中的文件会被分成一个或多个段并/或存储在单独的数据节点中。这些文件段被称为块。换句话说,HDFS可以读取或写入的最小数据量称为块。默认块大小为64MB,但可以根据需要在HDFS配置中进行增加。
$ hadoop namenode -format$ start-dfs.sh$ $HADOOP_HOME/bin/hadoop fs -ls <args>本地系统中有一个名为file.txt的文件,希望将其保存在HDFS文件系统中
$ $HADOOP_HOME/bin/hadoop fs -mkdir /user/input$ $HADOOP_HOME/bin/hadoop fs -put /home/file.txt /user/input$ $HADOOP_HOME/bin/hadoop fs -ls /user/inputHDFS中有一个名为outfile的文件
$ $HADOOP_HOME/bin/hadoop fs -cat /user/output/outfile$ $HADOOP_HOME/bin/hadoop fs -get /user/output/ /home/hadoop_tp/$ stop-dfs.sh命令 | 描述 |
|---|---|
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关联的文件权限。 |
术语 | 描述 |
|---|---|
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。 |
任务尝试 | 在从节点上执行任务的特定实例。 |
ProcessUnits.java

编译和执行Process Units程序的步骤
$ mkdir units$ javac -classpath hadoop-core-1.2.1.jar -d units ProcessUnits.java$ jar -cvf units.jar -C units/ .$ $HADOOP_HOME/bin/hadoop fs -mkdir input_dir$ $HADOOP_HOME/bin/hadoop fs -put /home/hadoop/sample.txt input_dir$ $HADOOP_HOME/bin/hadoop fs -ls input_dir/$ $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$ $HADOOP_HOME/bin/hadoop fs -cat output_dir/part-00000$ $HADOOP_HOME/bin/hadoop fs -cat output_dir/part-00000/bin/hadoop dfs get output_dir /home/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 | 获取/设置每个守护程序的日志级别。 |
通用选项 | 描述 |
|---|---|
-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