从0开始学大数据
李智慧
同程艺龙交通首席架构师,前Intel大数据架构师,《大型网站技术架构》作者
立即订阅
14333 人已学习
课程目录
已完结 46 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 为什么说每个软件工程师都应该懂大数据技术?
免费
预习模块 (3讲)
预习 01 | 大数据技术发展史:大数据的前世今生
预习 02 | 大数据应用发展史:从搜索引擎到人工智能
预习 03 | 大数据应用领域:数据驱动一切
模块一 Hadoop大数据原理与架构 (7讲)
04 | 移动计算比移动数据更划算
05 | 从RAID看垂直伸缩到水平伸缩的演化
06 | 新技术层出不穷,HDFS依然是存储的王者
07 | 为什么说MapReduce既是编程模型又是计算框架?
08 | MapReduce如何让数据完成一次旅行?
09 | 为什么我们管Yarn叫作资源调度框架?
10 | 模块答疑:我们能从Hadoop学到什么?
模块二 大数据生态体系主要产品原理与架构 (7讲)
11 | Hive是如何让MapReduce实现SQL操作的?
12 | 我们并没有觉得MapReduce速度慢,直到Spark出现
13 | 同样的本质,为何Spark可以更高效?
14 | BigTable的开源实现:HBase
15 | 流式计算的代表:Storm、Flink、Spark Streaming
16 | ZooKeeper是如何保证数据一致性的?
17 | 模块答疑:这么多技术,到底都能用在什么场景里?
模块三 大数据开发实践 (8讲)
18 | 如何自己开发一个大数据SQL引擎?
19 | Spark的性能优化案例分析(上)
20 | Spark的性能优化案例分析(下)
21 | 从阿里内部产品看海量数据处理系统的设计(上):Doris的立项
22 | 从阿里内部产品看海量数据处理系统的设计(下):架构与创新
23 | 大数据基准测试可以带来什么好处?
24 | 从大数据性能测试工具Dew看如何快速开发大数据系统
25 | 模块答疑:我能从大厂的大数据开发实践中学到什么?
模块四 大数据平台与系统集成 (6讲)
26 | 互联网产品 + 大数据产品 = 大数据平台
27 | 大数据从哪里来?
28 | 知名大厂如何搭建大数据平台?
29 | 盘点可供中小企业参考的商业大数据平台
30 | 当大数据遇上物联网
31 | 模块答疑:为什么大数据平台至关重要?
模块五 大数据分析与运营 (5讲)
32 | 互联网运营数据指标与可视化监控
33 | 一个电商网站订单下降的数据分析案例
34 | A/B测试与灰度发布必知必会
35 | 如何利用大数据成为“增长黑客”?
36 | 模块答疑:为什么说数据驱动运营?
模块六 大数据算法 (6讲)
37 | 如何对数据进行分类和预测?
38 | 如何发掘数据之间的关系?
39 | 如何预测用户的喜好?
40 | 机器学习的数学原理是什么?
41 | 从感知机到神经网络算法
42 | 模块答疑:软件工程师如何进入人工智能领域?
智慧写给你的寄语 (1讲)
所有的不确定都是机会——智慧写给你的新年寄语
结束语 (2讲)
结束语 | 未来的你,有无限可能
第2季回归丨大数据之后,让我们回归后端
从0开始学大数据
登录|注册

07 | 为什么说MapReduce既是编程模型又是计算框架?

