MapReduce

MapReduce

简介

  1. 处理海量数据的分布式计算框架
    • 数据分布式存储
    • 作业调度
    • 机器间通信等复杂问题
  2. 为何使用HDFS存储
    • 系统可靠(通过其它节点快速恢复)
    • 可扩展性
    • 并发处理
    • 注重数据处理的吞吐量
  3. MapReduce分而治之思想
    • 单点策略
      • 一个人数所有钞票,数出各种面值有多少张
    • 分治策略
      • 每个人分的一堆钞票,数出各种面值有多少张
      • 汇总,每个人负责统计一种面值
MapReduce计算框架
  1. 谈谈对shuffle的理解?mr计算框架的流程?什么是shuffle?

    • map:
      1. 数据经过切片(input split)
      2. 每个输入的切片都会使用一个map进行处理
      3. map输出的结果会有一个环形内存缓冲区(大小100M ,当阈值达到80%,在本地创建一个溢写文件,然后将缓冲区的数据写入该文件)
      4. 数据涉及(排序 【快速排序】、合并 【目的:尽力减少写入磁盘的数据量;减少数据传输到下一个阶段的数据量】)
      5. 通过jobtracker中维护的整个集群的宏观信息,找到对应map的输出位置即可
    • hash理解:决定数据分到哪个reduce中
      1. reduce有3个:0,1,2
      2. 100%3=1; 50%3=2; 10%3=1
    • reduce
      1. 本身也有环形内存缓冲区,阈值也是 80M,生成一个spil文件
      2. 有后台线程不断将小文件合并为有序的大文件(排序【归并排序】,和合并)
      3. 将合并的数据交给reduce,作为reduce文件的输入,并执行内部的业务逻辑代码进行处理
      4. 最终结果输出到hdfs/本地
    • shuffle阶段
      1. map任务的输出到reduce任务的输入的过程
      2. 在shuffle阶段,最致命的问题:网络带宽!!!
      3. 本质:
        1. 尽可能减少网络带宽带来的不必要的消耗
        2. 优化内存使用,减少磁盘的IO操作
  2. block是底层的文件夹,map是无法直接读取的。需要将block转换为内部可以识别的record

  3. 为什么hdfs中的块不能设置过大或者过小?

    • 过大: 在数据读取计算的过程中,如果过大容易导致网络传输时间较长,程序出现卡顿或者无响应,导致最终的失败恢复成本过高
    • 过小
      1. 存储海量小文件会占用大量的NN内存资源
      2. NN对外界提供服务的时候会频繁进行文件传输,严重占用网络/CPU资源
MapReduce编程模型
  1. 通过mr实现wordcount(wc)
    1. 源数据:was the title the
    2. 结果数据:
      1. the 1
业务场景
  1. 面试的点!!
    1. 通过文件名称模糊匹配到文件位置:find / -name "hadoop-streaming*"
    2. 通过文件中的字符串内容找到对应的文件:find / -name "*.sh" | xargs grep streaming
  2. 业务场景1:统计词语出现的次数
    map的输出,即为reduce的输入

import sys

current_word = None
sum = 0

for line in sys.stdin:
        word, val = line.strip().split('\t')

        if current_word == None:
                current_word = word

        if current_word != word:
                print "%s\t%s" % (current_word, sum)
                current_word = word
                sum = 0
        sum += int(val)
print "%s\t%s" % (current_word, str(sum))

1. is 1  cur=is word(下一个单词)=is    sum=0+1=1
2. is 1  cur=is word(下一个单词)=is   sum =1+1=2  
3. ···=> is, 2
4. today 1  cur=today(下一个单词)=good   sum=0+1=1  
5. => today,1

cat 1.data | python map.py | sort -k1 | python red.py统计词语

  1. 业务场景2:统计白名单中的单词
    1. cat The_Man_of_Property.txt | python map.py mapper_func white_list | sort -k1 | python red.py reducer_func | head
  2. 业务场景3:展示用户购买了哪些订单?
import sys
cur = None
cur_list = []
for line in sys.stdin:
        ss = line.strip().split('\t')
        key = ss[0]
        val = ss[1]
        if cur == None:
                cur = key
        elif cur!=key:
                print '%s\t%s'%(cur,','.join(cur_list))
                cur = key
                cur_list = []
        cur_list.append(val)
print '%s\t%s'%(cur,','.join(cur_list))

cat 1.data | python map.py | sort -k1 |python red.py or
cat 1.data | sort -k1 |python red.py

  1. user_id order_idsort1 1
    sort2 3
    sort2 88
    sort2 54
    sort1 2
    sort6 22
    sort6 58
    sort6 888
    2. 结果数据:
    sort1 1,2
    sort2 3,54,88
    sort6 22,58,888

  2. 业务场景4:

# map_a.py
import sys

for line in sys.stdin:
    ss = line.strip().split('   ')

    key = ss[0]
    val = ss[1]

    print "%s\t1\t%s" % (key, val)

# map_b.py
import sys

for line in sys.stdin:
    ss = line.strip().split('   ')

    key = ss[0]
    val = ss[1]

    print "%s\t2\t%s" % (key, val)

# red_join.py
import sys

val_1 = ""

for line in sys.stdin:
    key, flag, val = line.strip().split('\t')

    if flag == '1':
        val_1 = val
    elif flag == '2' and val_1 != "":
        val_2 = val
        print "%s\t%s\t%s" % (key, val_1, val_2)
        val_1 = ""


1. 源数据:
	* aaa1	123
	* aaa1	hadoop
2. 结果数据:
	*  uid order_id amt
	* aaa1 123 hadoop

快捷操作

vim
  1. vim编辑器里如何快速注释多行:
    1. Esc
    2. ctrl+v 显示数据块
    3. 按住向下箭头,选取行
    4. 输入“shift+i”,“shift+#”,两次“ESC”
  2. vim编辑器里如何快速取消注释
    1. ESC
    2. ctrl+v 显示数据块
    3. 按住向下箭头,选取行
    4. 输入“x”
  3. esc状态下 g+d:高亮显示需找单词的光标
  4. sh -x run.sh:调试脚本将变量信息进行输出(sh run.sh也可)

Hdoop Streaming

简介
  1. MapReduce和HDFS采用
  2. Streaming框架允许让任何语言编写的map,reduce程序额能够在
优点
  1. 开发效率高
  2. 程序运行效率高
  3. 便于平台进行资源控制
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卿享时光漫长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值