初识大数据
初识大数据
大数据已经火了有两年了,第一篇相关的博客,实在是有些懒散,虽然工作中没有用到,但这是一个趋势,不仅仅是搞IT的,各行各业在未来都会与大数据有关系。
去年已经读过《大数据时代》这本书,印象中比较深的还有几点:
- 大数据时代人们不一定点找到因果关系,大数据会挖掘出事物之间的相关关系。这一点是思维方法的一个根本的转变,在一些情况下,只需要知道相关关系就能够创造价值。
- 不是抽样调查,而是全部数据。抽样调查要求对样本精心挑选,容错性差。而大数据时代,可以对全部能获得到的数据进行分析,允许存在一些错误的数据。抽样在一定程度上并不可靠,英国脱欧是一个“绝大多数”人没想到的情况。当数据达到一定规模的时候,个别的“错误”数据并不会影响最后的结果。
- 并不是精确的结构化的数据。绝大多数的数据为非结构化的,但是也能够通过一定的分析手段从中提取出重要的信息。
- 此外,罗胖子的一个观点,阿里,腾讯,并不是一个简单的购物社交的公司,从将来来看,是数据公司。数据将是他们未来的核心竞争力。而且现在阿里已经在使用它们的数据向外提供服务了,只不过目前应用不多,例如可以提供某个关键词的检索量。
说大数据,立刻会联想的关键词Hadoop、MapReduce、HDFS、Hive、Spark,此外一些相关的软件中间件技术消息队列Kafka、ActiveMQ,关系数据库Radis,爬虫Scrapy,目前流行的docker,Google开源的Tensorflow等。新框架新技术实在太快,可惜工作中很少用到,对此类技术框架以后在这个云计算&大数据的分类中记录下自己的所想所得。
Hadoop家族概况
关于云,想起一句项目管理中的话“项目管理中最重要的是组织论”,云本质上也是一种组织的方法论。 直接引用官网上的原文(作为一个程序员,阅读英文资料的能力越来越重要了):
貌似家族还在扩充,hadoop是一个framework,基本的模块是mapreduce,hdfs,yarn。写此文的时,hadoop已经更新到了3.0版本。每个版本差别很大,而且对应的组建也会有要求对应版本。hadoop的思想是从Google的三篇论文来的,《The Google File System》、《Google-MapReduce》、《Google-Bigtable》下载地址如下:
其中Google File System对应HDFS,Google-MapReduce对应hadoop的MapReduce,Google-Bigtable对应的是另外一个很火的HBase,一个Nosql的数据库。至于yarn是一个资源管理的项目,貌似是2.6之后才加入的。可以说基本思想是Google奠定的,但是Google没有全部开源。而是apache形成了整个的hadoop生态。
用简单几句话说明下自己的理解,当然会不全面,甚至有偏差,但是可以快速的帮助理解。首先,共同的一点,基本上都是可扩展的。 MapReduce:计算框架。使用map和reduce两个操作抽象分布式数据计算, HDFS:文件存储系统,相当于window上的fat32或NTFS。 Yarn:资源管理,任务调度。HDFS+Yarn组成了“分布式操作系统”的基础。 HBase:数据库,“versioned, non-relational database ”,带有“版本”的,非关系型的数据库 Hive:不是真正的数据库,可以理解为为了更方便的使用MapReduce而封装的类sql解释器,简单说,给不用或不会编程用的。 Pig:与Hive类似,做数据分析用的,更接近编程语言,给初步的开发分析人员用的。 Spark:与MapReduce类似,计算框架。 Tez:DAG(有向无环图)计算框架。 Zookeeper:提供协调管理服务,例如保证只有一个master(选举算法),记录一些状态。 Avro: 管理配置hadoop的工具。 Ambari:序列化服务。 Cassandra:数据库,貌似有赶超HBase之趋势 Mahout:算法库。 Chukwa:采集数据用。
MapReduce
“MapReduce is a programming model and an associated implementation for processing and generating large datasets.Users specifya map function that processes a key/value pair to generate a set of intermediate key/value pairs,and a reduce function that merges all intermediate values associated with the same intermediate key.Many real world tasks are expressible in this model,as shown in the paper.”
- 使用商用的普通PC,支持大规模的聚集(上千)。
- 封装了并行处理、容错、负载均衡、数据分布式存储。 3.分布式时候,网络带宽为一个瓶颈,把计算与待处理的数据放在同一个pc上能够减少网络的带宽使用,提高效率。So,MapReduce的直接性能影响是磁盘IO与网络带宽,cpu和内存影响相对较小。 参考Google的论文 《MapReduce_Simplified_Data_Processing_on_Large_Clusters》
Hive
“hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。 其优点是学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析。”可以与Radis与H2对比,H2可以把Radis中的关键字段拿出来,组成一张表,然后进行关系数据库的sql操作。hive也是通过一层封装,文件到表映射方法也提供了,然后提供一些额外的方便简单的统计功能。
为什么Had0op不直接提供类似的功能?与Radis的理念感觉一样,只实现部分擅长的功能,其他的如果需要再去加上一层。同样的,操作系统的内核肯定不会提供播放视频的功能,只是一些最最基础高效的系统调用。
hive与Hbase区别?简单点来说,hive只是一个sql解释层,没有真正的存储数据。而hbase是一个真正意义上的NoSql数据库。 Hbase主要处理的是OLTP,从CAP定理分析,Hbase满足了C+P,P是必须满足的,分区容错性如果满足不了还搞啥分布式。 Hbase与Mysql比,应该说Nosql数据库与RDBMS相比,Nosql更多的是处理非结构化的数据的。
Kafka
“Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据。”——一个新的消息队列“系统”,特点高吞吐量即使是非常普通的硬件Kafka也可以支持每秒数百万的消息。解决大数据采集时消息快速持久化的问题。
ElasticSearch
ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。解决大数据的时候查找搜索的问题,特点么“Elastic”与Spark中RDD的“Resilient”意思一样“弹性”,规模能够方便的扩充和缩小,其中“缩小”包括节点意外挂掉的时候处理的容错能力。
Spark
加州大学博士的论文上所述,是一个“大型集群上的快速和通用数据处理架构”,“快速”与“通用”是他的最显著特点。以前的数据处理很多是针对特定的场景的,而spark能够应用的场景更加多一些。其实这两个特点是因为它所应用的数据模型RDD。这个RDD特性自己目前理解,用多个对数据集的操作抽象计算任务、闭包(有数据和操作,但是不是立即执行)、用cpu(重复计算)换取一定流量(中间数据的生成并在HDFS上的拷贝)。
Tensorflow
一个Google开源的系统,类似Android。从自己的角度看,就是一个深度学习算法的Python库,当然不只是用Python实现的,要求效率的部分是用C++实现的。
Docker
Docker是虚拟化相关的技术,云部署的时候可能会用到,暂且算个吧。看了很多文章,最多提到的比喻就是标准集装箱了。docker最重要的解决的问题就是部署运维的问题。先看没有集装箱之前,需要很多搬运工人从轮船上一件一件卸载货物,不仅仅消耗人力,更重要的是浪费时间,而很多货轮都是贷款买的,一个小时的成本可能上百万。so,有人发明了集装箱,一个大的盒子,卸货时直接用机械整箱下货,放到预先准备的场地,大大提到了效率。
有几个关键点,首先集装箱是“标准的”,这样在各个码头才有对应的机械与场地,相应的,docker中对应的是一个标准的容器,从外部来看,容器是标准的,当然容器内部也有一些标准的,如果从应用部署的角度看,容器内部是定制过的。标准的好处就是移植性好,当然目前局限在linux64位能够安装docker的机器上。
还有个镜像的概念,从原理上,与操作系统的镜像是一个概念,但是里面的内容有很多不同。几个简单的docker镜像可以只有应用程序,然后制定一个基础操作系统镜像。当然,这个“操作系统镜像”也与安装操作系统时候的不一样,会进行一些裁剪,只有一些必须的安装的库。
与操作系统的镜像相比,这个docker镜像也是只读的,不能随便修改的,可以说是静态的,通过镜像可以生成一个容器,容器是动态的,运行时的,而且——非常快,搞个容器跟搞个稍微大些的对象差不多。