大数据的基本概念
什么是大数据
要说什么是大数据我想大家多少已经有所了解了,很多落地的案例已经深入到了我们的生活中。大数据具有数据量大、数据类型丰富复杂、数据增长速度快等特点,一切的数据分析必须建立在真实的数据集上才会有意义,而数据质量本身也是影响大数据分析结果的重要因素之一。
作为学习者,我们关心的应该是大数据能够解决什么样的问题,能够应用在哪些领域,应该学习哪些内容,侧重哪一方面。
简单来说,我们需要学习的就是一系列的大数据生态圈技术组件,以及贯穿整个数据分析流程的分析方法和思维,并且思路更加重要一些!只有明确了数据分析场景与流程,我们才能够确定需要整合哪些大数据组件来解决这一问题。
下面我们将一起推开这一领域的大门~
数据是如何采集的
大数据分析的第一步就是对数据的收集和管理,我们需要先来了解一下数据是如何产生的?又是被如何捕获的?那些看似杂乱的数据真的能被分析吗?
主动的数据产生与用户行为数据收集
主动产生的数据比较好理解,在我们使用互联网或者各种应用的过程中,通过填写提交表单就会产生数据。类似的,我们在线下环境中,比如银行开卡、纸质表格的填写,最终都会变成电子数据流入到系统中。通常,我们会将这一类行为归为用户注册,通常会是产生数据的起点。(当然,有些时候我们分析的数据也可能并不关心用户自身的信息。)除此之外,通过使用一些平台的功能,用户会上传和发布各种类型的数据,如文本类信息、音频、视频等,这都是数据产生和积累的方式。
对于用户行为数据更多的来自于应用埋点和捕获,因为用户使用应用必须通过鼠标点击或者手指触碰来和用户界面进行交互。以网页应用(网站)为例,对于鼠标的所有行为基本上都可以通过事件监听的方式来捕获,鼠标在某个区域停留的时间、是否进行点击,我们甚至可以根据用户的行为数据刻画出整个页面的热力图。
在不同的应用场景中,我们可以对行为类型、功能模块、用户信息等维度进一步的划分,做更加深入的分析。
结构化数据与非结构化数据
最常见的结构化数据就是存储在关系型数据库中的数据,如MySQL、Oracle等,这些数据都具备一个特点,就是十分规范。因为关系型数据库属于写时模式,也就是说不符合预先设定的数据类型和规范的数据不会通过校验,存不到数据库中。除数据库中的数据以外,那些能直接导入到数据库中的数据文件我们也可以把它们视为结构化的数据,如:CSV格式。这些数据通常需要具备统一的列分隔符、行分隔符,统一的日期格式等等。
对于非机构化的数据指的就是除结构化数据以外的另一大类数据,通常没有预期的数据机构,存储在非关系型数据库中,如:Redis、MongoDB,使用NoSQL来进行操作。也可能是非文本类型的数据,需要特别对应的手段来处理和分析。
大数据真的能预测吗
问起大数据到底能不能预测,倒不如来说一说大数据是如何预测的。如果结合人工智能领域来说的话就比较复杂了,就说比较简单的场景:用统计分析的方法进行辅助决策,或者用经典数据挖掘算法进行模型的训练。既然是预测,那就有可能准确,也有可能不准确,分析者需要做的就是合理的使用各种数据维度,结合相应的算法或统计分析方法,去训练或拟合出一个潜在的规律。这个过程就好比,给了我们三个点(1,1)、(2,2)、(3,3),我们可以大概猜到它的函数式有可能为y=x一样。当然,实际的分析过程要比这复杂的多得多,毕竟有很多函数式都可以满足这三个点,但到底哪一个是我想要的规律呢?这就需要理论知识与行业经验并重,不断的打磨和优化才能够得到一个可靠的模型。
但是我们可以明确的一点是,大数据的预测也好、推荐也好,都是基于算法的,是数学的,也是科学的,但并不会百分之百的准确。
什么是大数据开发
了解了什么是大数据,接下来介绍一下大数据开发这一岗位,先直接上岗位描述(JD:Job Description)给大家感受一下。然后来说明一下大数据开发工程师的主要工作,最后再来总结一下需要掌握的技能。
京东大数据开发工程师JD
小米大数据开发工程师JD
滴滴大数据开发工程师JD
主要工作
从上面的岗位描述中我们可以发现大数据开发工程师一般会与业务进行对接,要么是基于某一个场景进行有针对性的数据处理,要么是打造一个大数据产品。在这里我们也需要纠正一个小小的概念,可能有些小伙伴认为有大数据岗位需求的公司一定是一个自身具备大量数据、有着大量用户积淀的公司,其实不然。
除了分析公司自身业务数据以外,同样可以打造一款通用的大数据产品,大家可以参考我的另一篇文章:如何用开源组件“攒”出一个大数据建模平台。所以大数据的岗位虽然不像普通的开发工程师那么多,但是需求依然存在。
如果是分析公司自身的业务数据,一般会更偏重于使用大数据组件和算法库,构建出一个可行的数据分析方案。大家可以看出,现在完全不涉及算法的大数据岗位已经比较少了。这里的算法指的并不是数据结构,而是指机器学习库,与数据挖掘相关的算法,至少要知道如何控制算法的输入与输出,算法能够解决的问题,可能不会涉及到亲自建模,在大数据分析的小节中会详细介绍。
如果是开发一个大数据产品,比如建模平台,或者是致力于解决数据采集、数据可视化的解决方案。那么这比较适合从开发工程师转行大数据开发工程师的小伙伴,相当于在开发一个应用的基础上又增加了底层的大数据组件。这就要求我们既需要懂得原始的服务端框架的那一套,又能够驾驭大数据开发API。
掌握技能
从事大数据开发需要掌握的技能可以概括为以下几个方面:
- 操作系统:Linux(基本操作、软件维护、权限管理、定时任务、简单Shell等)
- 编程语言:Java(主要)、Scala、Python等
- 数据采集组件及中间件:Flume、Sqoop、Kafka、Logstash、Splunk等
- 大数据集群核心组件:Hadoop、Hive、Impala、HBase、Spark(Core、SQL、Streaming、MLlib)、Flink、Zookeeper等
- 素养要求:计算机或大数据相关专业
什么是大数据分析
说到数据分析师,这不是本文的重点,因为门槛相对较高,另一方面更偏数学、统计学方向,更多的是与数据、算法打交道,编程的产物通常不是应用,而是一个算法模型。我们还是先来看一看相关的JD:
小红书数据分析师JD
京东数据分析师JD
新浪微博数据分析师
主要工作
如果说大数据开发的岗位需求是一条一条的话。。。那么数据分析师的岗位需求大概率是一篇一篇的。。。
从上面的要求的中可以看到,每一个岗位都讲业务场景介绍的很详细,毕竟,数据分析师的主要工作之一是建立算法模型,这是垂直领域的深耕。通常我们无法直接使用那些已经存在的算法,必须要进行评估、优化、或是组合使用。除此之外,你还必须拥有这一领域的业务经验,才能够很好的胜任。
掌握技能
算法工程师需要掌握的技能可以概括为以下几个方面:
- 编程语言:Python、R、SQL等
- 建模工具:MATLAB、Mathematica等
- 熟悉机器学习库及数据挖掘经典算法
- 数学、统计学、计算机相关专业,对数据敏感
应如何学习大数据
上面介绍了和大数据相关的两个主要工作岗位,其实与大数据相关的岗位还有很多,真正归纳起来,ETL工程师也可以说擦边,因为随着数据量的不断增大,无论是银行内部还是大数据服务公司都在从传统ETL工具向大数据集群进行过渡。
涉及到了这么多的技术点,如何学习才更加高效呢?首先好入门的自然是大数据开发,对于Linux的操作系统和编程语言的部分没什么过多说明的,不要觉得有些东西没用就跳过,有些时候编程思想和解决问题的方法同样很重要,课本上有的一定要扎实。对于和大数据相关的组件,看上去十分的繁杂,很多小伙伴可能都是钻研于每个组件的用法、算子、函数、API,这当然没有错,但是同时一定不要忘记埋在其中的主线,那就是:完整的数据分析流程。在学习的过程中一定要了解各组件的特点、区别和应用的数据场景。
离线计算
在离线计算场景下,使用的都是历史数据,也就是不会再发生改变的数据。在数据源确定以后,这些数据不会再增加、也不会再更新,比较适合对实时性要求不高的场景。大多数情况下是周期性的计算某一个指标或执行一个Job,运算耗时基本上可以控制在分钟级。
数据源:数据文件、数据库中的数据等
数据采集:Sqoop、HDFS数据上传、Hive数据导入等
数据存储:HDFS
数据分析:MapReduce、Hive QL
计算结果:Hive结果表(HiveJDBC查询)、导出至关系型数据库
实时计算
实时计算所面对的数据是不断的流入的,要能够使用合适的组件处理实时流入的数据。有些时候单位时间内的数据流入会比较多,消费的比较慢。有些时候单位时间内的数据流入会比较少,消费的会比较快。所以在采集数据时一方面要保证数据不丢失,同时还需要有中间件来管理好数据。在进行实时计算时可以使用微批次的方式也可以使用其他方式,同时要处理好计算结果合并的问题,实时展示最新的结果。
- 数据源:日志文件增量监听等
- 数据采集:Flume
- 中间件:Kafka
- 数据分析:Spark-Streaming,Flink等
- 计算结果:HBase
以上只是简单的列举了一些实现不同场景数据流程的组件整合方案,诣在告诉大家一定要善于发现和总结不同组件的特点,把合适的组件放在合适的位置,这也是面试官经常喜欢问的场景题目。
其实每个组件的使用方法和调用API并没有很复杂,重点还是在于流程化、一体化、把组件之间连接起来,不断的渗透和强化数据分析和处理的思路,能够把一个需求直接翻译成数据分析方案,这才是学习的重点。