mapreduce v1.0学习笔记

它是什么?

一个用于处理大数据开源的分布式计算框架,它由java实现,原生提供java编程交互接口,其它语言通过hadoop streaming方式和mapreduce框架交互。

可以做什么?

利用框架提供的简单编程接口,对海量数据进行离线统计分析编程。程序员只需要实现map接口(数据分解),reduce接口(数据汇总)即可,实现简单。

适用场景

离线情况下对海量数据进行分析

怎么使用?

示例 - 对文章单词进行计数(使用Python实现)

准备

1 搭建好hadoop 1.0集群
2 网上找一篇英语文章,上传到hdfs集群中,假如上传后文件路径为: /data/the_english_article.txt

说明

1 单词之间使用空格分隔

实现map接口(map.py)

import sys

for line in sys.stdin:
    ss = line.strip().split(" ")
    for s in ss:
        s = s.strip()
        if s != "":
            print "\t".join([s, 1])

实现reduce接口(reduce.py)

import sys

cur_word = None
sum = 0

for line in sys.stdin:
    word, cnt = line.strip().split("\t")
    if cur_word == None:
        cur_word = word
    if cur_word != word:
        print "\t".join([cur_word, sum])
        cur_word = word
        sum = 0
    sum += int(cnt)

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

本地模拟mapreduce执行

集群上调试效率很低,正常情况下,先在本地调试,确定代码无问题后,再在集群上跑测试

cat ./the_english_article.txt | python map.py | sort -k1 | python reduce.py | head -n 20

mapreduce集群上执行

1 创建一个shell脚本(run.sh)

HADOOP_CMD=hadoop命令完整路径
HADOOP_STREAMING_JAR=streaming jar包完整路径

INPUT_FILE=/data/the_english_article
OUTPUT_DIR=/output/wc

$HADOOP_CMD fs -rmr -skipTrash $OUTPUT_DIR

$HADOOP_CMD jar $HADOOP_STREAMING_JAR \
    -input $INPUT_FILE \
    -output $OUTPUT_DIR \
    -mapper "python map.py" \
    -reducer "python reduce.py" \
    -file ./map.py
    -file ./reduce.py

2 执行mapreduce任务

bash run.sh

3 查看结果

如果执行成功,hdfs上/output/wc会有part-00000这个文件,结果就保存在这个文件中(一个reduce对应一个输出文件,如果没有指定reduce任务数量,默认是1个reduce汇总)

4 杀死job

hadoop job -kill job_id

如何实现?

思想

分而治之 - mapreduce框架精髓所在

数据处理:分解 -> 求解 -> 合并

数据不移动,计算移动

代码数据量小,移动代码比移动数据性能要高,只针对map阶段

技术架构

415902-20180911000321200-980144680.png

角色描述
Job Tracker集群计算资源管理和任务调度以及任务监控,客户端提交任务给Job Tracker,计算框架的大脑
Task Tracker执行计算任务,任务状态上报以及资源使用情况上报,通过心跳方式,默认每隔3秒,资源slot管理

提交任务流程

415902-20180911000358546-796124192.png

mapreduce执行流程(偏宏观角度)

415902-20180911000427451-1488265689.png

1 红色部分是需要编程的部分,其它是mapreduce框架自带的功能
2 一个分片对应一个map
3 如果一行分片时中间被截断了,整行属于前一部分的分片
4 一个reduce会输出一个结果文件
5 map/reduce默认缓存区是100M,阀值是80%,达到这个阀值开始往硬盘溢写
6 reduce数据从map所在节点拷贝过来,会产生网络io,map不是
7 map/reduce是进程模型,有自己独立的空间,可以更好的控制资源
8 所有map任务执行完毕,才会开始执行reduce任务
9 同一分区下所有小文件归并为一个文件完成后,才开始执行reduce程序
10 数据分片规则:max(min.split,min(max.split,block))

操作含义
partition对key进行分组,有几个reduce就会通过哈希取模的方式分成几个组,这个操作可以确保相同的key一定会分配到同一个reduce
sort同一个组下对key进行排序,按字符串排序,确保数据有序
combine对相同key进行数据合并,实际上是提前对部分数据执行reduce操作,可以减少reduce阶段数据传输量,但是有些场景不适合,比如求中位数,会得到错误的结果
spill对缓冲区数据进行溢写,map会不断的产生数据,而内存缓冲区大小是有限的,当内存超过或者等于阀值的80%时,会锁住这部分内存,把这部分数据写入硬盘,生成一个spill.n的小文件,写入之前会分好组排好序
merge对溢写生成的小文件进行合并,生成一个更大的文件,合并的文件也是分好组排好序的数据,合并文件采用归并排序

mapreduce执行流程(偏微观角度)

415902-20180911000446399-2035095591.png

实践总结

