A. 如何解决协同过滤的数据稀疏问题
以对原始的评分数据集进行变换,用评分值相对于平均评分值的偏差取代原始值,如基于物品过滤的数据预处理Amazon.com采用物品间
B. 如何让Hadoop结合R语言做大数据分析
R语言和Hadoop让我们体会到了,两种技术在各自领域的强大。很多开发人员在计算机的角度,都会提出下面2个问题。问题1: Hadoop的家族如此之强大,为什么还要结合R语言?
问题2: Mahout同样可以做数据挖掘和机器学习,和R语言的区别是什么?下面我尝试着做一个解答:问题1: Hadoop的家族如此之强大,为什么还要结合R语言?
a. Hadoop家族的强大之处,在于对大数据的处理,让原来的不可能(TB,PB数据量计算),成为了可能。
b. R语言的强大之处,在于统计分析,在没有Hadoop之前,我们对于大数据的处理,要取样本,假设检验,做回归,长久以来R语言都是统计学家专属的工具。
c. 从a和b两点,我们可以看出,hadoop重点是全量数据分析,而R语言重点是样本数据分析。 两种技术放在一起,刚好是最长补短!
d. 模拟场景:对1PB的新闻网站访问日志做分析,预测未来流量变化
d1:用R语言,通过分析少量数据,对业务目标建回归建模,并定义指标d2:用Hadoop从海量日志数据中,提取指标数据d3:用R语言模型,对指标数据进行测试和调优d4:用Hadoop分步式算法,重写R语言的模型,部署上线这个场景中,R和Hadoop分别都起着非常重要的作用。以计算机开发人员的思路,所有有事情都用Hadoop去做,没有数据建模和证明,”预测的结果”一定是有问题的。以统计人员的思路,所有的事情都用R去做,以抽样方式,得到的“预测的结果”也一定是有问题的。所以让二者结合,是产界业的必然的导向,也是产界业和学术界的交集,同时也为交叉学科的人才提供了无限广阔的想象空间。问题2: Mahout同样可以做数据挖掘和机器学习,和R语言的区别是什么?
a. Mahout是基于Hadoop的数据挖掘和机器学习的算法框架,Mahout的重点同样是解决大数据的计算的问题。
b. Mahout目前已支持的算法包括,协同过滤,推荐算法,聚类算法,分类算法,LDA, 朴素bayes,随机森林。上面的算法中,大部分都是距离的算法,可以通过矩阵分解后,充分利用MapRece的并行计算框架,高效地完成计算任务。
c. Mahout的空白点,还有很多的数据挖掘算法,很难实现MapRece并行化。Mahout的现有模型,都是通用模型,直接用到的项目中,计算结果只会比随机结果好一点点。Mahout二次开发,要求有深厚的JAVA和Hadoop的技术基础,最好兼有 “线性代数”,“概率统计”,“算法导论” 等的基础知识。所以想玩转Mahout真的不是一件容易的事情。
d. R语言同样提供了Mahout支持的约大多数算法(除专有算法),并且还支持大量的Mahout不支持的算法,算法的增长速度比mahout快N倍。并且开发简单,参数配置灵活,对小型数据集运算速度非常快。
虽然,Mahout同样可以做数据挖掘和机器学习,但是和R语言的擅长领域并不重合。集百家之长,在适合的领域选择合适的技术,才能真正地“保质保量”做软件。
如何让Hadoop结合R语言?
从上一节我们看到,Hadoop和R语言是可以互补的,但所介绍的场景都是Hadoop和R语言的分别处理各自的数据。一旦市场有需求,自然会有商家填补这个空白。
1). RHadoop
RHadoop是一款Hadoop和R语言的结合的产品,由RevolutionAnalytics公司开发,并将代码开源到github社区上面。RHadoop包含三个R包 (rmr,rhdfs,rhbase),分别是对应Hadoop系统架构中的,MapRece, HDFS, HBase 三个部分。
2). RHiveRHive是一款通过R语言直接访问Hive的工具包,是由NexR一个韩国公司研发的。
3). 重写Mahout用R语言重写Mahout的实现也是一种结合的思路,我也做过相关的尝试。
4).Hadoop调用R
上面说的都是R如何调用Hadoop,当然我们也可以反相操作,打通JAVA和R的连接通道,让Hadoop调用R的函数。但是,这部分还没有商家做出成形的产品。
5. R和Hadoop在实际中的案例
R和Hadoop的结合,技术门槛还是有点高的。对于一个人来说,不仅要掌握Linux, Java, Hadoop, R的技术,还要具备 软件开发,算法,概率统计,线性代数,数据可视化,行业背景 的一些基本素质。在公司部署这套环境,同样需要多个部门,多种人才的的配合。Hadoop运维,Hadoop算法研发,R语言建模,R语言MapRece化,软件开发,测试等等。所以,这样的案例并不太多。
C. 在Android想实现协同过滤算法,数据能从SQLite导入吗
首先你应该来知道思维导图自是改变思维习惯的,我想推荐的是 东尼。博攒 和巴利。博攒的相关东西,首先第一位是大脑和学习世界超级作家,有过80多部名著,记忆力锦标赛创始人等等,第二位是经济学国际关系研究专家等等。它们出版了一本叫思维导图的图书 是思维导图学习的经典,除了《思维导图》还有《超级记忆》《启动大脑》《快速阅读》《博攒学习技巧》等书,但是要学习思维导图,就应该看《思维导图》,堪称经典,而且又不贵,这本书会介绍新概念-------发散思维,其次是用的工具,然后让你智力自由控制思维,让你有发散思维的体验,最后让你在探索新领域的时候有一种全新刺激的收获,对人改善思维有很大帮助,如果想学习制作思维导图,这本书更是提供了很好的帮助,一步一步的教授,我第一次看了之后就深深地喜欢上了,所以把全套的都买下来了,很便宜,希望你喜欢。
D. 协同过滤 推荐怎么处理原始数据集
以对原始的评分数据集进行变换,用评分值相对于平均评分值的偏差取代原始值,如...基于物品过滤的数据预处理 Amazon.com采用物品间
E. Python实现协同过滤推荐算法,用的大一些的数据集就报错MemoryError
python虽然易用,但是内存占用比较多;所以如果你有C/C++/Java基础,考虑用这些语专言来实现;
CF算法属需要计算大量的相似度,如果能把中间结果存起来,或者简化计算过程(如,你可能会重复计算一个item的均值)可以省下不少内存;(个人试过计算1w个用户Pearson是没问题的)
如果内存实在不够用,那就用时间换空间,把中间计算结果分成小文件存到磁盘上,用的时候再读取。
供参考。
F. 如何建立一个完整可用的安全大数据平台
整体而言,大数据平台从平台部署和数据分析过程可分为如下几步:
1、linux系统安装
一般使用开源版的Redhat系统--CentOS作为底层平台。为了提供稳定的硬件基础,在给硬盘做RAID和挂载数据存储节点的时,需要按情况配置。例如,可以选择给HDFS的namenode做RAID2以提高其稳定性,将数据存储与操作系统分别放置在不同硬盘上,以确保操作系统的正常运行。
2、分布式计算平台/组件安装
目前国内外的分布式系统的大多使用的是Hadoop系列开源系统。Hadoop的核心是HDFS,一个分布式的文件系统。在其基础上常用的组件有Yarn、Zookeeper、Hive、Hbase、Sqoop、Impala、ElasticSearch、Spark等。
先说下使用开源组件的优点:1)使用者众多,很多bug可以在网上找的答案(这往往是开发中最耗时的地方)。2)开源组件一般免费,学习和维护相对方便。3)开源组件一般会持续更新,提供必要的更新服务『当然还需要手动做更新操作』。4)因为代码开源,若出bug可自由对源码作修改维护。
再简略讲讲各组件的功能。分布式集群的资源管理器一般用Yarn,『全名是Yet Another Resource Negotiator』。常用的分布式数据数据『仓』库有Hive、Hbase。Hive可以用SQL查询『但效率略低』,Hbase可以快速『近实时』读取行。外部数据库导入导出需要用到Sqoop。Sqoop将数据从Oracle、MySQL等传统数据库导入Hive或Hbase。Zookeeper是提供数据同步服务,Yarn和Hbase需要它的支持。Impala是对hive的一个补充,可以实现高效的SQL查询。ElasticSearch是一个分布式的搜索引擎。针对分析,目前最火的是Spark『此处忽略其他,如基础的MapRece 和 Flink』。Spark在core上面有ML lib,Spark Streaming、Spark QL和GraphX等库,可以满足几乎所有常见数据分析需求。
值得一提的是,上面提到的组件,如何将其有机结合起来,完成某个任务,不是一个简单的工作,可能会非常耗时。
3、数据导入
前面提到,数据导入的工具是Sqoop。用它可以将数据从文件或者传统数据库导入到分布式平台『一般主要导入到Hive,也可将数据导入到Hbase』。
4、数据分析
数据分析一般包括两个阶段:数据预处理和数据建模分析。
数据预处理是为后面的建模分析做准备,主要工作时从海量数据中提取可用特征,建立大宽表。这个过程可能会用到Hive SQL,Spark QL和Impala。
数据建模分析是针对预处理提取的特征/数据建模,得到想要的结果。如前面所提到的,这一块最好用的是Spark。常用的机器学习算法,如朴素贝叶斯、逻辑回归、决策树、神经网络、TFIDF、协同过滤等,都已经在ML lib里面,调用比较方便。
5、结果可视化及输出API
可视化一般式对结果或部分原始数据做展示。一般有两种情况,行熟悉展示,和列查找展示。在这里,要基于大数据平台做展示,会需要用到ElasticSearch和Hbase。Hbase提供快速『ms级别』的行查找。 ElasticSearch可以实现列索引,提供快速列查找。
平台搭建主要问题:
1、稳定性 Stability
理论上来说,稳定性是分布式系统最大的优势,因为它可以通过多台机器做数据及程序运行备份以确保系统稳定。但也由于大数据平台部署于多台机器上,配置不合适,也可能成为最大的问题。 曾经遇到的一个问题是Hbase经常挂掉,主要原因是采购的硬盘质量较差。硬盘损坏有时会到导致Hbase同步出现问题,因而导致Hbase服务停止。由于硬盘质量较差,隔三差五会出现服务停止现象,耗费大量时间。结论:大数据平台相对于超算确实廉价,但是配置还是必须高于家用电脑的。
2、可扩展性 Scalability
如何快速扩展已有大数据平台,在其基础上扩充新的机器是云计算等领域应用的关键问题。在实际2B的应用中,有时需要增减机器来满足新的需求。如何在保留原有功能的情况下,快速扩充平台是实际应用中的常见问题。
上述是自己项目实践的总结。整个平台搭建过程耗时耗力,非一两个人可以完成。一个小团队要真正做到这些也需要耗费很长时间。
目前国内和国际上已有多家公司提供大数据平台搭建服务,国外有名的公司有Cloudera,Hortonworks,MapR等,国内也有华为、明略数据、星环等。另外有些公司如明略数据等还提供一体化的解决方案,寻求这些公司合作对 于入门级的大数据企业或没有大数据分析能力的企业来说是最好的解决途径。
对于一些本身体量较小或者目前数据量积累较少的公司,个人认为没有必要搭建这一套系统,暂时先租用AWS和阿里云就够了。对于数据量大,但数据分析需求较简单的公司,可以直接买Tableau,Splunk,HP Vertica,或者IBM DB2等软件或服务即可。
G. 基于协同过滤的推荐系统的数据库在什么环境平台构建
大体试用了一下三个系统,得出了一个比较粗浅的结论: 1、phpcms: phpcms自2007版本开源以后才开始引起广泛关注,但这次也是头一次研究。用了几天,有了一点初步的印象。(以下以2007版为例,2008版尚未正式推出) 粗看起来,phpcms 2007是三者中最为完善的,各项功能考虑的很细致,导致进了新手进了后台先要晕半天才行。各项功能,比如UNIX系统的权限、模版修改、广告、商城、信息、单网页。。。。都做的相当的完备了。 发表文章的关键字、作者、来源、自动远程图片保存等等,都做的不错。但是,phpcms发表文章的摘要,似乎是只能自动截取,不能手工设置,灵活性欠佳。 发表的文章可以通过关键字来索引相关贴,做的不错。 支持通行证方式进行论坛和其它系统的整合,可以进行正向和反向两种方式的整合。但是文档说的不太清楚,研究了半天才成功。但是反向整合pw5.0.1登录后自动跳转不回来。 phpcms 2007的后台安排的太琐碎,看的头晕。发一篇文章也要晕半个钟头,而且首页的更新莫不清规律,幻灯片老半天不更新。 phcms尽管功能很强大,但是却缺少一样重要的东西:可视化的模版工具,这也是php168和dedecms共同的缺点。在这方面,他们甚至不如刚刚起步的DiyPage好,DiyPage只是一个刚刚具备了雏形的CMS系统,却拥有一个很方便的后台可视化界面设计工具,即使是菜鸟也可以轻松设计界面(虽然灵活性没那么强大,但是足够你用了)。 phpcms 2007整体以频道为依据进行组织,即使你不想用频道,哪也得用,这个已经由不了你了 。所以如果仅仅是一个比较简单的网站,也用上一个频道,看起来够别扭的,这是phpcms 2007最大的缺点,不过看了phpcms 2008beta2发现,phpcms终于解除了这个垃圾限制。 发现phpcms的广告功能似乎不完善,一个广告位定义了两个广告,不能自动轮换,总是显示第一个。 phpcms虽然实现了模块化,但是不管你用不用,一大堆模块稀里呼噜就装上了,看起来很不爽,也不直观。 phpcms虽然是很早就是商业化运作的软件,然后开发效率却是不高,新版本屡屡跳票,影响了它的产品形象,让开源以来积累的人气和一些拥趸大失所望。然而最近贴上了六间房以后,资金应该是没有压力了,新版本也开始浮出水面,2008beta1已经发布了,可惜问题多多。 phpcms 2008 beta2 在 MySQL4 上还是有使用问题,不过比beta1强一些,beta1直接就安装不了,不知道正式版是否会正式放弃MySQL4。 phpcms 2008beta2看上去不错,新功能令人振奋的,界面清爽。以前一团乱麻的后台界面已经打扫干净了。phpcms 2008的标签采用了中英文混合的方式,对菜鸟来说更加容易上手,比较新颖。另外,beta2好像是实现了类似php168的可视化模版中的标签设置方式,虽然不是可视化的设计模版,总归可以自定义一些元素样式了。不过这个beta2版也还是顶多算是个预览版,BUG极多,功能不全。如果准备用phpcms的话,怕是还要大大的等几天才行。 另外,phpcms官方论坛对免费版的支持很不到位,伤了很多粉丝的心。 2、dedecms 5.1应该是dedecms正式商业化运作以后推出的第一个版本吧?以前的dedecms个体作坊式的发展,由于作者兼职时间和精力不足,导致发展缓慢,新版本频频跳票,引起广大粉丝的强烈不满,甚至导致柏拉图和dedecms用家之间的语言冲突。然而dedecms在商业化运作以后,新版本的发布周期大大缩短,产品功能不断改进,界面美化了很多,人气和用户数量大大增长了,现在看发展势头不错。 dedecms的根目录是最简单的,只有几个文件,比以上两个都强多了,其实这样不仅看起来清爽,维护起来也方便,值得表扬 dedecms的频道非常费解,看起来只有频道模型,要增加频道就要添加模版文件有点费解,仔细研究发现,这个dedecms其实和php168的方式差不多,任何栏目都可以添加子目录,绑定域名,其实就和频道是一个意思,栏目和频道可以互相转换。 dedecms的通行证只支持反向整合,就是dedecms可以用服务端的用户数据登录。其实所谓整合,一般也就是这样的。论坛用整站用户数据的情况恐怕极为少见,对论坛管理也不利。 但是dedecms的通行证整合,需要修改论坛文件,不明白为啥要这样,是因为论坛的通行证功能还不完善吗? dedecms的广告管理用起来比较麻烦,要先定义标签,然后手工在模板中插入。好像模版上没预定义好广告位置,实在是太不应该了。。。。相当于手动操作,不符合当今历史潮流啊。而且大家常用的广告自动轮换功能,也没有实现。 试用发现,dedecms有时还有一些小毛病,比如远程附件功能,有时发现无法自动转存到本地。另外,在模块数量上,dedecms也无法和php168和phpcms相比,只有文章、下载、图片、Flash等基本的功能,不知道dedecms 2007发布以后能否有所改观 dedecms的相关文章、热点文章等功能,用了静态生成的方式直接写入到了HTML文件中,这样在生成HTML后,无法自动更新,需要经常手工重新生成全部HTML才能更新相关文档和热点文档。但是大量的重复生成所有HTML文件效率太低下了,这方面dedecms不如php168最新添加的相关文章功能,是用JS方式实现的,不需要更新HTML就能自动索取最新的相关文章。但是使用JS方式也存在服务器效率的问题。 dedecms的首页、列表页、还有文章页都使用了单独的模板,没有使用header和footer模板,这样的好处是可以产生各种风格的页面(允许首页、列表页、内容页使用不同的风格),但是缺点是修改添加头部和底部广告、导航条的时候,相当费劲,要一个一个模板的修改。而且dedecms的版权声明字段设置太小,只有250字节,写不进去多少内容,顶多能添加个计数器就不错了。 dedecms起步就用了类似XML标签方式,而且官方还提供了Dreamweaver的插件来识别标签,应该说在国内是比较独到的。但是这种方式也需要新手一定的时间才能适应。同时,dedecms一直缺乏比较完善的文档,也进一步加大了菜鸟上手的难度。 dedecms最大的问题就是没有提供类似Diypage的可视化设计方式,因为标签比较难于上手,对新手来说做模板是很头疼的问题。 dedecms 5.1比4.0功能有了很多进步,增加DIGG功能,还有类似分类信息之类的功能都实现了。不过也有退步,比如关键词、相关帖功能都严重退步了,发帖也很不方便,而且dedecms在商业版本和免费版本之间做功能和代码区分,也自然会在免费版本上有所缩水。 dedecms商业化发展以后,目前出现的问题是免费版的技术支持做的不太到位,比phpcms强不了多少
H. Python实现协同过滤推荐算法,用的大一些的数据集就报错MemoryError
1.
python虽然易用,复但是内制存占用比较多;所以如果你有C/C++/Java基础,考虑用这些语言来实现;
2.
CF算法需要计算大量的相似度,如果能把中间结果存起来,或者简化计算过程(如,你可能会重复计算一个item的均值)可以省下不少内存;(个人试过计算1w个用户Pearson是没问题的)
3.
如果内存实在不够用,那就用时间换空间,把中间计算结果分成小文件存到磁盘上,用的时候再读取。
供参考。
I. 协同过滤java用什么实现
众所周知,java在处理数据量比较大的时候,加载到内存必然会导致内存溢出,而在一些数据处理中我们不得不去处理海量数据,在做数据处理中,我们常见的手段是分解,压缩,并行,临时文件等方法;例如,我们要将数据库(不论是什么数据库)的数据导出到一个文件,一般是Excel或文本格式的CSV;对于Excel来讲,对于POI和JXL的接口,你很多时候没有法去控制内存什么时候向磁盘写入,很恶心,而且这些API在内存构造的对象大小将比数据原有的大小要大很多倍数,所以你不得不去拆分Excel,还好,POI开始意识到这个问题,在3.8.4的版本后,开始提供cache的行数,提供了SXSSFWorkbook的接口,可以设置在内存中的行数,不过可惜的是,他当你超过这个行数,每添加一行,它就将相对行数前面的一行写入磁盘(如你设置2000行的话,当你写第20001行的时候,他会将第一行写入磁盘),其实这个时候他些的临时文件,以至于不消耗内存,不过这样你会发现,刷磁盘的频率会非常高,我们的确不想这样,因为我们想让他达到一个范围一次性将数据刷如磁盘,比如一次刷1M之类的做法,可惜现在还没有这种API,很痛苦,我自己做过测试,通过写小的Excel比使用目前提供刷磁盘的API来写大文件,效率要高一些,而且这样如果访问的人稍微多一些磁盘IO可能会扛不住,因为IO资源是非常有限的,所以还是拆文件才是上策;而当我们写CSV,也就是文本类型的文件,我们很多时候是可以自己控制的,不过你不要用CSV自己提供的API,也是不太可控的,CSV本身就是文本文件,你按照文本格式写入即可被CSV识别出来;如何写入呢?下面来说说。。。在处理数据层面,如从数据库中读取数据,生成本地文件,写代码为了方便,我们未必要1M怎么来处理,这个交给底层的驱动程序去拆分,对于我们的程序来讲我们认为它是连续写即可;我们比如想将一个1000W数据的数据库表,导出到文件;此时,你要么进行分页,oracle当然用三层包装即可,mysql用limit,不过分页每次都会新的查询,而且随着翻页,会越来越慢,其实我们想拿到一个句柄,然后向下游动,编译一部分数据(如10000行)将写文件一次(写文件细节不多说了,这个是最基本的),需要注意的时候每次buffer的数据,在用outputstream写入的时候,最好flush一下,将缓冲区清空下;接下来,执行一个没有where条件的SQL,会不会将内存撑爆?是的,这个问题我们值得去思考下,通过API发现可以对SQL进行一些操作,例如,通过:PreparedStatementstatement=connection.prepareStatement(sql),这是默认得到的预编译,还可以通过设置:PreparedStatementstatement=connection.prepareStatement(sql,ResultSet.TYPE_FORWARD_ONLY,ResultSet.CONCUR_READ_ONLY);来设置游标的方式,以至于游标不是将数据直接cache到本地内存,然后通过设置statement.setFetchSize(200);设置游标每次遍历的大小;OK,这个其实我用过,oracle用了和没用没区别,因为oracle的jdbcAPI默认就是不会将数据cache到java的内存中的,而mysql里头设置根本无效,我上面说了一堆废话,呵呵,我只是想说,java提供的标准API也未必有效,很多时候要看厂商的实现机制,还有这个设置是很多网上说有效的,但是这纯属抄袭;对于oracle上面说了不用关心,他本身就不是cache到内存,所以java内存不会导致什么问题,如果是mysql,首先必须使用5以上的版本,然后在连接参数上加上useCursorFetch=true这个参数,至于游标大小可以通过连接参数上加上:defaultFetchSize=1000来设置,例如:jdbc:mysql://xxx.xxx.xxx.xxx:3306/abc?zeroDateTimeconvertToNull&useCursorFetch=true&defaultFetchSize=1000上次被这个问题纠结了很久(mysql的数据老导致程序内存膨胀,并行2个直接系统就宕了),还去看了很多源码才发现奇迹竟然在这里,最后经过mysql文档的确认,然后进行测试,并行多个,而且数据量都是500W以上的,都不会导致内存膨胀,GC一切正常,这个问题终于完结了。我们再聊聊其他的,数据拆分和合并,当数据文件多的时候我们想合并,当文件太大想要拆分,合并和拆分的过程也会遇到类似的问题,还好,这个在我们可控制的范围内,如果文件中的数据最终是可以组织的,那么在拆分和合并的时候,此时就不要按照数据逻辑行数来做了,因为行数最终你需要解释数据本身来判定,但是只是做拆分是没有必要的,你需要的是做二进制处理,在这个二进制处理过程,你要注意了,和平时read文件不要使用一样的方式,平时大多对一个文件读取只是用一次read操作,如果对于大文件内存肯定直接挂掉了,不用多说,你此时因该每次读取一个可控范围的数据,read方法提供了重载的offset和length的范围,这个在循环过程中自己可以计算出来,写入大文件和上面一样,不要读取到一定程序就要通过写入流flush到磁盘;其实对于小数据量的处理在现代的NIO技术的中也有用到,例如多个终端同时请求一个大文件下载,例如视频下载吧,在常规的情况下,如果用java的容器来处理,一般会发生两种情况:其一为内存溢出,因为每个请求都要加载一个文件大小的内存甚至于,因为java包装的时候会产生很多其他的内存开销,如果使用二进制会产生得少一些,而且在经过输入输出流的过程中还会经历几次内存拷贝,当然如果有你类似nginx之类的中间件,那么你可以通过send_file模式发送出去,但是如果你要用程序来处理的时候,内存除非你足够大,但是java内存再大也会有GC的时候,如果你内存真的很大,GC的时候死定了,当然这个地方也可以考虑自己通过直接内存的调用和释放来实现,不过要求剩余的物理内存也足够大才行,那么足够大是多大呢?这个不好说,要看文件本身的大小和访问的频率;其二为假如内存足够大,无限制大,那么此时的限制就是线程,传统的IO模型是线程是一个请求一个线程,这个线程从主线程从线程池中分配后,就开始工作,经过你的Context包装、Filter、拦截器、业务代码各个层次和业务逻辑、访问数据库、访问文件、渲染结果等等,其实整个过程线程都是被挂住的,所以这部分资源非常有限,而且如果是大文件操作是属于IO密集型的操作,大量的CPU时间是空余的,方法最直接当然是增加线程数来控制,当然内存足够大也有足够的空间来申请线程池,不过一般来讲一个进程的线程池一般会受到限制也不建议太多的,而在有限的系统资源下,要提高性能,我们开始有了newIO技术,也就是NIO技术,新版的里面又有了AIO技术,NIO只能算是异步IO,但是在中间读写过程仍然是阻塞的(也就是在真正的读写过程,但是不会去关心中途的响应),还未做到真正的异步IO,在监听connect的时候他是不需要很多线程参与的,有单独的线程去处理,连接也又传统的socket变成了selector,对于不需要进行数据处理的是无需分配线程处理的;而AIO通过了一种所谓的回调注册来完成,当然还需要OS的支持,当会掉的时候会去分配线程,目前还不是很成熟,性能最多和NIO吃平,不过随着技术发展,AIO必然会超越NIO,目前谷歌V8虚拟机引擎所驱动的node.js就是类似的模式,有关这种技术不是本文的说明重点;将上面两者结合起来就是要解决大文件,还要并行度,最土的方法是将文件每次请求的大小降低到一定程度,如8K(这个大小是经过测试后网络传输较为适宜的大小,本地读取文件并不需要这么小),如果再做深入一些,可以做一定程度的cache,将多个请求的一样的文件,cache在内存或分布式缓存中,你不用将整个文件cache在内存中,将近期使用的cache几秒左右即可,或你可以采用一些热点的算法来配合;类似迅雷下载的断点传送中(不过迅雷的网络协议不太一样),它在处理下载数据的时候未必是连续的,只要最终能合并即可,在服务器端可以反过来,谁正好需要这块的数据,就给它就可以;才用NIO后,可以支持很大的连接和并发,本地通过NIO做socket连接测试,100个终端同时请求一个线程的服务器,正常的WEB应用是第一个文件没有发送完成,第二个请求要么等待,要么超时,要么直接拒绝得不到连接,改成NIO后此时100个请求都能连接上服务器端,服务端只需要1个线程来处理数据就可以,将很多数据传递给这些连接请求资源,每次读取一部分数据传递出去,不过可以计算的是,在总体长连接传输过程中总体效率并不会提升,只是相对相应和所开销的内存得到量化控制,这就是技术的魅力,也许不要太多的算法,不过你得懂他。类似的数据处理还有很多,有些时候还会将就效率问题,比如在HBase的文件拆分和合并过程中,要不影响线上业务是比较难的事情,很多问题值得我们去研究场景,因为不同的场景有不同的方法去解决,但是大同小异,明白思想和方法,明白内存和体系架构,明白你所面临的是沈阳的场景,只是细节上改变可以带来惊人的效果。
J. 协同过滤中的实时性定义及解决思路
自从第一台IoT设备于年问世以来,物联网已经有了长足的发展,这是一种可以在互联网上开启和关闭的烤面包机。27年之后,联网设备已经从新奇产品变成了日常生活中必不可少的一部分。
最近的预估显示,成年人平均每天花在智能手机上的时间超过4个小时,只能手机也是一种装有物联网传感器数据的设备。目前,81%的成年人拥有智能手机。想象一下,当81%的成年人拥有智能汽车和智能家居时,我们将会收到多少数据。
今天,IoT设备的大部分数据都在云中处理,这意味着全球所有角落产生的数据都被集中发送到数据中心的少数计算机上。然而,随着IoT设备的数量预计将在2020年猛增至200亿,通过互联网发送数据的体积和速度对云计算方法提出了严峻的挑战。
越来越多的设备连接将迫使IoT制造商在2018年将云计算模式从云计算模式转移到一种称为“雾计算”的新模式。
越来越多的数据访问,云计算问题明显
物联网和人工智能的发展将带来价值数以亿计的数据。分布广泛的传感器、智能终端等每时每刻都在产生大量的数据。尽管云计算拥有“无限”的计算和存储资源池,但云数据中心往往是集中化的且距离终端设备较远,当面对大量的分布广泛的终端设备及所采集的海量数据时,云不可避免地遇到了三大难题:
网络拥塞,如果大量的物联网和人工智能应用部署在云中,将会有海量的原始数据不间断地涌入核心网络,造成核心网络拥塞;
高延迟,终端设备与云数据中心的较远距离将导致较高的网络延迟,而对实时性要求高的应用则难以满足需求;
可靠性无法保证,对可靠性和安全性要求较高的应用,由于从终端到云平台的距离远,通信通路长,因而风险大,云中备份的成本也高。
因此,为满足物联网和人工智能等应用的需求,作为云计算的延伸扩展,雾计算(Fog Computing)的概念应运而生。雾计算最早由思科提出,它是一种分布式的计算模型,作为云数据中心和物联网设备 / 传感器之间的中间层,它提供计算、网络和存储设备,让基于云的服务可以离物联网设备和传感器更近。
雾计算主要使用边缘网络中的设备,可以是传统网络设备,如网络中的路由器、交换机、网关等,也可以是专门部署的本地服务器。这些设备的资源能力都远小于一个数据中心,但是它们庞大的数量可以弥补单一设备资源的不足。
在物联网中,雾可以过滤、聚合用户消息,匿名处理用户数据以保证隐秘性,初步处理数据以便实时决策,提供临时存储以提升用户体验,而云则可以负责大运算量或长期存储任务,与雾计算优势互补。通过雾计算,可以将一些并不需要放到云上的数据在网络边缘层直接进行处理和存储,提高数据分析处理的效率,降低时延,减少网络传输压力,提升安全性。雾计算以其广泛的地理分布、带有大量网络节点的大规模传感器网络、支持高移动性和实时互动以及多样化的软硬件设备和云在线分析等特点,迅速被物联网和人工智能应用领域的企业所接受并获得广泛应用,例如,M2M、人机协同、智能电网、智能交通、智能家居、智能医疗、无人驾驶等应用。
与边缘计算(Edge Computing)不同的是,雾计算可以将基于云的服务 , 如 IaaS、 PaaS、 SaaS,拓展到网络边缘,而边缘计算更多地专注于终端设备端。雾计算可以进行边缘计算,但除了边缘网络,雾计算也可以拓展到核心网络,也就是边缘和核心网络的组件都可以作为雾计算的基础设施。
“云”和“雾”典型案例和应用场景
融合云平台和雾计算,一方面可通过云降低传统 IT采购、管理和运维的开支,将 IaaS、 PaaS、 SaaS作为云服务输出;另一方面,通过雾计算可保证边缘端数据的实时搜集、提取和分析速度,提高网络资源部署使用和管理效率,有助于提高人机协同效率,为企业业务创新、服务品质提升提供技术支持。以下是四个行业“云”和“雾”的典型案例和应用场景。
工业
GE基于 Pivotal Cloud Foundry打造了 Predix 物联网 PaaS平台,结合戴尔智能仿真技术,实现了“数据双胞胎”。基于云计算,GE 实现了飞机发动机生产过程中的调优,同时,基于雾计算,GE 实现了飞机飞行过程中的“自愈”。
GE Predix 作为物联网 PaaS 平台,还助力制造企业将大数据、物联网和人工智能转化为智能制造能力,实现数据创新。GE Predix 平台,融合云计算和雾计算以及”数字双胞胎“,帮助制造企业实现“虚拟 - 现实”的设计生产融合,并为其提供云计算服务。
农业
Chitale Dairy是一家乳制品厂。基于戴尔科技虚拟化技术,Chitale Dairy实现了 ERP云部署。他们基于雾计算,通过为奶牛装上传感器,进行近实时数据采集分析、处理,实现精细化运营,保证乳制品生产全流程的监控、管理、优化。同时,Chitale Dairy 通过基于云的乳业生命周期管理平台,实现了乳制品生产流程自动化管理,通过物联网和大数据分析,对每头奶牛从食料、喂养、健康、牛奶质量和产量进行全流程监控分析,实现精细化和自动化乳业生产。
将云的整体业务管理和雾端的优化农场间协作以及奶源监控管理紧密连接起来,在提高乳制品生命周期管理效率的同时,提升了协同和协作效率,加速企业业务创新的速度。
服务业
TopGolf 是一家高尔夫俱乐部。通过采用戴尔科技的虚拟化和超融合技术,形成了高尔夫数字化高端服务输出能力。他们通过向数字化转型,打破了传统高尔夫的业务模式。通过物联网,将 RFID 芯片嵌入高尔夫球里,实现对每次击球、每个队员和赛事进行实时监控,并基于雾计算,实时跟踪和分析每个击球动作和球的路径,实现实时积分。
TopGolf 的业务模式融合了云计算和雾计算,实现了跨数据中心、云和边缘应用的实时数据监控、交互和管理,满足赛事实时监控、场上场下互动、赛前球员积分分析、社交媒体、会员个性化数据管理等大数据分析的需求。
交通业
在智能交通中,可通过传感器搜集信息,进行实时数据分析和交通部署,以提高公共安全。通过雾计算,智能交通控制系统中的一个雾节点可以共享收集到的交通信息,以缓解高峰时段的交通拥堵、定位交通事故,并可以通过远程控制缓解交通拥堵区域的交通状况。同时,在每个用户的电话和公共交通中,基于雾计算的应用程序允许用户在没有持续网络连接的情况下,共享并通过附近的用户下载内容。
此外,自动化车辆的安全系统、道路上的监控系统以及公共交通的票务系统,都可以从传感器和视频数据中收集大量信息。聚合后的数据将传输到云上,根据用户的需求进行数据提取和分析,再基于雾计算实现边缘数据实时分析,从而为用户快速提供精准信息,以保障公共交通的畅通和安全。
未来雾计算将扮演重大角色
从商业运营模式到工作生活方式,智能物联网技术正深刻改变着人类社会。要让物联网拥有无处不在的智能,就必须充分利用网络环境中分散存在的计算、存储、通信和控制等能力,通过资源共享机制和协同服务架构来有效提升生产效率或用户体验。
当前,雾计算技术的研究和标准化工作刚刚起步。我们面临的主要技术挑战和研究热点为:如何在雾计算节点之间建立信任关系,如何在它们之间推动资源充分共享,如何在云—雾—边缘等多层次之间实现高效通信和紧密协作,如何在异构节点之间完成复杂任务的公平按需分配等。
可以预见,随着雾计算技术的不断发展成熟和普及应用,智能物联网将越来越便捷、越来越真实地借鉴和映射人类社会的组织架构和决策机制,从而能用更自然和更熟悉的方式为每个人提供触手可及、无处不在的智能服务。