【Hadoop-驯化】一文教你轻松搞懂hadoop的基本原理

【Hadoop-驯化】一文教你轻松搞懂hadoop的基本原理
 
本次修炼方法请往下查看
在这里插入图片描述

🌈 欢迎莅临我的个人主页 👈这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合,智慧小天地!
🎇 免费获取相关内容文档关注:微信公众号,发送 pandas 即可获取
🎇 相关内容视频讲解 B站

🎓 博主简介:AI算法驯化师,混迹多个大厂搜索、推荐、广告、数据分析、数据挖掘岗位 个人申请专利40+,熟练掌握机器、深度学习等各类应用算法原理和项目实战经验

🔧 技术专长: 在机器学习、搜索、广告、推荐、CV、NLP、多模态、数据分析等算法相关领域有丰富的项目实战经验。已累计为求职、科研、学习等需求提供近千次有偿|无偿定制化服务,助力多位小伙伴在学习、求职、工作上少走弯路、提高效率,近一年好评率100%

📝 博客风采: 积极分享关于机器学习、深度学习、数据分析、NLP、PyTorch、Python、Linux、工作、项目总结相关的实用内容。

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


下滑查看解决方法

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

  

🎯 1.基本介绍

  hadoop是一个大规模的集群处理框架,可以用来对大规模的数据进行并行处理,用来处理大规模的日志信息很方便,目前用的比较多的基本就是hdfs和MR计算框架了,Hadoop的生态架构如下所示:
在这里插入图片描述

  目前对于上述的生态组件的话,hive,hdfs,hbase以及flume和sqoop用的比较多,机器学习库mahout现在基本不用了,但是随着spark的得绝对优势,目前hadoop的使用基本都很少了,对于非大数据开发工程师来说,基本了解上层的数据挖掘、分析的使用即可,平时基本接触不到底层的原理。

hadoop的架构图

   对于hadoop的数据生态架构处理流程的话,如下所示,当数据输入进来,对其进行分桶操作,然后对map的结果进行排序,最好将排序好的结果传给reduce端,一般我们对大规模的数据都进行streaming流式处理,基本就是写一个map函数和一个reduce函数,一般map函数是对数据进行简单的处理,而reduce阶段基本都是进行统计处理。
  对于流式处理基本有如下几个地方需要注意的就是了,常用的设置如下:

"-input", INPUT_FILE.getAbsolutePath(),
"-output", OUTPUT_DIR.getAbsolutePath(),
"-mapper", map, //map函数
"-reducer", reduce, //reduce函数
"-partitioner",用户自定义分割函数, 
"-jobconf", "stream.map.output.field.separator=.", //输出流的默认分隔符
"-jobconf", "stream.num.map.output.key.fields=2", //输出流的key的个数,这个会默认是1,只按第一列进行排序,
//如果想要多列需要进行设置

在这里插入图片描述

groupby例子

  使用hadoop进行数据处理,在写MR函数时,比较难写的一个地方就是分组聚合操作了,从上面的数据流操作过程可知,当map端的数据输入给reduce时是已经排好序了的,因此,具体写法如下:

    func_dict = {} //定义一个字典用来key的赋值
    def groupby(key, func, *param):
        // 字典初始化,用'\t'来表示初始key
        if func not in func_dict:
            func_dict[func] = '\t'
        //保存先前的key
        pkey = func_dict[func]
        // 如果map的key不同了且不为'\t'触发reduce函数
        if pkey != key:
            if pkye != '\t':
                func(pkey, *param)
            // 更新字典中的key
            func_dict[func] = key
            return True
        return False
    
    def reduce_func(k, v):
        """
            reduce的数据处理函数
        """
        print(k, v)

    // reduce端调用groupby的方法
    res_list = [] //用来保存相同key的values值
    for line in sys.stdin:
        //判断groupby函数是否触动
        if groupby(key, reduce_func, res_list):
            res_list = [] // 重新讲保存列表置空
        line = line.strip().split('\t')
        k, v = line[0], line[1]
        // 保留相同key的value
        res_list.append(value)
    groupby('\t', reduce_func, res_list,)

hadoop中数据倾斜问题

  在使用hadoop进行数据处理时,如果出现一个key的时比较多,这样对造成hadoop处理数据的效率特别慢,一般的处理方法有这些:

1.增加jvm内存,这适用于第一种情况(唯一值非常少,极少数值有非常多的记录值(唯一值少于几千)),这种情况下,
  往往只能通过硬件的手段来进行调优,增加jvm内存可以显著的提高运行效率。   
2.增加reduce的个数,这适用于第二种情况(唯一值比较多,这个字段的某些值有远远多于其他值的记录数,
  但是它的占比也小于百分之一或千分之一),我们知道,这种情况下,最容易造成的结果就是大量相同key被partition到一个分区,
  从而一个reduce执行了大量的工作,而如果我们增加了reduce的个数,这种情况相对来说会减轻很多,毕竟计算的节点多了,就算工
  作量还是不均匀的,那也要小很多。   
3.自定义分区,这需要用户自己继承partition类,指定分区策略,这种方式效果比较显著。   
4.重新设计key,有一种方案是在map阶段时给key加上一个随机数,有了随机数的key就不会被大量的分配到同一节点(小几率),待到
  reduce后再把随机数去掉即可。   
5.使用combinner合并,combinner是在map阶段,reduce之前的一个中间阶段,在这个阶段可以选择性的把大量的相同key数据先进行一个
  合并,可以看做是local reduce,然后再交给reduce来处理,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

算法驯化师

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

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

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

打赏作者

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

抵扣说明:

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

余额充值