1 TaskTracker节点map,reduce slot数量确定
机器CPU核数 - 1

2 单个map/reduce任务占用内存最好不要超过500M

3 单个map/reduce任务执行时间最好控制在1~3分钟,最好不要超过20分钟

4 压缩文件不能分片,目前为止只有text file, sequence file可以分片

5 ulimit查看open max files,这个值不能太小

6 reduce个数不能设置太少(执行慢,出错再试成本高),也不能设置太多(shuffle开销大,输出大量小文件)

hadoop streaming

技术架构

streaing在JVM和map/reduce进程之间,通过系统标准输入和系统标准输出交换数据

415902-20180911000502796-2087276383.png

优点

1 支持任意语言编程
2 开发效率高

缺点

1 会造成数据的二次拷贝
2 默认只能处理文本数据

常用命令行选项

选项含义必填/可选备注
-input指定作业的输入文件的hdfs路径必填支持使用*通配符,支持指定多个文件或目录(多个使用,分隔),可以多次使用
-output指定作业输出的hdfs目录必填目录必须不存在,并且执行作业任务的用户拥有创建该目录的权限,只能使用一次
-mapper用户自己写的map程序必填指示怎么执行map程序
-reducer用户自己写的reduce程序可选指示怎么执行reduce程序
-file提交单个文件到hdfs中可选程序代码文件,配置文件等,用于计算节点下载到本地,然后运行
-jobconf提交作业时的一些配置属性可选配置作业相关的参数,示例:mapred.job.name="xxxx"
-cacheFile任务相关文件已上传至hdfs,希望从hdfs拉取文件到本地可选hdfs://host:port/path/to/file#linkname选项在计算节点缓存文件,Streaming程序通过./linkname访问文件
-cacheArchive同-cacheFile类似,只不过由文件变成了压缩后的目录可选同上
-partitioner指定用于分区的类可选示例:org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner

常用提交作业时配置属性

选项含义
mapred.reduce.tasks指定作业reduce任务数量,默认是1个
mapred.job.name作业名
mapred.job.priority作业优先级
mapred.job.map.capacity最多同时运行map任务数
mapred.job.reduce.capacity最多同时运行reduce任务数
mapred.task.timeout任务没有响应(输入输出)的最大时间
mapred.compress.map.outputmap的输出是否压缩
mapred.map.output.compression.codecmap的输出压缩格式
mapred.output.compressreduce的输出是否压缩
mapred.output.compression.codecreduce的输出压缩方式
stream.map.output.field.separatormap输出分隔符
stream.num.map.output.key.fieldsmap输出中指定用于key的字段数
num.key.fields.for.partitionmap输出中指定用于分区的字段数
mapred.text.key.partitioner.options指定用于分区的字段,示例:指定第2个,第3个字段用于分区,xx=-k2,3

参考资料

【0】八斗学院mapreduce内部学习资料
【1】MapReduce Tutorial
https://hadoop.apache.org/docs/current1/mapred_tutorial.html
【2】Hadoop Streaming
http://hadoop.apache.org/docs/current/hadoop-streaming/HadoopStreaming.html

转载于:https://www.cnblogs.com/wadeyu/p/9624454.html

YARN框架对比MapReduce1.0的改进 随着大数据时代的到来,大数据处理框架也在不断地发展和完善。MapReduce1.0曾经是Hadoop生态圈中最重要的组件之一,但是它存在着一些局限性。为了解决这些问题,Hadoop社区开发了YARN框架,它可以更好地支持多种应用程序,并且更加灵活和可扩展。 下面是YARN框架相对于MapReduce1.0的改进: 1. 更好的资源管理:MapReduce1.0将资源管理和作业调度紧密耦合在一起,这意味着只能运行MapReduce作业。而YARN框架采用了更加灵活的资源管理方式,可以支持多种应用程序,包括Hadoop、Spark、Storm等等。 2. 更好的作业调度:YARN框架采用了分布式作业调度器,可以更加灵活地调度作业。这使得作业的启动和停止更加快速,而且更加容易实现资源共享和作业排队。 3. 更好的容错性:MapReduce1.0的容错性有限,如果某个节点出现故障,整个作业都会失败。而YARN框架采用了更加可靠的容错机制,可以自动重启失败的任务,并且可以在多个节点之间重新分配任务,保证作业的顺利运行。 4. 更好的可扩展性:MapReduce1.0的可扩展性有限,只能通过增加更多的节点来扩展。而YARN框架采用了更加分布式的架构,可以更加容易地扩展,支持更多的节点和更大规模的数据处理。 总的来说,YARN框架相对于MapReduce1.0的改进是非常显著的。它提供了更加灵活、可扩展和可靠的资源管理、作业调度和容错机制。这使得它成为了大数据处理框架中最重要的组件之一。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值