其他测试框架 测试开发之路--Spark 之旅 (一):大数据介绍

孙高飞 · 2017年03月16日 · 最后由 bauul 回复于 2017年06月07日 · 946 次阅读

背景

之前的 Flask 的基础教程暂时先结束了。 因为目前所涉及到的东西已经能够满足我的需要。剩下的东西都是根据需求修改和优化。 不涉及更多的东西。 所以我也就是平时维护着,我们接下来讲讲 Spark,为什么要讲 Spark 呢,因为我们性能测试的需求要造 10 亿级甚至更多的数据。普通的方式肯定不行了,得用到 spark 提交到 yarn 上运行才跑的动。所以现在我们来谈论谈论大数据方面的东西。同时大数据也是人工智能的基础,现在搞搞大数据的东西,也为以后讨论人工智能方面的测试做做铺垫吧。

起源

万事开头难,我刚接触大数据的那会是天天的一脸懵逼。因为以前只跟数据库打过交道,对于 hadoop 生态圈完全是没听过的状态。看资料的时候也根本看不懂。所以我先介绍一下基础的概念吧。
大数据,首先要能存的下大数据。 传统的数据库虽然衍生了主从,分片。但是他们在存储上也无法应对 TB 甚至 PB 的数据量,尤其是在计算处理上他们更无法突破单机计算的桎梏。因为我们传统的文件系统是单机的,不能横跨不同的机器。在前些年的时候随着互联网的崛起,我们进入了数据爆炸的时代。传统的数据存储方式不论在存储量上还是计算性能上都已经越来越跟不上数据发展的速度了。当时开发一个新的方式处理数据在业界呼声很高。之后在 04 年 (好像是吧,记不清了)Google 发表了论文--MapReduce,详细讲述了 Google 的分布式计算原理。这时候业界才发现原来数据还可以这么玩,但是 Google 的良心大大滴坏,他只发了论文但是没有开源,这把一干人等急的抓耳挠腮,后来 Apache 组织了一帮人根据 Google 的论文糊出了一个 hadoop。直到现在 hadoop 生态已经发展了 10 余年 (是的没错,我们现在看的很高大上的 hadoop 技术是人家 Google 玩剩下的)。

Hadoop 的出现

先前说我们传统的文件系统是单机的,无法横跨不同的机器。而 HDFS 的出现 (Hadoop Distributed FileSystem),打破了我们单机的限制。HDFS 是 Apache 专门研发的分布式文件系统。设计本质上是为了大量的数据能横跨成百上千台机器,但是你看到的是一个文件系统而不是多个。比如说我要取/hdfs/gaofei/file1 上的数据。你引用的是一个文件路径,但是实际的数据是存放在很多个不同的机器上的。作为用户,我们不知道实际的物理存储结构,我们知道的只要暴露给我们的逻辑路径。那么在我们有能力存在这么大的数据后,就开始考虑怎么处理数据了。 虽然 HDFS 帮助我们管理不同机器上的数据并抽象一个统一接口给我们。但是这仍然改变不了这些数据非常大的事实。 如果我们仍然是在一台机器上处理这海量的数据,那性能上仍然是不可接受的。那么如果我们要在多台机器上同时处理这些数据,就面临了一个机器之间如何通信和调度的问题。 这就是 MapReduce/Spark 的功能。MapReduce 是第一代的产物,Apache 研发的 hadoop 就是基于 MapReduce 框架 (根据 Google 的论文而来)。Spark 是第二代。 MapReduce 采用了很简化的模型,只有 Map 和 Reduce 两个计算过程(中间用 shuffle 串联)。

MapReduce

