欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

MapReduce学习笔记

程序员文章站 2022-03-16 10:57:02
...

MapReduce是一个用于处理海量数据的分布式计算框架

     自身不存储数据,数据在HDFS上

解决了:

  1. 数据分布式存储
  2. 作业调度
  3. 容错
  4. 机器间通信等复杂问题

MapReduce简单数据处理流程介绍:

MapReduce学习笔记

 

HDFS组件、总体采用master/slave架构:

  1. Client:通过与NameNode和DataNode交互访问HDFS中的文件。
  2. NameNode:系统"总管",负责管理HDFS目录树和相关文件元数据信息。信息以"fsimage"(元数据镜像文件),"editlog"(HDFS改动日志)两个文件形式存在本地磁盘。还负责监控DataNode状态,若DN挂掉,则移除并重新备份上面的数据。
  3. SecondaryNameNode:定期合并fsimage和edits,并传输给NameNode。
  4. DataNode:负责实际的数据存储,并将信息汇报给NameNode。以Block为基本单位(默认64M)。

MapReduce学习笔记

 

MapReduce架构:

      MapReduce处理单位 :split

MapReduce学习笔记

  1. Client:可以利用接口查看作业运行状态。
  2. 2.JobTracker:负责资源监控和作业调度。
  3. TaskTracker:周期性的通过心跳方式将资源使用情况和作业运行状态汇报给Jobtracker,同时接受命令并执行操作。TaskTracker使用“slot”等量划分本节点的资源量。"slot"代表计算资源,一个task获取到一个slot后才有机会运行。
  4. Task:分为Map task和Reduce Task,由TaskTracker启动。

MapReduce学习笔记

 

Map Task过程:

  1. split ——>决定Map Task个数
  2. 调用map()函数
  3. 分成若干个partition,每一个partition被一个Reduce Task处理。

MapReduce学习笔记

Reduce Task过程:

  1. Shuffle阶段,读取中间数据
  2. Sort阶段,对key排序
  3. Reduce阶段,合并key相同的value,最终输出到HDFS上。

MapReduce学习笔记

例子:简单wordcount

   在hadoop 1.0集群中

  map.py

import sys

for line in sys.stdin:
	ss = line.strip().split(' ')
	for word in ss:
		print '\t'.join([word.strip(), '1'])

red.py

import sys

cur_word = None
sum = 0

for line in sys.stdin:
	ss = line.strip().split('\t')
	if len(ss) != 2:
		continue
	word, cnt = ss

	if cur_word == None:
		cur_word = word

	if cur_word != word:
		print '\t'.join([cur_word, str(sum)])
		cur_word = word
		sum = 0

	sum += int(cnt)

print '\t'.join([cur_word, str(sum)])

run.sh 启动脚本

HADOOP_CMD="/usr/local/src/hadoop-1.2.1/bin/hadoop"
STREAM_JAR_PATH="/usr/local/src/hadoop-1.2.1/contrib/streaming/hadoop-streaming-1.2.1.jar"

INPUT_FILE_PATH="/1.data"
OUTPUT_PATH="/output"

$HADOOP_CMD fs -rmr -skipTrash $OUTPUT_PATH

# Step 1.
$HADOOP_CMD jar $STREAM_JAR_PATH \
    -input $INPUT_FILE_PATH \
    -output $OUTPUT_PATH \
    -mapper "python map.py" \
    -reducer "python red.py" \
    -file ./map.py \
    -file ./red.py
  1. bash run.sh
  2. hadoop fs -ls /output
  3. hadoop fs -text /output/part-00000 | head

作业结果如下,启动脚本之前需要把文件1.data上传到hdfs中:hadoop fs -put 1.data /

MapReduce学习笔记

 

相关标签: mapreduce