李智慧 2018-11-13
在 Hadoop 问世之前,其实已经有了分布式计算,只是那个时候的分布式计算都是专用的系统,只能专门处理某一类计算,比如进行大规模数据的排序。很显然,这样的系统无法复用到其他的大数据计算场景,每一种应用都需要开发与维护专门的系统。而 Hadoop MapReduce 的出现,使得大数据计算通用编程成为可能。我们只要遵循 MapReduce 编程模型编写业务处理逻辑代码,就可以运行在 Hadoop 分布式集群上,无需关心分布式计算是如何完成的。也就是说,我们只需要关心业务逻辑,不用关心系统调用与运行环境,这和我们目前的主流开发方式是一致的。
请你先回忆一下,在前面专栏第 4 期我们讨论过,大数据计算的核心思路是移动计算比移动数据更划算。既然计算方法跟传统计算方法不一样,移动计算而不是移动数据,那么用传统的编程模型进行大数据计算就会遇到很多困难,因此 Hadoop 大数据计算使用了一种叫作 MapReduce 的编程模型。
其实 MapReduce 编程模型并不是 Hadoop 原创,甚至也不是 Google 原创,但是 Google 和 Hadoop 创造性地将 MapReduce 编程模型用到大数据计算上,立刻产生了神奇的效果,看似复杂的各种各样的机器学习、数据挖掘、SQL 处理等大数据计算变得简单清晰起来。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《从0开始学大数据》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(49)

  • 落叶飞逝的恋
    老师,我是个大数据的初学者,因为这个专栏是从零入门的,但是目前的我还不知道如何在自己机器上安装哪些软件?如何操作?因为这些问题没解决,所以没办法真切的体会到文中的处理单词统计大数据的魅力。所以希望老师能讲下必备软件的安装的内容,及操作环节。谢谢
    2018-11-13
    2
    65
  • intuition
    李老师的文章已经不仅仅局限于技术本身 更多的是对人生的的思考 如何去成为一个思考者才是我们所追求的目标
    2018-11-13
    28
  • 无形
    把pageID和age当做key计算出现的次数并做汇总,然后对key排序,输出排序后的key和其对应的总次数
    2018-11-13
    18
  • 西贝木土
    package com.company.sparkcore

    import org.apache.log4j.{Level, Logger}
    import org.apache.spark.{SparkConf, SparkContext}

    object CountPVByGroup {
      def main(args: Array[String]): Unit = {
        val conf = new SparkConf()
          .setAppName(CountPVByGroup.getClass.getSimpleName)
          .setMaster("local")
        Logger.getLogger("org.apache.spark").setLevel(Level.OFF)
        Logger.getLogger("org.apache.hadoop").setLevel(Level.OFF)
        val sc = new SparkContext(conf)
        val lines = sc.textFile("file:///e:/pv_users.txt")
        //拼接成(1_25,1)的形式
        val newKeyValue = lines.map(_.split(",")).map(pvdata => ((pvdata(0)+ "_" + pvdata(1)),1))
       //对上述KV进行统计
        val pvcount = newKeyValue.reduceByKey(_ + _)
        //将拼接符号去掉,组合成形如(1,25,1)的形式
        val pvid_age_count = pvcount.map(newkv => (newkv._1.split("_")(0),newkv._1.split("_")(1),newkv._2))
        //结果输出
    // (1,25,1)
    // (2,25,2)
    // (1,32,1)
        pvid_age_count.collect().foreach(println)
      }

    }

    作者回复: 👍🏻

    2018-11-13
    16
  • 朱国伟
    单机安装伪hadoop集群
    见:https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-common/SingleCluster.html
    注:在Mac中安装遇到了一些问题 但是google一下就能解决 恕不一一道来

    思考题解答步骤
    cat pv_users
    1,25
    2,25
    1,32
    2,25

    # 导入该文件到dfs中
    bin/hdfs dfs -put pv_users pv_users

    # 因为每一行只有pageid, age并且中间没有空格 可以直接利用hadoop自带的wordcount程序
    # 读取dfs中的pv_user文件 进行统计 然后将结果输出到pv_users_count中
    bin/yarn jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.9.1.jar wordcount pv_users pv_users_count
    # 读取统计结果
    bin/hdfs dfs -cat pv_users_count/part-r-00000
    1,25 1
    1,32 1
    2,25 2

    作者回复: 👍🏻

    2018-11-17
    15
  • 喜笑延开
    不能光想,必须动手实践:
    ## Mapper
    public class PageMapper extends Mapper<LongWritable,Text,Text,IntWritable> {
        @Override
        protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
            String data = value.toString();
            String[] words = data.split("\n");
            for (String word : words) {
                context.write(new Text(word), new IntWritable(1));
            }
        }
    }
    ## Reducer
    public class PageReducer extends Reducer<Text,IntWritable,Text,IntWritable> {
        @Override
        protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
            int total=0;
            for (IntWritable value : values) {
                total=total+value.get();
            }
            context.write(key, new IntWritable(total));
        }
    }
    ## Main
    public class PageMain {
        public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
            Job job = Job.getInstance();
            job.setJarByClass(PageMain.class);

            job.setMapperClass(PageMapper.class);
            job.setMapOutputKeyClass(Text.class);
            job.setMapOutputValueClass(IntWritable.class);

            job.setReducerClass(PageReducer.class);
            job.setOutputKeyClass(Text.class);
            job.setOutputValueClass(IntWritable.class);

            FileInputFormat.setInputPaths(job,new Path(args[0]));
            FileOutputFormat.setOutputPath(job, new Path(args[1]));

            job.waitForCompletion(true);


        }
    }

    ## 命令行
    hadoop jar page-1.0-SNAPSHOT.jar PageMain /input/page /output5
    ps:第一次运行报错了~~(不练不知道)
    错误:Initialization of all the collectors failed. Error in last collector was :interface javax.xml.soap.
    原因:编写Main的时候,Text的引用import错了,习惯了弹出提示直接确定~应该导入`import org.apache.hadoop.io.Text;`

    作者回复: 👍🏻

    2018-11-23
    8
  • 有铭
    我想问一下那个计算过程的示意图里map输入部分,上面的是0,12,下面是0,13,是啥意思?

    作者回复: map函数输入的key,表示这行数据在文件中的偏移量,通常忽略掉

    2018-11-15
    1
    8
  • Ahikaka
    老师能不能推荐些学大数据的书籍,博客,网站 。
    2018-11-13
    8
  • 一箭中的
    将pageid和 age拼接成字符串当做一个key,然后通过Map和Reduce计算即可得出对应的count
    2018-11-13
    8
  • 三木子
    看到这个问题,我在想我在怎么想?
    2018-11-13
    5
  • 呆猫
    文章真的是看的赏心悦目,尤其是那段描述抽象的文字😃

    作者回复: 谢谢

    2018-11-15
    4
  • Lambda
    好像中间拉下了 shuffle
    2018-11-13
    4
  • 小成
    老师,我是大数据初学者,除了编程语言本身的,可以推荐一些书籍或者资料辅助这个专栏的学习吗,像hadoop相关类的,这期的代码看不懂了。
    2019-01-01
    3
  • 无处不在
    这个如果在复杂或者高级一点,就需要用mapreduce的序列化对象作为key的功能去实现了,最近也在学习大数据,学的时候感觉找到了sql的本质,记得公司前年的项目就是手写了一堆js函数,实现了mongodb的类似sql的分组聚合操作。
    后续可以开设视频的专栏就更好了
    2018-11-21
    3
  • 小辉辉
    java8中的流式框架也用的MapReduce,之前一直没理解用MapReduce的意义何在,今天突然顿悟。
    软件中很多思想和设计都是通用的,今天接触一种新东西,明天说不定在其它地方又能碰到,又能加深一遍印象。所以说学得多了,很多时间就可以融会贯通了。

    作者回复: 👍🏻

    2018-11-13
    3
  • 糊糊
    mapreduce核心思想就跟传统的SQL中的group by一样
    2018-11-15
    2
  • ward-wolf
    我的思路和前面几个同学的类似,就是把文本直接当做key,value使用数字统计,最后就是通过reduce统计出现次数了

    作者回复: 是的

    2018-11-14
    2
  • 曾海飞
    为什么相同key的合并是形成<key, value集合>而不是直接形成一个<key, value reduce后的结果>呢?后者不是效率更高吗?

    作者回复: map任务有很多,所以map任务输出的key全部合并在一起才能reduce,请看下期文章。

    2018-11-14
    2
  • 明天更美好
    对于大数据来说是盲区,如果应用直接往hbase中写可以吗?2.5万的并发。hbase可以满足我们的查询需求吗?还有日志分析

    作者回复: 你可能需要一个完整的技术架构方案,而不只是HBASE能不能搞定的问题,建议你看下我写另一本书《大型网站技术架构:核心原理与案例分析》,专栏后面也会对大数据架构有各个角度的探讨,欢迎持续关注

    2018-11-13
    2
  • 老男孩
    老师关于抽象是洞察事物本质的总结很精辟。关于思考题,我的思路是把pageid+age作为map函数计算key值,value分别是1。然后reduce再根据key对value的集合进行sum。就可以得出sql的结果。

    作者回复: 是的

    2018-11-13
    2
收起评论
49
返回
顶部