那什么是 MapReduce 呢, 举个最常用的 wordcount 的例子。 假如你需要统计一个巨大的文件中所有单词出现的词频。 首先你需要很多台机器同时并发的读取这个文件的各个部分,分别把自己读到的部分进行第一步计算。 假如在这台机器上,我读取了一部分数据,对这些数据统计出了类似(Hello--100 次)(word--1000 次)这样的结果。 每台机器都读取了部分数据并做了相同的操作。这就是 MapReduce 中的 Map 阶段 (额,中间其实还有别的操作,恕我学艺不精,解释不清了)。然后我们进入 Reduce 阶段,这个阶段也会并发启动很多的机器,框架会将 Map 机器上的数据按一定规则分别放到这些 Reduce 机器上进行计算。 例如我们把所有 Hello 这个单词的放在 ReduceA 上,把所有 word 这个单词的数据放到 ReduceB 上。然后 ReduceA 汇总所有的 Map 数据中的 Hello 这个单词的结果,计算出这个单词在数据中出现的词频为 1000 次。 ReduceB 汇总所有 Word 这个单词并计算出它在数据中出现的词频为 1000 次。这样我们就统计出了这个巨大文件的词频了。 这就是 MapReduce, 可以简单理解为 Map 阶段并发机器读取不同的数据块做第一步处理,然后 Reduce 阶段并发机器按规则汇总 Map 阶段的数据做第二部处理。中间有个很重要的过程是 shuffle,暂时可以理解为这个 shuffle 就是哪些 Map 的数据放到哪个 Reduce 上的规则过程。详细的不表示了,shuffle 这个东西有点复杂,我们之后再讲。

Spark

MapReduce 的模型简单暴力,但是程序写起来真麻烦。因为全靠程序员编码,框架只是提供了 Map 和 Reduce 的函数,至于里面什么逻辑全靠你自己写。于是有了 pig 和 Hive。Pig 我没怎么了解过,Hive 是基于 SQL 的,它们把 SQL 翻译成的 MapReduce 程序。有了 Hive 以后,大家发现 Sql 实在太容易写了,这比写 java 代码方便太多了。例如我司的产品中,专门有一个算子是 sql,可以让业务人员也 sql 做拼表的动作。但是我们发现 Hive 在 MapReduce 上跑的特别慢,这个实在让人接受不了。 于是中间又经过了几个引擎的进化,Spark 和 SparkSQL 应运而生。Spark 不仅拥有新一代的计算引擎 (跑的更快),而且内置了很多的方法供你操作数据,我们编写起程序来现在变的更快更简单。假如我们有这么一个需求,统计一个文件中 a,b 这两个字母出现的单词有多少个。 可以像下面这样写:

from pyspark import SparkConf, SparkContext
conf = SparkConf().setMaster("local").setAppName("My App")
sc = SparkContext(conf=conf)
logFile = "/Users/sungaofei/Documents/spark/README.md"
logData = sc.textFile(logFile).cache()

numAs = logData.filter(lambda s: 'a' in s).count()
numBs = logData.filter(lambda s: 'b' in s).count()

numAs 和 numBs 就是我们统计的结果。可以看到 spark 提供了 filter 这种过滤函数和 count 这种内置的统计数量函数。 我们不再像以前 MapReduce 一样要写那么多的逻辑。 同时 SparkSQL 也支持了我们把 SQL 翻译成代码的功能。

总结

恩,我只是简单介绍了 Haoop 和 Spark 的历史和做用。其实 Haoop 生态圈里还有一些其他的框架,像什么 Hbase,Hive on tze。但是我这个水平的就不了解那么多了。 这里只是简单的给大家有一个概念上的了解。起码知道大数据到底是怎么回事。大数据看起来高不可攀,但是其实懂了原理以后,我们也可以做一些事情。 下一篇我们演示一下如何搭建一个 spark 的学习环境以及一些 spark 的基础介绍。

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 5 条回复 时间 点赞

flask 刚开始的路过。。

太太太太高产了。。。点赞

讲得挺清楚的,支持。

棒棒 的

孙高飞 专栏文章:大数据测试场景科普 -- 流计算篇 (上) 中提及了此贴 12月17日 20:46
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册