中企动力 > 商学院 > 大数据计算
  • ?

    大数据之MapReduce学习,一位十年资深架构师的自述!

    燕丑

    展开

    MapReduce是面向大数据并行处理的计算模型、框架和平台,它隐含了以下三层含义:

    1)MapReduce是一个基于集群的高性能并行计算平台(Cluster Infrastructure)。它允许用市场上普通的商用服务器构成一个包含数十、数百至数千个节点的分布和并行计算集群。

    2)MapReduce是一个并行计算与运行软件框架(Software Framework)。它提供了一个庞大但设计精良的并行计算软件框架,能自动完成计算任务的并行化处理,自动划分计算数据和计算任务,在集群节点上自动分配和执行任务以及收集计算结果,将数据分布存储、数据通信、容错处理等并行计算涉及到的很多系统底层的复杂细节交由系统负责处理,大大减少了软件开发人员的负担。

    3)MapReduce是一个并行程序设计模型与方法(Programming Model & Methodology)。它借助于函数式程序设计语言Lisp的设计思想,提供了一种简便的并行程序设计方法,用Map和Reduce两个函数编程实现基本的并行计算任务,提供了抽象的操作和并行编程接口,以简单方便地完成大规模数据的编程和计算处理[1

    大数据、hadoop、Python学习资料分享群 596471005 不管你是小白还是大牛,小编我都挺欢迎,今天的源码已经上传到群文件,不定期分享干货,包括我自己整理的一份最新的适合2018年学习的大数据开发和零基础入门教程,欢迎初学和进阶中的小伙伴。也可以关注我。

    MapReduce: 计算模型 ----->解决大数据计算(处理)

    一、什么是大数据?大数据的核心问题

    举例:(1)商品推荐 (问题1) 大量的历史订单如何存储? (问题2)大量的历史订单如何计算?

    (2)天气预报 (问题1) 大量的天气数据如何存储? (问题2)大量的天气数据如何计算?

    大数据的核心:(1)数据的存储 ----->HDFS

    (2)数据的计算 -----> 计算模型: MapReduce

    二、什么是MapReduce?

    1、根据Google一篇论文:MapReduce(Hadoop实现了这种计算模型)

    2、问题来源:PageRank(网页排名: 排名的先后)

    3、MapReduce思想:先拆分 再合并

    4、举例:更简单一点例子

    三、Demo:WordCount程序: 单词计数

    四、MapReduce的数据处理流程(编程模型)

    结合WordCount例子数据处理流程 ---->非常重要

    下一步:动手开发我们自己的MapReduce程序

    五、????:老师大数据需要什么基础

    1、基础:Java SE、Linux基础

    2、Hadoop

    3、Spark

  • ?

    人人都在说的大数据到底是什么?(技术层)

    盼曼

    展开

    前沿技术普及系列·写在前面

    不知道大家有没有和象牙妹儿一样的感觉,便是最近1年很多AI产品铺天盖地的来到了我们的生活,比如某些家的智能陪伴音响、翻译棒、智能机器人、AR拍照手机等等。

    这里面背后的前沿技术大数据、云计算、区块链、物联网、 5G、数字化…前几年甚至到现在听着还很遥远,但却已有不少在冲击着商业的世界,渗透进我们的生活!

    如何拨开层层浓雾,抵达未来的彼岸?如何把握技术的钥匙,启开未来商业世界的大门!

    大象互联网圈发起主办的第二届中国【郑州】开发者大会不但关注技术·商业的融合,也关注着前沿技术的分享。

    因此,从今天起,大象互联网圈公众号将目光聚焦在大数据、云计算、物联网IOT、人工智能AI、区块链、VR/AR等板块,一一从概念层、目前行业发展状况、企业实际应用层、技术层、岗位前景等为大家带来干货的普及,快来和象牙儿妹一块围观吧!

    上一篇:人人都在说的大数据到底是什么?(概念层)

    本文由“壹伴编辑器”提供技术支持

    提到大数据技术,最基础和核心的仍是大数据的分析和计算。在2017年,大数据分析和计算技术仍旧在飞速的发展,无论老势力Hadoop还是当红小生Spark,亦或是人工智能,都在继续自己的发展和迭代。

    目前绝大部分传统数据计算和数据分析服务均是基于批量数据处理模型:使用ETL系统或OLTP系统进行构造数据存储,在线的数据服务通过构造SQL语言访问上述数据存储并取得分析结果。这套数据处理的方法伴随着关系型数据库在工业界的演进而被广泛采用。

    本文将分别讨论大数据技术涉及到的技术框架、平台以及未来的发展趋势。

    本文由“壹伴编辑器”提供技术支持

    1.批处理框架

    传统的批量数据处理模型通常基于如下处理模型:

    1.使用ETL系统或者OLTP系统构造原始的数据存储,以提供后续的数据服务进行数据分析和数据计算。用户装载数据,系统根据自己的存储和计算情况,对于装载的数据进行索引构建等一些列查询优化工作。

    因此,对于批量计算,数据一定需要加载到计算机系统,后续计算系统才在数据加载完成后方能进行计算。

    2.用户或系统主动发起一个计算作用并向上述数据系统进行请求。此时计算系统开始调度(启动)计算节点进行大量数据计算,该过程的计算量可能巨大,耗时长达数分钟乃至数小时。

    同时,由于数据累计的不可及时性,上述计算过程的数据一定是历史数据,无法保证数据的实时性。

    3.计算结果返回,计算作业完成后将数据以结果集形式返回用户,或者可能由于计算结果数量巨大保存着数据计算系统中,用户进行再次数据集成到其他系统。一旦数据结果巨大,整体的数据集成过程漫长,耗时可能长达数分钟乃至数小时。

    典型代表:Hadoop

    Hadoop是Apache的一个开源项目,是可以提供开源、可靠、可扩展的分布式计算工具。它主要包括HDFS和MapReduce两个组件,分别用于解决大数据的存储和计算。

    HDFS是独立的分布式文件系统,为MapReduce计算框架提供存储服务,具有较高的容错性和高可用性,基于块存储以流数据模式进行访问,数据节点之间项目备份。默认存储块大小为64M,用户也可以自定义大小。

    HDFS是基于主从结构的分布式文件系统,结构上包括NameNode目录管理、DataNode的数据存储和Client的访问客户端3部分。

    NameNode主要负责系统的命名空间、集群的配置管理以及存储块的复制;DataNode是分布式文件系统存储的基本单元;Client为分布式文件系统的应用程序。

    对于数据存储,HDFS采用的是多副本的方式来存储数据,即Client将数据首先通过NameNode获取数据将要存储在哪些DataNode上,之后这些存储到最新数据的DataNode将变更数据以同步或异步方式同步到其他DataNode上。

    在Hadoop3.0之后,采用Erasure Coding可以大大的降低数据存储空间的占用。对于冷数据,可以采用EC来保存,这样才能降低存储数据的花销,而需要时,还可以通过CPU计算来读取这些数。

    MapReduce是一种分布式计算框架,适用于离线大数据计算。采用函数式编程模式,利用Map和Reduce函数来实现复杂的并行计算,主要功能是对一个任务进行分解,以及对结果进行综合汇总。

    具体来说,MapReduce是将那些没有经过处理的海量数据进行数据分片,即分解成多个小数据集;每个Map并行地处理每一个数据集中的数据,然后将结果存储为,并把key值相同的数据进行归并发送到Reduce处理。

    本文由“壹伴编辑器”提供技术支持

    2.流计算框架

    不同于批量计算模型,流式计算更加强调计算数据流和低时延,流式计算数据处理模型如下:

    1.使用实时集成工具,将数据实时变化传输到流式数据存储(即消息队列,如RabbitMQ);此时数据的传输编程实时化,将长时间累积大量的数据平摊到每个时间点不停地小批量实时传输,因此数据集成的时延得以保证。

    2.数据计算环节在流式和批量处理模型差距更大,由于数据集成从累计变成实时,不同于批量计算等待数据集成全部就绪后才启动计算作业,流式计算作业是一种常驻计算服务,一旦启动将一直处于等待事件触发的状态,一旦小批量数据进入流式数据存储,流计算立刻计算并迅速得到结果。

    3.不同于批量计算结果数据需要等待数据计算结果完成后,批量将数据传输到在线系统;流式计算作业在每次小批量数据计算后可以立刻将数据写入在线系统,无需等待整个数据的计算结果,可以立刻将数据结果投递到在线系统,进一步做到实时计算结果的实时化展现。

    典型代表:Spark

    Spark是一个快速且通用的集群计算平台。它包含Spark Core、Spark SQL、Spark Streaming、MLlib以及Graphx组件。

    Spark SQL是处理结构化数据的库,它支持通过SQL查询数据。Spark Streming是实时数据流处理组件。MLlib是一个包含通用机器学习的包。GraphX是处理图的库,并进行图的并行计算一样。

    Spark提出了弹性分布式数据集的概念(Resilient Distributed Dataset),简称RDD,每个RDD都被分为多个分区,这些分区运行在集群的不同节点上。一般数据操作分为3个步骤:创建RDD、转换已有的RDD以及调用RDD操作进行求值。

    在Spark中,计算建模为有向无环图(DAG),其中每个顶点表示弹性分布式数据集(RDD),每个边表示RDD的操作。

    RDD是划分为各(内存中或者交换到磁盘上)分区的对象集合。在DAG上,从顶点A到顶点B的边缘E意味着RDD B是RDD A上执行操作E的结果。有两种操作:转换和动作。

    转换(例如;映射、过滤器、连接)对RDD执行操作并产生新的RDD。

    本文由“壹伴编辑器”提供技术支持

    3.交互式分析框架

    在解决了大数据的可靠存储和高效计算后,如何为数据分析人员提供便利日益受到关注,而最便利的分析方式莫过于交互式查询。

    这几年交互式分析技术发展迅速,目前这一领域知名的平台有十余个,包括Google开发的Dremel和PowerDrill,Facebook开发的Presto,Hadoop服务商Cloudera和HortonWorks分别开发的Impala和Stinger,以及Apache项目Hive、Drill、Tajo、Kylin、MRQL等。

    一些批处理和流计算平台如Spark和Flink也分别内置了交互式分析框架。由于SQL已被业界广泛接受,目前的交互式分析框架都支持用类似SQL的语言进行查询。早期的交互式分析平台建立在Hadoop的基础上,被称作SQL-on-Hadoop。

    后来的分析平台改用Spark、Storm等引擎,不过SQL-on-Hadoop的称呼还是沿用了下来。SQL-on-Hadoop也指为分布式数据存储提供SQL查询功能。

    典型代表:Hive

    ApacheHive是最早出现的架构在Hadoop基础之上的大规模数据仓库,由Facebook设计并开源。Hive的基本思想是,通过定义模式信息,把HDFS中的文件组织成类似传统数据库的存储系统。

    Hive保持着Hadoop所提供的可扩展性和灵活性。Hive支持熟悉的关系数据库概念,比如表、列和分区,包含对非结构化数据一定程度的SQL支持。它支持所有主要的原语类型(如整数、浮点数、字符串)和复杂类型(如字典、列表、结构)。

    它还支持使用类似SQL的声明性语言HiveQueryLanguage(HiveQL)表达的查询,任何熟悉SQL的人都很容易理解它。HiveQL被编译为MapReduce过程执行。下图说明如何通过MapReduce实现JOIN和GROUPBY。

    部分HiveQL操作的实现方式

    Hive与传统关系数据库对比如下:

    Hive的主要弱点是由于建立在MapReduce的基础上,性能受到限制。很多交互式分析平台基于对Hive的改进和扩展,包括Stinger、Presto、Kylin等。其中Kylin是中国团队提交到Apache上的项目,其与众不同的地方是提供多维分析(OLAP)能力。

    Kylin对多维分析可能用到的度量进行预计算,供查询时直接访问,由此提供快速查询和高并发能力。Kylin在eBay、百度、京东、网易、美团均有应用。

    本文由“壹伴编辑器”提供技术支持

    5.其他类型的框架

    除了上面介绍的几种类型的框架外,还有一些目前还不太热门但具有重要潜力的框架类型。图计算是DAG之外的另一种迭代式计算模型,它以图论为基础对现实世界建模和计算,擅长表达数据之间的关联性,适用于PageRank计算、社交网络分析、推荐系统及机器学习。这一类框架有GooglePregel、ApacheGiraph、ApacheHama、PowerGraph、,其中PowerGraph是这一领域目前最杰出的代表。很多图数据库也内置图计算框架。

    另一类是增量计算框架,探讨如何只对部分新增数据进行计算来极大提升计算过程的效率,可应用到数据增量或周期性更新的场合。这一类框架包括GooglePercolator、MicrosoftKineograph、阿里Galaxy等。

    另外还有像

    ApacheIgnite、ApacheGeode(GemFire的开源版本)这样的高性能事务处理框架。

    本文由“壹伴编辑器”提供技术支持

    6.总结与展望

    从Hadoop横空出世到现在10余年的时间中,大数据分布式计算技术得到了迅猛发展。不过由于历史尚短,这方面的技术远未成熟。各种框架都还在不断改进,并相互竞争。

    性能优化毫无疑问是大数据计算框架改进的重点方向之一。而性能的提高很大程度上取决于内存的有效利用。这包括前面提到的内存计算,现已在各种类型的框架中广泛采用。

    拥抱机器学习和人工智能也是大数据计算的潮流之一。Spark和Flink分别推出机器学习库SparkML和FlinkML。更多的平台在第三方大数据计算框架上提供机器学习,如Mahout、Oryx及一干Apache孵化项目SystemML、HiveMall、PredictionIO、SAMOA、MADLib。

    在同一平台上支持多种框架也是发展趋势之一,尤其对于那些开发实力较为雄厚的社区。

    Spark以批处理模型为核心,实现了交互式分析框架SparkSQL、流计算框架SparkStreaming(及正在实现的StructuredStreaming)、图计算框架GraphX、机器学习库SparkML。

    本文由“壹伴编辑器”提供技术支持

    7.学习资料

    最后介绍一下大数据计算方面的学习资料。

    论坛

    首推知乎、Quora、StackOverflow,运气好的话开发者亲自给你解答。其他值得关注的网站或论坛包括炼数成金、人大经济论坛、CSDN、博客园、云栖社区、360大数据、推酷、伯乐在线、小象学院等。

    微信订阅号

    InfoQ是最权威的,其他还有THU数据派、大数据杂谈、CSDN大数据、数据猿、Hadoop技术博文等,各人根据偏好取舍。

    官方网站文档

    若要进行系统的学习,则首先应参考官方网站文档。不少大数据平台的官方文档内容都比较详实,胜过多数教材。

    书籍

    国外O\'Reilly、Manning两家出版社在大数据领域出版了不少优秀书籍,特别是Manning的InAction系列和O\'Reilly的DefinitiveGuide系列。

    本篇关于大数据的技术层面分析就介绍到这,下一篇我们将对大数据的最终价值体现——大数据实践进行分析介绍。

    END

    第二届中国【郑州】开发者大会

    线上报名通道全面开放

    本次大会将开设从数字化到大数据落地专场,现已开放报名通道,门票分为49.9普通票和VIP票两种,其中VIP票权益非常丰富,票价为199元且仅限200张,下面是两种票的权益对比:

  • ?

    【独家】一文读懂大数据计算框架与平台

    丹烟

    展开

    1.前言

    计算机的基本工作就是处理数据,包括磁盘文件中的数据,通过网络传输的数据流或数据包,数据库中的结构化数据等。随着互联网、物联网等技术得到越来越广泛的应用,数据规模不断增加,TB、PB量级成为常态,对数据的处理已无法由单台计算机完成,而只能由多台机器共同承担计算任务。而在分布式环境中进行大数据处理,除了与存储系统打交道外,还涉及计算任务的分工,计算负荷的分配,计算机之间的数据迁移等工作,并且要考虑计算机或网络发生故障时的数据安全,情况要复杂得多。

    举一个简单的例子,假设我们要从销售记录中统计各种商品销售额。在单机环境中,我们只需把销售记录扫描一遍,对各商品的销售额进行累加即可。如果销售记录存放在关系数据库中,则更省事,执行一个SQL语句就可以了。现在假定销售记录实在太多,需要设计出由多台计算机来统计销售额的方案。为保证计算的正确、可靠、高效及方便,这个方案需要考虑下列问题:

    如何为每台机器分配任务,是先按商品种类对销售记录分组,不同机器处理不同商品种类的销售记录,还是随机向各台机器分发一部分销售记录进行统计,最后把各台机器的统计结果按商品种类合并?上述两种方式都涉及数据的排序问题,应选择哪种排序算法?应该在哪台机器上执行排序过程?如何定义每台机器处理的数据从哪里来,处理结果到哪里去?数据是主动发送,还是接收方申请时才发送?如果是主动发送,接收方处理不过来怎么办?如果是申请时才发送,那发送方应该保存数据多久?会不会任务分配不均,有的机器很快就处理完了,有的机器一直忙着?甚至,闲着的机器需要等忙着的机器处理完后才能开始执行?如果增加一台机器,它能不能减轻其他机器的负荷,从而缩短任务执行时间?如果一台机器挂了,它没有完成的任务该交给谁?会不会遗漏统计或重复统计?统计过程中,机器之间如何协调,是否需要专门的一台机器指挥调度其他机器?如果这台机器挂了呢?(可选)如果销售记录在源源不断地增加,统计还没执行完新记录又来了,如何保证统计结果的准确性?能不能保证结果是实时更新的?再次统计时能不能避免大量重复计算?(可选)能不能让用户执行一句SQL就可以得到结果?

    上述问题中,除了第1个外,其余的都与具体任务无关,在其他分布式计算的场合也会遇到,而且解决起来都相当棘手。即使第1个问题中的分组、统计,在很多数据处理场合也会涉及,只是具体方式不同。如果能把这些问题的解决方案封装到一个计算框架中,则可大大简化这类应用程序的开发。

    2004年前后,Google先后发表三篇论文分别介绍分布式文件系统GFS、并行计算模型MapReduce、非关系数据存储系统BigTable,第一次提出了针对大数据分布式处理的可重用方案。在Google论文的启发下,Yahoo的工程师Doug Cutting和Mike Cafarella开发了Hadoop。在借鉴和改进Hadoop的基础上,又先后诞生了数十种应用于分布式环境的大数据计算框架。本文在参考业界惯例的基础上,对这些框架按下列标准分类:

    如果不涉及上面提出的第8、9两个问题,则属于批处理框架。批处理框架重点关心数据处理的吞吐量,又可分为非迭代式和迭代式两类,迭代式包括DAG(有向无环图)、图计算等模型。若针对第8个问题提出来应对方案,则分两种情况:如果重点关心处理的实时性,则属于流计算框架;如果侧重于避免重复计算,则属于增量计算框架。如果重点关注的是第9个问题,则属于交互式分析框架。

    本文下面分别讨论批处理、流计算、交互式分析三种类别的框架,然后简要介绍大数据计算框架的一些发展趋势。文章最后介绍这一领域的学习资料。

    图1.大数据计算框架全景图2.批处理框架

    2.1.Hadoop

    Hadoop最初主要包含分布式文件系统HDFS和计算框架MapReduce两部分,是从Nutch中独立出来的项目。在2.0版本中,又把资源管理和任务调度功能从MapReduce中剥离形成YARN,使其他框架也可以像MapReduce那样运行在Hadoop之上。与之前的分布式计算框架相比,Hadoop隐藏了很多繁琐的细节,如容错、负载均衡等,更便于使用。

    Hadoop也具有很强的横向扩展能力,可以很容易地把新计算机接入到集群中参与计算。在开源社区的支持下,Hadoop不断发展完善,并集成了众多优秀的产品如非关系数据库HBase、数据仓库Hive、数据处理工具Sqoop、机器学习算法库Mahout、一致性服务软件ZooKeeper、管理工具Ambari等,形成了相对完整的生态圈和分布式计算事实上的标准。

    图2.Hadoop生态圈(删减版)

    MapReduce可以理解为把一堆杂乱无章的数据按照某种特征归并起来,然后处理并得到最后的结果。基本处理步骤如下:

    把输入文件按照一定的标准分片,每个分片对应一个map任务。一般情况下,MapReduce和HDFS运行在同一组计算机上,也就是说,每台计算机同时承担存储和计算任务,因此分片通常不涉及计算机之间的数据复制。按照一定的规则把分片中的内容解析成键值对。通常选择一种预定义的规则即可。

    执行map任务,处理每个键值对,输出零个或多个键值对。

    MapReduce获取应用程序定义的分组方式,并按分组对map任务输出的键值对排序。默认每个键名一组。

    待所有节点都执行完上述步骤后,MapReduce启动Reduce任务。每个分组对应一个Reduce任务。

    执行reduce任务的进程通过网络获取指定组的所有键值对。

    把键名相同的值合并为列表。

    执行reduce任务,处理每个键对应的列表,输出结果。

    图3.MapReduce处理过程

    在上面的步骤中,应用程序主要负责设计map和reduce任务,其他工作均由框架负责。在定义map任务输出数据的方式时,键的选择至关重要,除了影响结果的正确性外,也决定数据如何分组、排序、传输,以及执行reduce任务的计算机如何分工。前面提到的商品销售统计的例子,可选择商品种类为键。MapReduce执行商品销售统计的过程大致如下:

    把销售记录分片,分配给多台机器。每条销售记录被解析成键值对,其中值为销售记录的内容,键可忽略。

    执行map任务,每条销售记录被转换为新的键值对,其中键为商品种类,值为该条记录中商品的销售额。

    MapReduce把map任务生成的数据按商品种类排序。

    待所有节点都完成排序后,MapReduce启动reduce任务。每个商品种类对应一个reduce任务。

    执行reduce任务的进程通过网络获取指定商品种类的各次销售额。

    MapReduce把同一种商品下的各次销售额合并到列表中。

    执行reduce任务,累加各次销售额,得到该种商品的总销售额。

    上面的过程还有优化的空间。在传输各种商品每次的销售额数据前,可先在map端对各种商品的销售额进行小计,由此可大大减少网络传输的负荷。MapReduce通过一个可选的combine任务支持该类型的优化。

    2.2.DAG模型

    现在假设我们的目标更进一步,希望知道销售得最好的前10种商品。我们可以分两个环节来计算:

    统计各种商品的销售额。通过MapReduce实现,这在前面已经讨论过。对商品种类按销售额排名。可以通过一个排序过程完成。假定商品种类非常多,需要通过多台计算机来加快计算速度的话,我们可以用另一个MapReduce过程来实现,其基本思路是把map和reduce分别当作小组赛和决赛,先计算各分片的前10名,汇总后再计算总排行榜的前10名。

    从上面的例子可以看出,通过多个MapReduce的组合,可以表达复杂的计算问题。不过,组合过程需要人工设计,比较麻烦。另外,每个阶段都需要所有的计算机同步,影响了执行效率。

    为克服上述问题,业界提出了DAG(有向无环图)计算模型,其核心思想是把任务在内部分解为若干存在先后顺序的子任务,由此可更灵活地表达各种复杂的依赖关系。Microsoft Dryad、Google FlumeJava、Apache Tez是最早出现的DAG模型。Dryad定义了串接、全连接、融合等若干简单的DAG模型,通过组合这些简单结构来描述复杂的任务,FlumeJava、Tez则通过组合若干MapReduce形成DAG任务。

    图4.MapReduce(左)与Tez(右)执行复杂任务时对比

    MapReduce的另一个不足之处是使用磁盘存储中间结果,严重影响了系统的性能,这在机器学习等需要迭代计算的场合更为明显。加州大学伯克利分校AMP实验室开发的Spark克服了上述问题。Spark对早期的DAG模型作了改进,提出了基于内存的分布式存储抽象模型RDD(Resilient Distributed Datasets,可恢复分布式数据集),把中间数据有选择地加载并驻留到内存中,减少磁盘IO开销。与Hadoop相比,Spark基于内存的运算要快100倍以上,基于磁盘的运算也要快10倍以上。

    图5.MapReduce与Spark中间结果保存方式对比

    Spark为RDD提供了丰富的操作方法,其中map、 filter、 flatMap、 sample、groupByKey、 reduceByKey、union、join、cogroup、mapValues、sort、partionBy用于执行数据转换,生成新的RDD,而count、collect、 reduce、lookup、save用于收集或输出计算结果。如前面统计商品销售额的例子,在Spark中只需要调用map和reduceByKey两个转换操作就可以实现,整个程序包括加载销售记录和保存统计结果在内也只需要寥寥几行代码,并且支持Java、Scala、Python、R等多种开发语言,比MapReduce编程要方便得多。下图说明reduceByKey的内部实现。

    图6.RDD reduceByKey内部实现

    RDD由于把数据存放在内存中而不是磁盘上,因此需要比Hadoop更多地考虑容错问题。分布式数据集的容错有两种方式:数据检查点和记录数据的更新。处理海量数据时,数据检查点操作成本很高,因此Spark默认选择记录更新的方式。不过如果更新粒度太细太多,记录更新成本也不低。因此,RDD只支持粗粒度转换,即只记录单个块上执行的单个操作,然后将创建RDD的一系列变换序列记录下来,类似于数据库中的日志。

    当RDD的部分分区数据丢失时,Spark根据之前记录的演变过程重新运算,恢复丢失的数据分区。Spark生态圈的另一项目Alluxio(原名Tachyon)也采用类似的思路,使数据写入速度比HDFS有数量级的提升。

    下面总结Spark对MapReduce的改进:

    MapReduce抽象层次低,需要手工编写代码完成;Spark基于RDD抽象,使数据处理逻辑的代码非常简短。MapReduce只提供了map和reduce两个操作,表达力欠缺;Spark提供了很多转换和动作,很多关系数据库中常见的操作如JOIN、GROUP BY已经在RDD中实现。MapReduce中,只有map和reduce两个阶段,复杂的计算需要大量的组合,并且由开发者自己定义组合方式;Spark中,RDD可以连续执行多个转换操作,如果这些操作对应的RDD分区不变的话,还可以放在同一个任务中执行。MapReduce处理逻辑隐藏在代码中,不直观;Spark代码不包含操作细节,逻辑更清晰。MapReduce中间结果放在HDFS中;Spark中间结果放在内存中,内存放不下时才写入本地磁盘而不是HDFS,这显著提高了性能,特别是在迭代式数据处理的场合。MapReduce中,reduce任务需要等待所有map任务完成后才可以开始;在Spark中,分区相同的转换构成流水线放到同一个任务中运行。3.流计算框架

    3.1.流计算概述

    在大数据时代,数据通常都是持续不断动态产生的。在很多场合,数据需要在非常短的时间内得到处理,并且还要考虑容错、拥塞控制等问题,避免数据遗漏或重复计算。流计算框架则是针对这一类问题的解决方案。流计算框架一般采用DAG(有向无环图)模型。图中的节点分为两类:一类是数据的输入节点,负责与外界交互而向系统提供数据;另一类是数据的计算节点,负责完成某种处理功能如过滤、累加、合并等。从外部系统不断传入的实时数据则流经这些节点,把它们串接起来。如果把数据流比作水的话,输入节点好比是喷头,源源不断地出水,计算节点则相当于水管的转接口。如下图所示。

    图7.流计算DAG模型示意图

    为提高并发性,每一个计算节点对应的数据处理功能被分配到多个任务(相同或不同计算机上的线程)。在设计DAG时,需要考虑如何把待处理的数据分发到下游计算节点对应的各个任务,这在实时计算中称为分组(Grouping)。最简单的方案是为每个任务复制一份,不过这样效率很低,更好的方式是每个任务处理数据的不同部分。随机分组能达到负载均衡的效果,应优先考虑。不过在执行累加、数据关联等操作时,需要保证同一属性的数据被固定分发到对应的任务,这时应采用定向分组。在某些情况下,还需要自定义分组方案。

    图8.流计算分组

    由于应用场合的广泛性,目前市面上已经有不少流计算平台,包括Google MillWheel、Twitter Heron和Apache项目Storm、Samza、S4、Flink、Apex、Gearpump。

    3.2.Storm及Trident

    在流计算框架中,目前人气最高,应用最广泛的要数Storm。这是由于Storm具有简单的编程模型,且支持Java、Ruby、Python等多种开发语言。Storm也具有良好的性能,在多节点集群上每秒可以处理上百万条消息。Storm在容错方面也设计得很优雅。下面介绍Storm确保消息可靠性的思路。

    在DAG模型中,确保消息可靠的难点在于,原始数据被当前的计算节点成功处理后,还不能被丢弃,因为它生成的数据仍然可能在后续的计算节点上处理失败,需要由该消...

  • ?

    什么样的数据才算大数据?——大数据的特性

    真石

    展开

    什么是大数据?大数据就是指在一定时间范围内无法使用传统数据库工具对其进行捕捉、管理、计算、分析和处理的数据集合,大数据有以下四个特性:海量的数据规模(Volumn),数据类型繁多(Variety),数据流转速度极快(Velocity)以及价值密度较低(Value),我们就说说这四大特性。

    海量的数据规模

    我们接触最多最敏感的数据那就是我们手机所购买的流量,最常见的数据计量单位为K、M和G,他们的关系为1G=1024M,1M=1024KB。也许你也听过TB,1TB=1024G,这个数据单位对我们来世已经相当庞大了,我们的笔记本最大的容量也就在1TB这个级别,但是在大数据眼里最小的数据也得10TB起,比TB级还大的数据计量单位还有吗?有,而且还很多,1PB=1024TB,1EB=1024PB,1ZB=1024EB,1YB=1024ZB......我们已经无法感知这么大的数据量了。截止到2011 年,互联网用户数已达到20 亿; RFID 标签在2005 年的保有量仅有13亿个,但是到2010 年这个数字超过了300 亿;2006 年资本市场的数据比2003 年增长了17.5倍;日前新浪微博上每天上传的微博数超过1 亿条;Facebook 每天处理10TB 的数据;世界气象中心积累了220TB 的Web 数据,9PB 其他类型数据……

    极快的数据流转

    数据具有一定的时效性,是不停的变化的,可以随时间数据量逐渐增大,也可在空间上不断移动变化的数据。如果我们采集到的数据不经过流转,最终会过期作废。客户的体验在分秒级别,海量的数据,带来的第一个问题就是大大延长了各类报表生成时间,我们能否在极端的时间内提取最有价值的信心呢?数据在1秒内得不到流转处理,就会给客户带来较差的使用体验,若我们的数据处理软件达不到“秒”处理,所带来的商业价值就会大打折扣。

    价值密度低

    尽管大数据的数据量巨大,但是有价值的信息极少,我们要通过分析才能将大数据从数据到价值的转变,这些工作量极其庞大,所以云计算是一个很好的解决途径。以监控视频为例,一小时的视频,在不间断的监控过程中,可能有用的数据仅仅只有一两秒。

    数据种类繁多

    数据的格式是多样化的,如文字、图片、视频、音频、地理位置信息等,也可以是不同的数据类别,也可以有不容的来源,如传感器、互联网。首先用户是一个复杂的个体,单一的行为数据是不足以描述用户的各种行为,多元化的信息采集处理就像拼图一样,逐渐勾勒出我们身体的骨架,增添上我们的血肉。我们在淘宝、京东购物时,总会在下面的推荐区推荐我们想要的东西,比如我们去频繁的搜索浏览某件商品,这是他们就会采集我们浏览的数据,从中挖去有价值的信息,推送给我们。所以说这样的模式给一种体验,那就是这些app越来越懂我们的爱好和需求。

    大数据未来会渗透在很多领域,大数据与云计算,机器学习与人工智能,物联网,区块链等。

  • ?

    带你认识当之无愧的大数据“大人物”

    颜香魔

    展开

    转载自百家号作者:Herbert今日行业一览

    今天继续带你解读大数据领域,“大人物”就是大数据综合服务龙头——中科曙光,通过对该公司的业务布局和发展情况,让你了解其龙头地位。中科曙光以高端计算机、存储及IT核心设备的研发、生产制造为基础,依托全自主知识产权的技术创新能力,对外提供云计算及大数据综合服务。之前文章介绍过了大数据的一些其他文章(可查看以往文章)。

    一、所属行业概况

    公司所属行业为新一代信息技术行业,是国家重点发展的战略新兴产业之一。同时,高端计算机等核心设备也是其他战略新兴产业的重要基础支撑,在建设创新型国家的总目标支撑下,本行业市场空间广阔、发展前景良好。

    1、突破核心技术

    我国信息产业与世界先进水平的差距正逐步缩小,但在部分核心技术上仍然受制于人,“十三五”国家科技创新发展规划对此进行了重点部署并寻求突破,“产、学、研、用”协同创新的局面业已形成。随着我国在IT最为核心的设计技术上获得突破,本行业的成长空间将得到大幅提升。

    2、迎接新技术革命

    信息产业的新技术革命正在进行,云计算、大数据和人工智能成为本行业的发展方向和前沿技术,发达国家在此领域的先发优势并不明显。其中云计算、大数据和人工智能等技术在我国得到快速发展,目前已进入全面应用阶段。同时,由于我国具有人口基数庞大、互联网普及程度不断提高、基础数据资源丰富等特点,为大数据技术的发展与应用提供了得天独厚的条件。

    3、实施国产化替代

    随着我国信息产业的发展,本地企业所能提供的产品已与国外企业基本相当,能够满足我国各行业的信息化需求,同时本地企业具备较强的本地服务能力等综合竞争优势,加之国家的信息安全考虑,本行业的国产化替代是必然趋势。

    4、推动新兴产业快速发展

    人工智能、基因工程、新材料等新兴产业正在迅速崛起,新一代信息技术是其发展的重要依托与基础保障。新兴产业拉动新一代信息技术、新一代信息技术推动新兴产业发展的良性互动正在形成。

    5、推动传统产业转型升级

    中国传统产业正在全面转型升级中,由此带来信息产业的需求旺盛。通过新一代信息技术推动产品与商业模式创新,实施供给侧结构性改革,实现新一代信息技术与行业应用的深度融合。

    二、技术和产品优势

    公司自成立以来始终专注于高端计算机、存储、软件和云计算领域的研发工作。公司已经掌握了大量高端计算机、存储、系统软件和云计算等领域的核心技术,在本领域实现国内领先并达到国际先进水平。2016年,公司成为国家发改委等九部委联合认定的“创新百强”企业,公司科技创新实力得到进一步认可。2017年,公司获批筹建“先进微处理器国家工程实验室”,为公司后续突破微处理器等IT核心技术,全面实现IT产品的自主可控提供了有力的技术支持。

    截止2017年底公司累计申请专利2053项,其中发明专利1690项;获得专利授权806项,其中发明专利授权491项。2017年度公司新增申请专利212项,其中发明专利150项;获得专利授权136项,其中发明专利授权104项。

    (1)高端计算机产品:高端计算机产品:公司在硅立方架构高性能计算机、100Gbps高速互联网络技术、6D-Torus高速网络技术、TC4600E-LP液冷刀片服务器、M-Pro架构刀片服务器、XSystem深度学习系统、高性能计算云管理和运维平台等领域开展了大量研发工作,并形成了一系列软硬件产品,上述产品与技术达到了国内领先水平。面向E计算需求,公司开展了E级高性能计算原型系统研制,在计算、网络、管理、制冷等方面开展核心技术研究。

    2017年,随着英特尔全新SkylakeCPU和AMDEPYC系列CPU发布,曙光同步发布了基于两种平台的全线高性能计算机和通用计算机产品,包括2路通用机架式服务器I620-G30、I610-G30、I420-G30、4路核心应用服务器I840-G30,支持100G互联的新一代TC4600E刀片服务器,符合互联网应用ODCC标准的新一代TC4600T服务器等。新一代产品性能、可扩展性、易用性、稳定性等均获得大幅度提升,市场竞争力进一步增强。

    2017年,公司产品获得了BAT互联网用户的认可,在产品入围上获得进一步突破。符合“天蝎2.5”标准的TC5600I整机柜服务器,保持大批量向用户持续供货。

    (2)存储产品:2017年,ParaStor基于多项技术,对小文件访问性能进行全方位优化,较大幅度提升了小文件性能,并针对石油地震、生物基因、AI等领域持续深入适配与优化,为用户构建最佳实践存储平台方案。同时,公司基于ParaStor推出视频监控领域应用一体机,为视频监控行业用户带来更佳使用体验。

    (3)云计算:随着公司Cloudview云计算操作系统的不断升级完善以及与各行业合作伙伴生态系统的构建,公司建设城市云和行业云计算中心的能力显著提升。公司依托自主云计算产品。

    三、公司所处的行业地位

    1、高端计算机领域

    在科学计算领域,公司高性能计算机产品长期处于领先地位,获得了良好的市场份额与客户口碑。公司是国家突破“E级超算”的一支重要力量,于2016年获批准承担国家重点研发计划的“E级高性能计算机原型系统研制”项目。

    2、存储领域

    公司中高端存储和NAS存储在细分产品领域在中国市场保持领先地位。

    3、云计算与大数据

    2015年,公司提出了“数据中国”战略,通过建设“百城百行”云数据中心,打造覆盖中国的云数据网络。以“让全社会共享数据价值”为愿景,推动公司快速向综合信息系统服务商进行转型。2016年,公司推出“数据中国加速计划”,明确提出“加速网络布局、加速数据汇集”的战略目标,并以“创新品牌云连锁,布局四个大数据”为抓手,积极推动“数据中国”战略落地。公司提出的“云合计划”,在业界创新性地提出了以品牌连锁模式发展城市云中心。2017年,公司发布“数据中国智能计划”,推出AI专用服务器和人工智能管理平台,联合产业链上下游企业进行协同研发和服务部署,进而促进人工智能在智慧城市、智能制造和数据密集型科学研究领域的深入应用。旨在通过先进、高效的智能计算,让数据变成智慧知识和智能服务能力,从而实现“让全社会共享数据价值”的愿景。

    2017年,中国科学院经管会批准公司牵头成立“中国科学院智慧城市产业联盟”。在中科院品牌和技术支撑下,联盟定位于创新链和产业链结合的纽带,为智慧城市建设中的“跨界”合作提供产品、技术、人才和实践经验支持,从而有效促进项目落地、科技创新及成果转化,推动智慧城市建设。目前联盟汇聚了顶层规划、物联网、云计算与大数据、地理信息、信息安全防护、特色应用等成员单位,能提供生态、医疗、建筑、交通、安防等多行业解决方案,打造了多层次、全链条、综合性成果转化的合作平台。

    四、财务情况

    2017 年,公司实现营业收入 62.94 亿元,同比增长 44.36%;利润总额 3.71 亿元,同比增长 32.20%;归属于上市公司股东的净利润 3.09 亿元,同比增长 37.71%;扣非后归属于上市公司股 东的净利润 2.06 亿元,同比增长 23.04%。

    五、行业格局和趋势

    1、行业竞争格局

    在高端计算机领域,市场中参与竞争的企业主要有:戴尔、联想、华为等,其中本土厂商的市场份额呈持续上升趋势。

    在存储领域,EMC等跨国企业占有中国市场份额相对较高,但国内品牌市场增长较快,品牌差距不断缩小。

    在软件、系统集成与技术服务领域,市场竞争较为分散,并未形成由少数厂商主导的市场格局。随着云计算和大数据时代的到来,云服务业务发展较快,本公司在政务云和城市云领域布局较早,优势明显,该领域有望成为公司潜在的未来业务的增长点。对政府、科学、安全、工业等四类大数据应用入手早、投入高、已形成较好基础。

    2、发展趋势

    (1)“大计算”时代来临

    依据Gartner预测,到2020年全球数据总量将达35,000EB,相当于80亿块4TB硬盘的容量,面对持续产生的、不同结构类型的海量数据,传统的计算技术已渐显疲态。随着数百亿个设备即将接入互联网,对计算技术的要求越来越高,不仅要算得快,还要算得好,算得稳,算得多,并可以节省能源。一批面向未来的先进计算技术与产品如E级计算、异构计算、量子计算、认知计算、类脑计算等,正纷至沓来,不断刷新人们对计算的认知。

    (2)“先进计算”需求强劲

    先进计算是指融合计算、存储、网络、控制等技术,构建新一代信息基础设施,实现人、机、物的互联互通、信息共享和智能应用。其技术发展方向大致可以分为两类,一类是对现有技术和架构的不断优化升级,如E级超算、云计算、大数据计算、深度学习、人机物三元融合计算等,另一类是对传统计算技术和架构的颠覆性创新,如超导量子计算、类脑计算、光子计算、新型变革性器件等。先进计算涉及计算原理、材料、工艺、器件、系统、算法、网络架构、应用等多个领域,是新一代信息技术产业的核心和基石。

    中科曙光在大数据领域地位稳固,长期处于领先地位,促使国家在大数据实力不断增强。

    如果您想长期获取科技信息的解读,记得关注我,我会每天更新,谢谢。同时如果您有什么意见和建议,欢迎评论。

  • ?

    大数据计算的准确性有多高?看看这些截屏就知道了

    cwfcwf

    展开

    今天清晨发了一篇文章《高烤状元烤面筋,纯手工制作,五元二大串》,到傍晚时发这篇大数据的文章,偶然发现后台记录的数据出入较大。应该不会是数据延迟这么久,看来误差是存在的。大家可以看看转发数据的问题。自媒体从业者是鱼肉啊。这几个截屏是下午五点半左右的,已经反馈。

    关注头条号华仔聚焦,生活多一些趣事。

  • ?

    我们可以通过大数据计算获得

    贾南烟

    展开

    对于保值率的计算,我们采用的是“用户卖车价÷厂商指导价”的计算方式,来真实的反映一款车的价值。对于大部分车型的保值率,我们可以通过大数据计算获得,而部分车型上市时间较短,多年保值率则由模型推导计算得出。在排名方式上,从交易的数据来看,三年车型的二手车在市场中的比例最多,所以我们采用三年保值率为参考依据进行排序。

     数据显示,雅阁的主要分布地区是在东南沿海及渤海湾地区,其中,广东、浙江、江苏三地的成交量已经占到了全国交易总数的三分之一。除此之外,河南、辽宁、上海等地也有着不错的销量成绩。在城市分布数据中,上海、宁波、温州的城市交易量占到了全国各地交易分布的前三名。

    通过上图所示的大数据来看,本田飞度2014款1.5L LXCVT舒适性、丰田威驰2014款1.3L手动型尚版、铃木雨燕2012款1.3L手动超值版在这三款车系中属于热门车型,二手车的交易量较为活跃。我们以厂商指导价为8.18万元的本田飞度2014款1.5L LXCVT舒适性为例,该车2014年8月上牌,据今已经有2年7个月车龄了,在2017年3月份以5.92万元转手卖出,根据我们的数学模型计算,其第三年保值率为70.4%,当前保值率为72.4%。同时,上述所得出的保值率与模型计算的保值率结果差距极小。

  • ?

    怎样通过大数据计算一个国家的命运?

    罗斯科夫

    展开

    这篇文章的题目或者可以叫《“XXXX”——大数据时代的一则寓言故事》,但因为“XXXX”是一个自造的成语,我对它所诠释的本篇文章要表达观点的准确性并不满意,所以就用了这么一个“疑问式的标题党句式”。另外,在看完文章后,希望你能发挥自己的想法在评论区将这个成语,造的更贴切!

    言归正传。当人们掌握了真实有效的数据,然后经过科学系统的归纳与总结,形成结论,最终指导实践,进而改善现实的弊端,使人类社会不断进化。这是科学的工作思路,正确的工作方法,是大数据时代里的一个我们都在追求并努力实践的高效的运行机制。

    既然大数据可以指导生活生产实践,进化人类社会(国家的宏观调控政策,供给侧改革),那么,通过它是不是也可以预测到潜藏在未来的某些客观的,无法改变的事实?也就是说:我们事先运用科学的数据统计与分析,断定事物的发展在某个时间必然会进入某个状态。其实现实生活中,这样聊天攀谈的句式比比皆是。

    抛出个大胆的论定:通过复杂的数据研究,一个国家将会在未来的哪一年灭亡?

    这似乎成了“大数据”本身的一个悖论,因为人们研究大数据的初衷就是用来指导实践,改善现实中的弊端,进化社会的。但现实告诉我们,糟糕的事情每天都在不可避免的发生。不管是一个什么样的国家,它总会有它过去的历史,有现在的各种客观存在,和冗杂的意识形态,有将来的规划和方向。但这“规划和方向”有时并不以人的意志为转移。

    从理论上,这就意味着:我抛出的大胆定论是一种潜藏的客观存在。

    做个大胆的假设:公元前206年,秦国灭亡是个必然的事实。

    这个假设本身又很吊诡,因为它早已经成为事实。用既定的事实来倒退导向它的原因是我们中学历史课本常见的解题方法,而那个正确的答案就是通过科学的分析“大数据”得来的。也就是说,我们凭什么认为秦朝是因为这些原因而灭亡的,凭的就是这些科学的“大数据”。

    历史课本中关于“秦朝灭亡的根本原因是什么?”这个问题的答案是:秦的暴政。(准确来讲应该是封建统治者对生产资料的大量占有及对劳动人民的残酷剥削。)

    当然,秦朝灭亡的原因有很多,所以,我们首先归纳它灭亡的根本原因,明确了根本原因,再开始围绕着它做数据统计。问题的答案是“秦的暴政”,那么,我们就要研究秦朝实行的是什么“政策制度”。

    秦制:

    1、秦统一文字,对于中央集权的统一、文化的传播和发展,都起到了重要作用;

    2、统一全国货币,又规定了统一的度、量、衡制度。促进了商品流通,促进发展;

    3、征发大批人力修缮长城,使人民苦于劳逸。

    4、下令史官烧掉记载秦国以外各国历史的史书,有敢私下讨论的人处死刑;

    ……

    历史影响:使人民之间的沟通、交流变得更加容易。但是以高压政治和残酷的刑法为主实行集权制度,又把人们的生活推向了水深火热之中。暴政剥削导致暴动反抗。

    这里所罗列的“秦制”是一个广义的定义,它的意思是“客观的存在于秦朝时期方方面面的制度”。如果秦施行的政策是“ABCD”,那“A”涉及到方方面面又是“1234”,而“1”又会更具体的反映出每个人在日常生活中的情绪和态度,甚至是影响到自然界的反应。至此,每个人的态度和情绪或自然反应就开始反作用于“1”,“1”开始导向“A”,“A”就直接影响到“制度本身”,合而为一,整个社会的一切都开始由量变走向质变。其实整个过程是一个无限“深和广”的程式,并非如我所列举的这么简单。

    好的量变导向好的质变,坏的量变导向坏的质变,然后好的质变和坏的质变开始进行综合较量(这个过程也是我们日常生活中最能直接感受到的变化,我们不习惯考虑深层的原因,只习惯在事物发展到最明显的阶段后做反应)。

    结果是:好的质变,败给了坏的质变,最终导致应有的客观的质变——秦朝的灭亡。

    倒退一下支撑“秦朝灭亡”这一结果的论据:

    通过对“ABCD”及“1234”等一些列客观存在的“大数据”的分析,我们认识了“秦朝灭亡”这件事情。那么,构成这组“大数据”的“小数据”是什么?只有掌握了方方面面的“小数据”,我们才能拿现实生活中的具体事件作参考。

    比如:在秦朝的某年某月某日,咸阳城内或任何一个地方,发生了一件可以影响“数据”走向的变量,可以是暴动事件,甚至是两个人之间的小摩擦,那么这件事情就是导向“秦朝灭亡”这一结果的一条数据。又或者秦朝皇帝是通过暴力还是禅让,或者其他的什么样方式登上帝位的?不同的登基方式会导向什么样的结果?这样,皇帝登基时的年龄,有利条件和无利条件是什么?在上朝过程中更多的商议了那方面的事情?等等,这些都是一条条可计算的数据。

    首先请原谅,接下来的小标题会让你本能的产生一种,被骗入观看植入广告的厌恶感。但是没有广告。

    如果有一款这样的APP,它能不能运算出一个国家将在何时灭亡?

    通过汇总世界各国不同历史时期的不同王朝的兴衰存亡的数据,更加清晰的未来预测将会呈现在我们面前。虽然这个数据要足够庞大,运算方式也足够复杂,但它们是数据,数据的命运在这样的一个“大数据结合便捷互联网统计和运算平台的时代”确实就是客观存在的,也是可以被逐渐认知的,更不可否认它是能足够支撑一个“结果发生”的。

    所以,这样智能化的工具被生产出来,就很荒诞。当政者在实行一条政策或者针对某件事作出某个反应动作后,这款智能化工具调出大数据库的数据,直接生成另一组导向结果的数据,点击“提交”,然后显示:某年某月某日,因何事,而灭亡。不知道这款工具能不能成为一鼎可以敲响的警钟。

    另外,文首提出的小请求,有好的替代,还请费心,它的反义词是“天方夜谭” 。

  • ?

    大数据的除法运算

    Zarate

    展开

    直接用C语言的“/”运算符进行除法运算时,“被除数”,“ 除数”,“商”,这三个数据的最大范围是unsigned long 类型,也就是数据最大范围是4个字节,十进制的范围是0至4294967295。一旦超过了这个范围,则运算会出错。因此,当进行大数据除法运算时,我们要额外编程序,实现大数据的算法。其实这种算法并不难,就是我们在小学里学的四则运算算法。

    我们先要弄清楚一个新的概念。不考虑小数点的情况下,数据有两种表现形式。一种是常用的变量形式,另外一种是BCD码数组形式。变量的最大范围有限,而BCD码数组的形式是无限的,正因为这个特点,所以我们可以进行大数据运算。

    这一节要教大家一个知识点:

    第一个:如何编写涉及到大数据除法运算的算法程序函数,同时也复习了指针的用途。

    具体内容,请看源代码讲解。

    (1)硬件平台:

    基于51单片机学习板。

    (2)实现功能:

    波特率是:9600 。

    通过电脑串口调试助手模拟上位机,往单片机发送组合BCD码的被除数和除数,单片机把组合BCD码的运算结果返回到上位机。被除数与除数的最大范围都是从0到9999,如果运算的商超过允许保存的最大位数范围或者除数为0,则返回EE EE EE报错。

    往单片机发送的数据格式:EB 00 55 XX XX 0d 0a YY YY 0d 0a指令,其中EB 00 55是数据头,XX XX是被除数,是1到2个字节的组合BCD码。YY YY是除数,是1到2个字节的组合BCD码。0d 0a是固定的结束标志。

    例如:

    (a)9816 ÷ 8= 1227

    上位机发送数据:eb 00 55 98 16 0d 0a 08 0d 0a

    单片机返回:12 27

    (b)9816 ÷ 0= 出错了,除数不能为0。

    上位机发送数据:eb 00 55 98 16 0d 0a 00 0d 0a

    单片机返回:EE EE EE

    (3)源代码讲解如下:

    #include "REG52.H"

    /* 注释一:

    * 本系统中的除法运算,规定被除数和除数的最大范围是0至9999.

    * 由于STC89C52单片机的RAM只有256个,也就是说系统的变量数最大

    * 不能超过256个,如果超过了这个极限,编译器就会报错。由于51单片机RAM资源有限,

    * 因此规定除数的最大范围不能超过9999,如果这个算法移植到stm32或者PIC等RAM比较大

    * 的单片机上,那么就可以把这个运算位数设置得更加大一点。调整下面 BCD4_MAX的大小,

    * 可以调整运算的数据范围。

    */

    #define BCD4_MAX 3 //调整BCD4_MAX的大小,可以调整运算的数据范围。

    #define BCD8_MAX (BCD4_MAX*2) //本系统中,规定的非组合BCD码能保存的最大字节数,一个字节包含1位有效运算数

    #define const_rc_size 30 //接收串口中断数据的缓冲区数组大小

    #define const_receive_time 5 //如果超过这个时间没有串口数据过来,就认为一串数据已经全部接收完,这个时间根据实际情况来调整大小

    #define uchar unsigned char //方便移植平台

    #define ulong unsigned long //方便移植平台

    //如果在VC的平台模拟此算法,则都定义成int类型,如下:

    //#define uchar int

    //#define ulong int

    void initial_myself(void);

    void initial_peripheral(void);

    void delay_long(unsigned int uiDelaylong);

    void delay_short(unsigned int uiDelayShort);

    void T0_time(void); //定时中断函数

    void usart_receive(void); //串口接收中断函数

    void usart_service(void); //串口服务程序,在main函数里

    void eusart_send(unsigned char ucSendData);

    void BCD4_to_BCD8(const unsigned char *p_ucBCD_bit4,unsigned char ucBCD4_cnt,unsigned char *p_ucBCD_bit8,unsigned char *p_ucBCD8_cnt);

    void BCD8_to_BCD4(const unsigned char *p_ucBCD_bit8,unsigned char ucBCD8_cnt,unsigned char *p_ucBCD_bit4,unsigned char *p_ucBCD4_cnt);

    void ClearAllData(uchar ucARRAY_MAX,uchar *destData);

    uchar GetDataLength(const uchar *destData,uchar ucARRAY_MAX);

    uchar AddData(const uchar *destData,const uchar *sourceData,uchar *resultData); //两个数相加

    uchar CmpData(const uchar *destData,const uchar *sourceData); //比较两个数的大小

    uchar SubData(const uchar *destData,const uchar *sourceData,uchar *resultData);//两个数相减

    void EnlargeData(uchar *destData,uchar enlarge_cnt); //数组向大索引值移位,移一位相当于放大10倍

    uchar MultData(const uchar *destData,const uchar *sourceData,uchar *resultData); //两个数相乘

    uchar DivLessTenData(const uchar *destData,const uchar *sourceData,uchar *resultData,uchar *remData);//局部两个数相除,商不超过10。当商为0时,余数等于被除数

    uchar Div(const uchar *destData,const uchar *sourceData,uchar *resultData);//两个数相除

    sbit beep_dr=P2^7; //蜂鸣器的驱动IO口

    unsigned int uiSendCnt=0; //用来识别串口是否接收完一串数据的计时器

    unsigned char ucSendLock=1; //串口服务程序的自锁变量,每次接收完一串数据只处理一次

    unsigned int uiRcregTotal=0; //代表当前缓冲区已经接收了多少个数据

    unsigned char ucRcregBuf[const_rc_size]; //接收串口中断数据的缓冲区数组

    unsigned int uiRcMoveIndex=0; //用来解析数据协议的中间变量

    unsigned char ucDataBCD4_1[BCD4_MAX]; //接收到的第1个数组合BCD码数组形式 这里是指被乘数

    unsigned char ucDataBCD4_cnt_1=0; //接收到的第1个数组合BCD码数组的有效数据长度

    unsigned char ucDataBCD4_2[BCD4_MAX]; //接收到的第2个数组合BCD码数组形式 这里是指乘数

    unsigned char ucDataBCD4_cnt_2=0; //接收到的第2个数组合BCD码数组的有效数据长度

    unsigned char ucDataBCD4_3[BCD4_MAX]; //接收到的第3个数组合BCD码数组形式 这里是指积

    unsigned char ucDataBCD4_cnt_3=0; //接收到的第3个数组合BCD码数组的有效数据长度

    unsigned char ucDataBCD8_1[BCD8_MAX]; //接收到的第1个数非组合BCD码数组形式 这里是指被乘数

    unsigned char ucDataBCD8_cnt_1=0; //接收到的第1个数非组合BCD码数组的有效数据长度

    unsigned char ucDataBCD8_2[BCD8_MAX]; //接收到的第2个数非组合BCD码数组形式 这里是指乘数

    unsigned char ucDataBCD8_cnt_2=0; //接收到的第2个数非组合BCD码数组的有效数据长度

    unsigned char ucDataBCD8_3[BCD8_MAX]; //接收到的第3个数非组合BCD码数组形式 这里是指积

    unsigned char ucDataBCD8_cnt_3=0; //接收到的第3个数非组合BCD码数组的有效数据长度

    unsigned char ucResultFlag=11; //运算结果标志,10代表计算结果超出范围出错,11代表正常。

    void main()

    {

    initial_myself();

    delay_long(100);

    initial_peripheral();

    while(1)

    {

    usart_service(); //串口服务程序

    }

    }

    /* 注释二:

    * 组合BCD码转成非组合BCD码。

    * 这里的变量ucBCD4_cnt代表组合BCD码的有效字节数.

    * 这里的变量*p_ucBCD8_cnt代表经过转换后,非组合BCD码的有效字节数,记得加地址符号&传址进去

    * 本程序在上一节的基础上,略作修改,用循环for语句压缩了代码,

    * 同时引进了组合BCD码的有效字节数变量。这样就不限定了数据的长度,

    * 可以让我们根据数据的实际大小灵活运用。

    */

    void BCD4_to_BCD8(const unsigned char *p_ucBCD_bit4,unsigned char ucBCD4_cnt,unsigned char *p_ucBCD_bit8,unsigned char *p_ucBCD8_cnt)

    {

    unsigned char ucTmep;

    unsigned char i;

    for(i=0;i<BCD8_MAX;i++) //先把即将保存转换结果的缓冲区清零

    {

    p_ucBCD_bit8[i]=0;

    }

    *p_ucBCD8_cnt=ucBCD4_cnt*2; //转换成非组合BCD码后的有效数据长度

    for(i=0;i<ucBCD4_cnt;i++)

    {

    ucTmep=p_ucBCD_bit4[ucBCD4_cnt-1-i];

    p_ucBCD_bit8[ucBCD4_cnt*2-i*2-1]=ucTmep>>4;

    p_ucBCD_bit8[ucBCD4_cnt*2-i*2-2]=ucTmep&0x0f;

    }

    }

    /* 注释三:

    * 非组合BCD码转成组合BCD码。

    * 这里的变量ucBCD8_cnt代表非组合BCD码的有效字节数.

    * 这里的变量*p_ucBCD4_cnt代表经过转换后,组合BCD码的有效字节数,记得加地址符号&传址进去

    * 本程序在上一节的基础上,略作修改,用循环for语句压缩了代码,

    * 同时引进了非组合BCD码的有效字节数变量。这样就不限定了数据的长度,

    * 可以让我们根据数据的实际大小灵活运用。

    */

    void BCD8_to_BCD4(const unsigned char *p_ucBCD_bit8,unsigned char ucBCD8_cnt,unsigned char *p_ucBCD_bit4,unsigned char *p_ucBCD4_cnt)

    {

    unsigned char ucTmep;

    unsigned char i;

    unsigned char ucBCD4_cnt;

    for(i=0;i<BCD4_MAX;i++) //先把即将保存转换结果的缓冲区清零

    {

    p_ucBCD_bit4[i]=0;

    }

    ucBCD4_cnt=(ucBCD8_cnt+1)/2; //非组合BCD码转化成组合BCD码的有效数,这里+1避免非组合数据长度是奇数位

    *p_ucBCD4_cnt=ucBCD4_cnt; //把转换后的结果付给接口指针的数据,可以对外输出结果

    for(i=0;i<ucBCD4_cnt;i++)

    {

    ucTmep=p_ucBCD_bit8[ucBCD4_cnt*2-1-i*2]; //把非组合BCD码第8位分解出来

    p_ucBCD_bit4[ucBCD4_cnt-1-i]=ucTmep<<4;

    p_ucBCD_bit4[ucBCD4_cnt-1-i]=p_ucBCD_bit4[ucBCD4_cnt-1-i]+p_ucBCD_bit8[ucBCD4_cnt*2-2-i*2]; //把非组合BCD码第7位分解出来

    }

    }

    /* 注释四:

    *函数介绍:清零数组的全部数组数据

    *输入参数:ucARRAY_MAX代表数组定义的最大长度

    *输入输出参数:*destData--被清零的数组。

    */

    void ClearAllData(uchar ucARRAY_MAX,uchar *destData)

    {

    uchar i;

    for(i=0;i<ucARRAY_MAX;i++)

    {

    destData[i]=0;

    }

    }

    /* 注释五:

    *函数介绍:获取数组的有效长度

    *输入参数:*destData--被获取的数组。

    *输入参数:ucARRAY_MAX代表数组定义的最大长度

    *返回值 :返回数组的有效长度。比如58786这个数据的有效长度是5

    *电子开发者作者:吴坚鸿

    */

    uchar GetDataLength(const uchar *destData,uchar ucARRAY_MAX)

    {

    uchar i;

    uchar DataLength=ucARRAY_MAX;

    for(i=0;i<ucARRAY_MAX;i++)

    {

    if(0!=destData[ucARRAY_MAX-1-i])

    {

    break;

    }

    else

    {

    DataLength--;

    }

    }

    return DataLength;

    }

    /* 注释六:

    *函数介绍:比较两个数的大小

    *输入参数:

    *(1)*destData--被比较数的数组。

    *(2)*sourceData--比较数的数组。

    *返回值 :9代表小于,10代表相等,11代表大于。

    */

    uchar CmpData(const uchar *destData,const uchar *sourceData)

    {

    uchar cmpResult=10; //开始默认相等

    uchar destCnt=0;

    uchar sourceCnt=0;

    uchar i;

    destCnt=GetDataLength(destData,BCD8_MAX);

    sourceCnt=GetDataLength(sourceData,BCD8_MAX);

    if(destCnt>sourceCnt) //大于

    {

    cmpResult=11;

    }

    else if(destCnt<sourceCnt) //小于

    {

    cmpResult=9;

    }

    else if((destCnt==0)&&(sourceCnt==0)) //如果都是等于0则等于

    {

    cmpResult=10;

    }

    else //否则就要继续判断

    {

    for(i=0;i<destCnt;i++)

    {

    if(destData[destCnt-1-i]>sourceData[destCnt-1-i]) //从最高位开始判断,如果最高位大于则大于

    {

    cmpResult=11;

    break;

    }

    else if(destData[destCnt-1-i]<sourceData[destCnt-1-i]) //从最高位开始判断,如果最高位小于则小于

    {

    cmpResult=9;

    break;

    }

    //否则继续判断下一位

    }

    }

    return cmpResult;

    }

    /* 注释七:

    *函数介绍:两个数相减

    *输入参数:

    *(1)*destData--被减数的数组。

    *(2)*sourceData--减数的数组。

    *(3)*resultData--差的数组。注意,调用本函数前,必须先把这个数组清零

    *返回值 :10代表计算结果是负数或者超出范围出错,11代表正常。

    */

    uchar SubData(const uchar *destData,const uchar *sourceData,uchar *resultData)

    {

    uchar subResult=11; //开始默认正常

    uchar destCnt=0;

    uchar i;

    uchar carryData=0; //进位

    uchar maxCnt=0; //最大位数

    uchar resultTemp=0; //存放临时运算结果的中间变量

    //为什么不在本函数内先把resultData数组清零?因为后面章节中的除法运算中要用到此函数实现连减功能。

    //因此如果纯粹实现减法运算时,在调用本函数之前,必须先在外面把差的数组清零,否则会计算出错。

    if(CmpData(destData,sourceData)==9) //被减数小于减数,报错

    {

    subResult=10;

    return subResult; //返回判断结果,并且退出本程序,不往下执行本程序余下代码

    }

    destCnt=GetDataLength(destData,BCD8_MAX); //获取被减数的有效数据长度

    maxCnt=destCnt;

    for(i=0;i<maxCnt;i++)

    {

    resultTemp=sourceData[i]+carryData; //按位相加

    if(resultTemp>destData[i])

    {

    resultData[i]=destData[i]+10-sourceData[i]-carryData; //借位

    carryData=1;

    }

    else

    {

    resultData[i]=destData[i]-sourceData[i]-carryData; //不用借位

    carryData=0;

    }

    }

    return subResult;

    }

    /* 注释八:

    *函数介绍:两个数相加

    *输入参数:

    *(1)*destData--被加数的数组。

    *(2)*sourceData--加数的数组。

    *(3)*resultData--和的数组。注意,调用本函数前,必须先把这个数组清零

    *返回值 :10代表计算结果超出范围出错,11代表正常。

    */

    uchar AddData(const uchar *destData,const uchar *sourceData,uchar *resultData)

    {

    uchar addResult=1...

  • ?

    这五种大数据计算框架,你一定要知道!

    冷瞳

    展开

    随着这些年全世界数据的几何式增长,数据的存储和运算都将成为世界级的难题。之前小鸟给大家介绍过一些分布式文件系统,解决的是大数据存储的问题,今天小鸟给大家介绍一些分布式计算框架:

    Hadoop框架

    提起大数据,第一个想起的肯定是Hadoop,因为Hadoop是目前世界上应用最广泛的大数据工具,他凭借极高的容错率和极低的硬件价格,在大数据市场上风生水起。Hadoop还是第一个在开源社区上引发高度关注的批处理框架,他提出的Map和Reduce的计算模式简洁而优雅。迄今为止,Hadoop已经成为了一个广阔的生态圈,实现了大量算法和组件。由于Hadoop的计算任务需要在集群的多个节点上多次读写,因此在速度上会稍显劣势,但是其吞吐量也同样是其他框架所不能匹敌的。

    Storm框架

    与Hadoop的批处理模式不同,Storm采用的是流计算框架,由Twitter开源并且托管在GitHub上。与Hadoop类似的是,Storm也提出了两个计算角色,分别为Spout和Bolt。

    如果说Hadoop是水桶,只能一桶一桶的去井里扛,那么Storm就是水龙头,只要打开就可以源源不断的出水。Storm支持的语言也比较多,Java、Ruby、Python等语言都能很好的支持。由于Storm是流计算框架,因此使用的是内存,延迟上有极大的优势,但是Storm不会持久化数据。

    Samza框架

    Smaza也是一种流计算框架,但他目前只支持JVM语言,灵活度上略显不足,并且Samza必须和Kafka共同使用。但是响应的,其也继承了Kafka的低延时、分区、避免回压等优势。对于已经有Hadoop+Kafka工作环境的团队来说,Samza是一个不错的选择,并且Samza在多个团队使用的时候能体现良好的性能。

    Spark框架

    Spark属于前两种框架形式的集合体,是一种混合式的计算框架。它既有自带的实时流处理工具,也可以和Hadoop集成,代替其中的MapReduce,甚至Spark还可以单独拿出来部署集群,但是还得借助HDFS等分布式存储系统。Spark的强大之处在于其运算速度,与Storm类似,Spark也是基于内存的,并且在内存满负载的时候,硬盘也能运算,运算结果表示,Spark的速度大约为Hadoop的一百倍,并且其成本可能比Hadoop更低。但是Spark目前还没有像Hadoop哪有拥有上万级别的集群,因此现阶段的Spark和Hadoop搭配起来使用更加合适。

    Flink框架

    Flink也是一种混合式的计算框架,但是在设计初始,Fink的侧重点在于处理流式数据,这与Spark的设计初衷恰恰相反,而在市场需求的驱使下,两者都在朝着更多的兼容性发展。Flink目前不是很成熟,更多情况下Flink还是起到一个借鉴的作用。

    以上就是现在比较主流的大数据运算框架的介绍了,欢迎大家收藏转发。关注小鸟,获取更多大数据级相关技术的资讯与教程。

大数据计算

所有视频需要登录后,才能观看

请先登录您的帐号,即可完整播放,如果您尚未注册帐号,请先点击注册。

img

在线咨询

建站在线咨询

img

微信咨询

扫一扫添加
动力姐姐微信

img
img

TOP