大数据的日益增长,给企业管理大量的数据带来了挑战的同时也带来了一些机遇。下面是用于信息化管理的大数据工具列表:
1.ApacheHive
Hive是一个建立在hadoop上的开源数据仓库基础设施,通过Hive可以很容易的进行数据的ETL,对数据进行结构化处理,并对Hadoop上大数据文件进行查询和处理等。Hive提供了一种简单的类似SQL的查询语言—HiveQL,这为熟悉SQL语言的用户查询数据提供了方便。
2JaspersoftBI套件
Jaspersoft包是一个通过数据库列生成报表的开源软件。行业领导者发现Jaspersoft软件是一流的,许多企业已经使用它来将SQL表转化为pdf,,这使每个人都可以在会议上对其进行审议。另外,JasperReports提供了一个连接配置单元来替代HBase。
3.1010data
1010data创立于2000年,是一个总部设在纽约的分析型云服务,旨在为华尔街的客户提供服务,甚至包括NYSEEuronext、 游戏 和电信的客户。它在设计上支持可伸缩性的大规模并行处理。它也有它自己的查询语言,支持SQL函数和广泛的查询类型,包括图和时间序列分析。这个私有云的方法减少了客户在基础设施管理和扩展方面的压力。
4.Actian
Actian之前的名字叫做IngresCorp,它拥有超过一万客户而且正在扩增。它通过Vectorwise以及对ParAccel实现了扩展。这些发展分别导致了ActianVector和ActianMatrix的创建。它有Apache,Cloudera,Hortonworks以及其他发行版本可供选择。
5.PentahoBusinessAnalytics
从某种意义上说,Pentaho与Jaspersoft相比起来,尽管Pentaho开始于报告生成引擎,但它目前通过简化新来源中获取信息的过程来支持大数据处理。Pentaho的工具可以连接到NoSQL数据库,例如MongoDB和Cassandra。PeterWayner指出,PentahoData(一个更有趣的图形编程界面工具)有很多内置模块,你可以把它们拖放到一个图片上,然后将它们连接起来。
6.KarmasphereStudioandAnalyst
KarsmasphereStudio是一组构建在Eclipse上的插件,它是一个更易于创建和运行Hadoop任务的专用IDE。在配置一个Hadoop工作时,Karmasphere工具将引导您完成每个步骤并显示部分结果。当出现所有数据处于同一个Hadoop集群的情况时,KarmaspehereAnalyst旨在简化筛选的过程,。
7.Cloudera
Cloudera正在努力为开源Hadoop,提供支持,同时将数据处理框架延伸到一个全面的“企业数据中心”范畴,这个数据中心可以作为首选目标和管理企业所有数据的中心点。Hadoop可以作为目标数据仓库,高效的数据平台,或现有数据仓库的ETL来源。企业规模可以用作集成Hadoop与传统数据仓库的基础。Cloudera致力于成为数据管理的“重心”。
8.
HP提供了用于加载Hadoop软件发行版所需的参考硬件配置,因为它本身并没有自己的Hadoop版本。计算机行业领袖将其大数据平台架构命名为HAVEn(意为Hadoop,Autonomy,Vertica,EnterpriseSecurityand“n”applications)。惠普在Vertica7版本中增加了一个“FlexZone”,允许用户在定义数据库方案以及相关分析、报告之前 探索 大型数据集中的数据。这个版本通过使用HCatalog作为元数据存储,与Hadoop集成后为用户提供了一种 探索 HDFS数据表格视图的方法。
9.TalendOpenStudio
Talend’s工具用于协助进行数据质量、数据集成和数据管理等方面工作。Talend是一个统一的平台,它通过提供一个统一的,跨企业边界生命周期管理的环境,使数据管理和应用更简单便捷。这种设计可以帮助企业构建灵活、高性能的企业架构,在次架构下,集成并启用百分之百开源服务的分布式应用程序变为可能。
10.ApacheSpark
ApacheSpark是Hadoop开源生态系统的新成员。它提供了一个比Hive更快的查询引擎,因为它依赖于自己的数据处理框架而不是依靠Hadoop的HDFS服务。同时,它还用于事件流处理、实时查询和机器学习等方面。
② MongoDB如何优化查询性能
站在用户的视角来看,如果一个搜索返回时间大于了1秒,就会让很多用户失去耐心。所以作为开发者而言,在开发过程中100%会遇到的一个问题就是优化数据的查询性能。那么在Mongo中是如何做查询性能优化呢?下面就给大家介绍一下。
在mongo中也提供了一个explain()方法,该方法能够提供大量与查询相关的信息。对于速度比较慢的查询来说,它是最重要的性能分析工具之一。通过查看一个查询的explain()输出信息,可以知道查询使用了哪个索引,以及是如何使用的。对于任意查询,都可以在最后添加一个explain()调用(与调用sort()或者limit()一样,不过explain()必须放在最后)。
最常见的explain()输出有两种类型:使用索引的查询和没有使用索引的查询。其输出的信息可能如图1:
返回信息详细介绍:
“millis”表明了这个查询的执行时间。数字越小,则说明这个查询的效率越高。
“n”则表明了实际返回的文档数量。
“nscanned“描述了MongoDB在执行这个查询时搜索了多少文档。
”cursor“本查询返回值为”BasicCursor“则说明该查询未使用索引,所以才会搜索了所有的文档。如返回”BtreeCursor“则表示查询中使用了索引。
”isMultiKey“用于说明是否使用了多键索引。
”nYield“指本次查询暂停的次数。在查询期间,如果有与入请求需要处理,为了让写入请求能够顺利执行,查询会周期性的释放它的锁。
③ 为什么MongoDB适合大数据的存储
Mongo是一个高性能,开源,无模式的文档型数据库,它在许多场景下可用于替代传统的关系型数据库或键/值存储方式。Mongo使用C++开发,提供了以下功能:
◆面向集合的存储:适合存储对象及jsON形式的数据。
◆动态查询:Mongo支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。
◆完整的索引支持:包括文档内嵌对象及数组。Mongo的查询优化器会分析查询表达式,并生成一个高效的查询计划。
◆查询监视:Mongo包含一个监视工具用于分析数据库操作的性能。
◆复制及自动故障转移:Mongo数据库支持服务器之间的数据复制,支持主-从模式及服务器之间的相互复制。复制的主要目标是提供冗余及自动故障转移。
◆高效的传统存储方式:支持二进制数据及大型对象(如照片或图片)。
◆自动分片以支持云级别的伸缩性(处于早期alpha阶段):自动分片功能支持水平的数据库集群,可动态添加额外的机器。
MongoDB的主要目标是在键/值存储方式(提供了高性能和高度伸缩性)以及传统的RDBMS系统(丰富的功能)架起一座桥梁,集两者的优势于一身。根据官方网站的描述,Mongo适合用于以下场景:
◆网站数据:Mongo非常适合实时的插入,更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性。
◆缓存:由于性能很高,Mongo也适合作为信息基础设施的缓存层。在系统重启之后,由Mongo搭建的持久化缓存层可以避免下层的数据源过载。
◆大尺寸,低价值的数据:使用传统的关系型数据库存储一些数据时可能会比较昂贵,在此之前,很多时候程序员往往会选择传统的文件进行存储。
◆高伸缩性的场景:Mongo非常适合由数十或数百台服务器组成的数据库。Mongo的路线图中已经包含对MapRece引擎的内置支持。
◆用于对象及JSON数据的存储:Mongo的BSON数据格式非常适合文档化格式的存储及查询。
自然,MongoDB的使用也会有一些限制,例如它不适合:
◆高度事务性的系统:例如银行或会计系统。传统的关系型数据库目前还是更适用于需要大量原子性复杂事务的应用程序。
◆传统的商业智能应用:针对特定问题的BI数据库会对产生高度优化的查询方式。对于此类应用,数据仓库可能是更合适的选择。
◆需要SQL的问题
MongoDB支持OS X、linux及Windows等操作系统,并提供了Python,PHP,Ruby,java及C++语言的驱动程序,社区中也提供了对Erlang及.NET等平台的驱动程序。
④ c# 驱动 查询 MongoDB group 大数据量,导致MongoDB服务关闭
32bit的mongodb只能有2gb的容量。
⑤ mongodb查找所有最多
方法一:对目标值按大到小排序后,再取出第一条
具体查询语句是
db.getCollection('collection1').find().sort({ rid: -1}).limit(1)
在Robo 3T中运行,有10万条数据集中,查询时间为0.002s
方法二:用aggregate的group结合max
具体查询语句是
1|db.getCollection('collection1').aggregate([{$group:{"_id": "$id","max_rid":{$max: "$rid"}}}])
在Robo 3T中运行,有10万条数据集中,查询时间为0.908s
查询性能明显没有方法一高效。
总结:故生产环境中应选用方法一。
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
⑥ mongodb和mysql5.7的json哪个更好,优缺点比较
与关系型数据库相比,MongoDB的优点: ①弱一致性(最终一致),更能保证用户的访问速度: 举例来运谨说,在传统的关系型数据库中,一个COUNT类型的操作会锁定数据集,这样可以保证得到“当前”情况下的精确值。这在某些情况下,例 如通过ATM查看账户信息的时候很重要,但对于Wordnik来说,数据是不断更新和增长的,这种“精确”的保证几乎没有任何意义,反而会产生很大的延 迟。他们需要的是一个“大约”的数字以及更快的处理速度。 但某些情况下MongoDB会锁住数据库。如果此时正有数百个请求,则它们会堆积起来,造成许多问题。我们使用了下面的优化方式来避免锁定: 每次更新前,我们会先查询记录。查询操作会将对象放入内存,于是更新则会尽可能的迅速。在主/从部署方案中,从节点可以使用“-pretouch”参数运行,这也可以得到相同的效果。 使用多个mongod进程。我们根据访问模式将数据库拆分成多个进程。 ②文档结构的存储方式,能够更便捷的获取数据。 对于一个层级式的数据结构来说,如果要将这样的数据使用扁平式的,表状的结构来保存数据,这无论是在查询还是获取数据时都十分困难。 举例1: 就拿一个“字典项”来说,虽然并不十分复杂,但还是会关系到“定义”、“词性”、“发音”或是“引用”等内容。大部分工程师会将这种模型使用关系型数据库 中的主键和外键表现出来,但把它看作一个“文档”而不是“一系列有关系的表”岂不更好?使用 “dictionary.definition.partOfSpeech='noun'”来查询也比表之间一系列复杂(往往代价也很高)的连接查询方便 且快速。 举例2:在一个关系型数据基悄拦库中,一篇博客(包含文章内容、评论、评论的投票)会被打散在多张数据表中。在MongoDB中,能用一个文档来表示一篇博客, 评论与投票作为文档数组,放在正文主文档中。这样数据更易于管理,消除了传统关系型数据库中影响性能和水平扩展性的“JOIN”操作。 CODE↓ > db.blogposts.save({ title : "My First Post", author: {name : "Jane", id :1}, comments : [{ by: "Abe", text: "First" }, { by : "Ada", text : "Good post"搏胡 }] }) > db.blogposts.find( { "author.name" : "Jane" } ) > db.blogposts.findOne({ title : "My First Post", "author.name": "Jane", comments : [{ by: "Abe", text: "First" }, { by : "Ada", text : "Good post" } ] }) > db.blogposts.find( { "comments.by" : "Ada" } ) > db.blogposts.ensureIndex( { "comments.by" : 1 } ); 举例③: MongoDB是一个面向文档的数据库,目前由10gen开发并维护,它的功能丰富,齐全,完全可以替代MySQL。在使用MongoDB做产品原型的过程中,我们总结了MonogDB的一些亮点: 使用JSON风格语法,易于掌握和理解:MongoDB使用JSON的变种BSON作为内部存储的格式和语法。针对MongoDB的操作都使用JSON风格语法,客户端提交或接收的数据都使用JSON形式来展现。相对于SQL来说,更加直观,容易理解和掌握。 Schema-less,支持嵌入子文档:MongoDB是一个Schema-free的文档数据库。一个数据库可以有多个Collection,每 个Collection是Documents的集合。Collection和Document和传统数据库的Table和Row并不对等。无需事先定义 Collection,随时可以创建。 Collection中可以包含具有不同schema的文档记录。 这意味着,你上一条记录中的文档有3个属性,而下一条记录的文档可以有10个属 性,属性的类型既可以是基本的数据类型(如数字、字符串、日期等),也可以是数组或者散列,甚至还可以是一个子文档(embed document)。这 样,可以实现逆规范化(denormalizing)的数据模型,提高查询的速度。 ③内置GridFS,支持大容量的存储。 GridFS是一个出色的分布式文件系统,可以支持海量的数据存储。 内置了GridFS了MongoDB,能够满足对大数据集的快速范围查询。 ④内置Sharding。 提供基于Range的Auto Sharding机制:一个collection可按照记录的范围,分成若干个段,切分到不同的Shard上。 Shards可以和复制结合,配合Replica sets能够实现Sharding+fail-over,不同的Shard之间可以负载均衡。查询是对 客户端是透明的。客户端执行查询,统计,MapRece等操作,这些会被MongoDB自动路由到后端的数据节点。这让我们关注于自己的业务,适当的 时候可以无痛的升级。MongoDB的Sharding设计能力最大可支持约20 petabytes,足以支撑一般应用。 这可以保证MongoDB运行在便宜的PC服务器集群上。PC集群扩充起来非常方便并且成本很低,避免了“sharding”操作的复杂性和成本。 ⑤第三方支持丰富。(这是与其他的NoSQL相比,MongoDB也具有的优势) 现在网络上的很多NoSQL开源数据库完全属于社区型的,没有官方支持,给使用者带来了很大的风险。 而开源文档数据库MongoDB背后有商业公司10gen为其提供供商业培训和支持。 而且MongoDB社区非常活跃,很多开发框架都迅速提供了对MongDB的支持。不少知名大公司和网站也在生产环境中使用MongoDB,越来越多的创新型企业转而使用MongoDB作为和Django,RoR来搭配的技术方案。 ⑥性能优越: 在使用场合下,千万级别的文档对象,近10G的数据,对有索引的ID的查询不会比mysql慢,而对非索引字段的查询,则是全面胜出。 mysql实际无法胜任大数据量下任意字段的查询,而mongodb的查询性能实在让我惊讶。写入性能同样很令人满意,同样写入百万级别的数 据,mongodb比我以前试用过的couchdb要快得多,基本10分钟以下可以解决。补上一句,观察过程中mongodb都远算不上是CPU杀手。 与关系型数据库相比,MongoDB的缺点: ①mongodb不支持事务操作。 所以事务要求严格的系统(如果银行系统)肯定不能用它。(这点和优点①是对应的) ②mongodb占用空间过大。 关于其原因,在官方的FAQ中,提到有如下几个方面: 1、空间的预分配:为避免形成过多的硬盘碎片,mongodb每次空间不足时都会申请生成一大块的硬盘空间,而且申请的量从64M、128M、256M那 样的指数递增,直到2G为单个文件的最大体积。随着数据量的增加,你可以在其数据目录里看到这些整块生成容量不断递增的文件。 2、字段名所占用的空间:为了保持每个记录内的结构信息用于查询,mongodb需要把每个字段的key-value都以BSON的形式存储,如果 value域相对于key域并不大,比如存放数值型的数据,则数据的overhead是最大的。一种减少空间占用的方法是把字段名尽量取短一些,这样占用 空间就小了,但这就要求在易读性与空间占用上作为权衡了。我曾建议作者把字段名作个index,每个字段名用一个字节表示,这样就不用担心字段名取多长 了。但作者的担忧也不无道理,这种索引方式需要每次查询得到结果后把索引值跟原值作一个替换,再发送到客户端,这个替换也是挺耗费时间的。现在的实现算是 拿空间来换取时间吧。 3、删除记录不释放空间:这很容易理解,为避免记录删除后的数据的大规模挪动,原记录空间不删除,只标记“已删除”即可,以后还可以重复利用。
⑦ MongoDB是什么,怎么用看完你就知道了
MongoDB是一款为web应用程序和互联网基础设施设计的数据库管理系统。没错MongoDB就是数据库,是NoSQL类型的数据库。
(1)MongoDB提出的是文档、集合的概念,使用BSON(类JSON)作为其数据模型结构,其结构是面向对象的而不是二维表,存储一个用户在MongoDB中是这样子的。
使用这样的数据模型,使得MongoDB能在生产环境中提供高读写的能力,吞吐量较于mysql等SQL数据库大大增强。
(2)易伸缩,自动故障转移。易伸缩指的是提供了分片能力,能对数据集进行分片,数据的存储压力分摊给多台服务器。自动故障转移是副本集的概念,MongoDB能检测主节点是否存活,当失活时能自动提升从节点为主节点,达到故障转移。
(3)数据模型因为是面向对象的,所以可以表示丰富的、有层级的数据结构,比如博客系统中能把“评论”直接怼到“文章“的文档中,而不必像myqsl一样创建三张表来描述这样的关系。
(1)文档数据类型
SQL类型的数据库是正规化的,可以通过主键或者外键的约束保证数据的完整性与唯一性,所以SQL类型的数据库常用于对数据完整性较高的系统。MongoDB在这一方面是不如SQL类型的数据库,且MongoDB没有固定的Schema,正因为MongoDB少了一些这样的约束条件,可以让数据的存储数据结构更灵活,存储速度更加快。
(2)即时查询能力
MongoDB保留了关系型数据库即时查询的能力,保留了索引(底层是基于B tree)的能力。这一点汲取了关系型数据库的优点,相比于同类型的NoSQL redis 并没有上述的能力。
(3)复制能力
MongoDB自身提供了副本集能将数据分布在多台机器上实现冗余,目的是可以提供自动故障转移、扩展读能力。
(4)速度与持久性
MongoDB的驱动实现一个写入语义 fire and forget ,即通过驱动调用写入时,可以立即得到返回得到成功的结果(即使是报错),这样让写入的速度更加快,当然会有一定的不安全性,完全依赖网络。
MongoDB提供了Journaling日志的概念,实际上像mysql的bin-log日志,当需要插入的时候会先往日志里面写入记录,再完成实际的数据操作,这样如果出现停电,进程突然中断的情况,可以保障数据不会错误,可以通过修复功能读取Journaling日志进行修复。
(5)数据扩展
MongoDB使用分片技术对数据进行扩展,MongoDB能自动分片、自动转移分片里面的数据块,让每一个服务器里面存储的数据都是一样大小。
MongoDB核心服务器主要是通过mongod程序启动的,而且在启动时不需对MongoDB使用的内存进行配置,因为其设计哲学是内存管理最好是交给操作系统,缺少内存配置是MongoDB的设计亮点,另外,还可通过mongos路由服务器使用分片功能。
MongoDB的主要客户端是可以交互的js shell 通过mongo启动,使用js shell能使用js直接与MongoDB进行交流,像使用sql语句查询mysql数据一样使用js语法查询MongoDB的数据,另外还提供了各种语言的驱动包,方便各种语言的接入。
mongomp和mongorestore,备份和恢复数据库的标准工具。输出BSON格式,迁移数据库。
mongoexport和mongoimport,用来导入导出JSON、CSV和TSV数据,数据需要支持多格式时有用。mongoimport还能用与大数据集的初始导入,但是在导入前顺便还要注意一下,为了能充分利用好mongoDB通常需要对数据模型做一些调整。
mongosniff,网络嗅探工具,用来观察发送到数据库的操作。基本就是把网络上传输的BSON转换为易于人们阅读的shell语句。
因此,可以总结得到,MongoDB结合键值存储和关系数据库的最好特性。因为简单,所以数据极快,而且相对容易伸缩还提供复杂查询机制的数据库。MongoDB需要跑在64位的服务器上面,且最好单独部署,因为是数据库,所以也需要对其进行热备、冷备处理。
因为本篇文章不是API手册,所有这里对shell的使用也是基础的介绍什么功能可以用什么语句,主要是为了展示使用MongoDB shell的方便性,如果需要知道具体的MongoDB shell语法可以查阅官方文档。
创建数据库并不是必须的操作,数据库与集合只有在第一次插入文档时才会被创建,与对数据的动态处理方式是一致的。简化并加速开发过程,而且有利于动态分配命名空间。如果担心数据库或集合被意外创建,可以开启严格模式。
以上的命令只是简单实例,假设如果你之前没有学习过任何数据库语法,同时开始学sql查询语法和MongoDB 查询语法,你会发现哪一个更简单呢?如果你使用的是java驱动去操作MongoDB,你会发现任何的查询都像Hibernate提供出来的查询方式一样,只要构建好一个查询条件对象,便能轻松查询(接下来会给出示例),博主之前熟悉ES6,所以入手MongoDB js shell完成没问题,也正因为这样简洁,完善的查询机制,深深的爱上了MongoDB。
使用java驱动链接MongoDB是一件非常简单的事情,简单的引用,简单的做增删改查。在使用完java驱动后我才发现spring 对MongoDB 的封装还不如官方自身提供出来的东西好用,下面简单的展示一下使用。
这里只举例了简单的链接与简单的MongoDB操作,可见其操作的容易性。使用驱动时是基于TCP套接字与MongoDB进行通信的,如果查询结果较多,恰好无法全部放进第一服务器中,将会向服务器发送一个getmore指令获取下一批查询结果。
插入数据到服务器时间,不会等待服务器的响应,驱动会假设写入是成功的,实际是使用客户端生成对象id,但是该行为可以通过配置配置,可以通过安全模式开启,安全模式可以校验服务器端插入的错误。
要清楚了解MongoDB的基本数据单元。在关系型数据库中有带列和行的数据表。而MongoDB数据的基本单元是BSON文档,在键值中有指向不定类型值的键,MongoDB拥有即时查询,但不支持联结操作,简单的键值存储只能根据单个键来获取值,不支持事务,但支持多种原子更新操作。
如读写比是怎样的,需要何种查询,数据是如何更新的,会不会存在什么并发问题,数据结构化的程度是要求高还是低。系统本身的需求决定mysql还是MongoDB。
在关于schema 的设计中要注意一些原则,比如:
数据库是集合的逻辑与物理分组,MongoDB没有提供创建数据库的语法,只有在插入集合时,数据库才开始建立。创建数据库后会在磁盘分配一组数据文件,所有集合、索引和数据库的其他元数据都保存在这些文件中,查阅数据库使用磁盘状态可通过。
集合是结构上或概念上相似得文档的容器,集合的名称可以包含数字、字母或 . 符号,但必须以字母或数字开头,完全。
限定集合名不能超过128个字符,实际上 . 符号在集合中很有用,能提供某种虚拟命名空间,这是一种组织上的原则,和其他集合是一视同仁的。在集合中可以使用。
其次是键值,在MongoDB里面所有的字符串都是UTF-8类型。数字类型包括double、int、long。日期类型都是UTC格式,所以在MongoDB里面看到的时间会比北京时间慢8小时。整个文档大小会限制在16m以内,因为这样可以防止创建难看的数据类型,且小文档可以提升性能,批量插入文档理想数字范围是10~200,大小不能超过16MB。
(1)索引能显著减少获取文档的所需工作量,具体的对比可以通过 .explain()方法进行对比
(2)解析查询时MongoDB通过最优计划选择一个索引进行查询,当没有最适合索引时,会先不同的使用各个索引进行查询,最终选出一个最优索引做查询
(3)如果有一个a-b的复合索引,那么仅针对a的索引是冗余的
(4)复合索引里的键的顺序是很重要的
(1)单键索引
(2)复合索引
(3)唯一性索引
(4)稀疏索引
如索引的字段会出现null的值,或是大量文档都不包含被索引的键。
如果数据集很大时,构建索引将会花费很长的时间,且会影响程序性能,可通过
当使用 mongorestore 时会重新构建索引。当曾经执行过大规模的删除时,可使用
对索引进行压缩,重建。
(1)查阅慢查询日志
(2)分析慢查询
注意新版本的MongoDB 的explain方法是需要参数的,不然只显示普通的信息。
本节同样主要简单呈现MongoDB副本集搭建的简易性,与副本集的强壮性,监控容易性
提供主从复制能力,热备能力,故障转移能力
实际上MongoDB对副本集的操作跟mysql主从操作是差不多的,先看一下mysql的主从数据流动过程
而MongoDB主要依赖的日志文件是oplog
写操作先被记录下来,添加到主节点的oplog里。与此同时,所有从结点复制oplog。首先,查看自己oplog里最后一条的时间戳;其次,查询主节点oplog里所有大于此时间戳的条目;最后,把那些条目添加到自己的oplog里并应用到自己的库里。从节点使用长轮询立即应用来自主结点oplog的新条目。
当遇到以下情况,从节点会停止复制
local数据库保存了所有副本集元素据和oplog日志
可以使用以下命令查看复制情况
每个副本集成员每秒钟ping一次其他所有成员,可以通过rs.status()看到节点上次的心跳检测时间戳和 健康 状况。
这个点没必要过多描述,但是有一个特殊场景,如果从节点和仲裁节点都被杀了,只剩下主节点,他会把自己降级成为从节点。
如果主节点的数据还没有写到从库,那么数据不能算提交,当该主节点变成从节点时,便会触发回滚,那些没写到从库的数据将会被删除,可以通过rollback子目录中的BSON文件恢复回滚的内容。
(1)使用单节点链接
只能链接到主节点,如果链接到从节点的话,会被拒绝写入操作,但是如果没有使用安全模式,因为mongo的fire and forget 特性,会把拒绝写入的异常给吃掉。
(2)使用副本集方式链接
能根据写入的情况自动进行故障转移,但是当副本集进行新的选举时,还是会出现故障,如果不使用安全模式,依旧会出现写不进去,但现实成功的情况。
分片是数据库切分的一个概念实现,这里也是简单总结为什么要使用分片以及分片的原理,操作。
当数据量过大,索引和工作数据集占用的内存就会越来越多,所以需要通过分片负载来解决这个问题
(1)分片组件
(2)分片的核心操作
分片一个集合:分片是根据一个属性的范围进行划分的,MongoDB使用所谓的分片键让每个文档在这些范围里找到自己的位置
块:是位于一个分片中的一段连续的分片键范围,可以理解为若干个块组成分片,分片组成MongoDB的全部数据
(3)拆分与迁移
块的拆分:初始化时只有一个块,达到最大块尺寸64MB或100000个文档就会触发块的拆分。把原来的范围一分为二,这样就有了两个块,每个块都有相同数量的文档。
迁移:当分片中的数据大小不一时会产生迁移的动作,比如分片A的数据比较多,会将分片A里面的一些块转移到分片B里面去。分片集群通过在分片中移动块来实现均衡,是由名为均衡器的软件进程管理的,任务是确保数据在各个分片中保持均匀分布,当集群中拥有块最多的分片与拥有块最少分片的块差大于8时,均衡器就会发起一次均衡处理。
启动两个副本集、三个配置服务器、一个mongos进程
配置分片
(1)分片查询类型
(2)索引
分片集合只允许在_id字段和分片键上添加唯一性索引,其他地方不行,因为这需要在分片间进行通信,实施起来很复杂。
当创建分片时,会根据分片键创建一个索引。
(1)分片键是不可修改的、分片键的选择非常重要
(2)低效的分片键
(3)理想的分片键
(1)部署拓扑
根据不同的数据中心划分
这里写图片描述
(2)最低要求
(3)配置的注意事项
需要估计集群大小,可使用以下命令对现有集合进行分片处理
(4)备份分片集群
备份分片时需要停止均衡器
(1)部署架构
使用64位机器、32位机器会制约mongodb的内存,使其最大值为1.5GB
(2)cpu
mongodb 只有当索引和工作集都可放入内存时,才会遇到CPU瓶颈,CPU在mongodb使用中的作用是用来检索数据,如果看到CPU使用饱和的情况,可以通过查询慢查询日志,排查是不是查询的问题导致的,如果是可以通过添加索引来解决问题
mongodb写入数据时会使用到CPU,但是mongodb写入时间一次只用到一个核,如果有频繁的写入行为,可以通过分片来解决这个问题
(3)内存
大内存是mongodb的保障,如果工作集大小超过内存,将会导致性能下降,因为这将会增加数据加载入内存的动作
(4)硬盘
mongodb默认每60s会与磁盘强制同步一次,称为后台刷新,会产生I/O操作。在重启时mongodb会将磁盘里面的数据加载至内存,高速磁盘将会减少同步的时间
(5)文件系统
使用ext4 和 xfs 文件系统
禁用最后访问时间
(6)文件描述符
linux 默认文件描述符是1024,需要大额度的提升这个额度
(7)时钟
mongodb各个节点服务器之间使用ntp服务器
(1)绑定IP
启动时使用 - -bind_ip 命令
(2)身份验证
启动时使用 - -auth 命令
(3)副本集身份认证
使用keyFile,注意keyFile文件的权限必须是600,不然会启动不起来
(1)拓扑结构
搭建副本集至少需要两个节点,其中仲裁结点不需要有自己的服务器
(2)Journaling日志
写数据时会先写入日志,而此时的数据也不是直接写入硬盘,而是写入内存
但是Journaling日志会消耗内存,所以可以在主库上面关闭,在从库上面启动
可以单独为Journaling日志使用一块固态硬盘
在插入时,可以通过驱动确保Journaling插入后再反馈,但是会非常影响性能。
logpath 选项指定日志存储地址
-vvvvv 选项(v越多,输出越详细)
db.runCommand({logrotare:1}) 开启滚动日志
(1)serverStatus
这里写图片描述
(2)top
(3)db.currentOp()
动态展示mongodb活动数据
占用当前mongodb监听端口往上1000号的端口
(1)mongomp
把数据库内容导出成BSON文件,而mongorestore能读取并还原这些文件
(2)mongorestore
把导出的BSON文件还原到数据库
(3)备份原始数据文件
可以这么做,但是,操作之前需要进行锁库处理 db.runCommand({fsync:1,lock:true})
db.$cmd.sys.unlock.findOne() 请求解锁操作,但是数据库不会立刻解锁,需要使用db.currentOp()验证。
(1)修复
mongd --repair 修复所有数据库
db.runCommand({repairDatabase:1}) 修复单个数据库
修复就是根据Jourling文件读取和重写所有数据文件并重建各个索引
(2)压紧
压紧,会重写数据文件,并重建集合的全部索引,需要停机或者在从库上面运行,如果需要在主库上面运行,需要添加force参数 保证加写锁。
(1)监控磁盘状态
(2)为提升性能检查索引和查询
总的来说,扫描尽可能少的文档。
保证没有冗余的索引,冗余的索引会占用磁盘空间、消耗更多的内存,在每次写入时还需做更多工作
(3)添加内存
dataSize 数据大小 和 indexSize 索引大小,如果两者的和大于内存,那么将会影响性能。
storageSize超过dataSize 数据大小 两倍以上,就会因磁盘碎片而影响性能,需要压缩。
⑧ 大数据分析工具哪家比较好
大数据分析工具比较好的有Python数据分析、DataV数据分析、Cloudera数据分析、MongoDBMongoDB数据分析、Talend数据分析等
1、Python数据分析
Python是一种面向对象、解释型计算机程序设计语言。Python语法简洁而清晰,阅读一个良好的Python程序就感觉像是在读英语一样。能够专注于解决问题而不是去搞明白语言本身。另外具有丰富和强大的类库,python能支持几乎所有统计分析和建模的工作。
4、MongoDBMongoDB数据分析
MongoDBMongoDB是最受欢迎的大数据数据库,因为适用于管理经常变化的数据:非结构化数据,大数据常常是非结构化数据。当下时代大数据分析是非常必要的,而MongoDBMongoDB数据分析也是做得非常好的。
5、Talend数据分析
Talend作为一家提供广泛解决方案的公司,Talend的产品围绕其集成平台而建,该平台集大数据、云、应用程序、实时数据集成、数据准备和主数据管理于一体。大数据集往往是非结构化、无组织的,因此需要某种清理或转换。当下,数据可能来自任何地方。
⑨ mongodb查询实例
类似MySQL的select * from EVI_EGZ_GEAR_DAY where quantity0=27
类似MySQL的select * from EVI_EGZ_GEAR_DAY where lastModify>"2020-07-02T16:08:45+08:00"
db.EVI_BIZ_DAYINFO.find({"ReportDay":{$gte:20200601 ,$lte: 20200630},"LoginID":"304095318","Is_Statistics":1})
操作 格式 范例 RDBMS中的类似语句
等于 {<铅让key>:<value>} db.col.find({"by":"菜鸟教程"}).pretty() where by = '菜鸟教程'
小于 {<key>:{$lt:<value>}} db.col.find({"likes":{$lt:50}}).pretty() where likes < 50
小于或等于 {<key>:{$lte:<value>}} db.col.find({"likes":{$lte:50}}).pretty() where likes <= 50
大于 {<key>:{$gt:<value>}} db.col.find({"likes":{$gt:50}}).pretty() where likes > 50
大于或等于 {<key>:{$gte:<value>}} db.col.find({"likes":{$gte:50}}).pretty() where likes >= 50
不等于 {<key>:{$ne:<value>}} db.col.find({"likes":{$ne:50}}).pretty() where likes != 50
类似MySQL的select loginId from EVI_EGZ_GEAR_DAY group by loginId
类似MySQL的select loginId,count(*) from EVI_EGZ_GEAR_DAY where loginId=100870655 group by loginId
5.db.EVI_RPT_MARKETMON_ANALYSIS.find({"reportTime":"201810","areaParentCode":"430000","machineCode":"MT0000000212","machineType":"2","nationCode":"CN","calcType":"0"},
{"areaName":1,"machineName":1,"workTime":1,"equCount":1,"workCount":1,"restCount":1,"highWorkCount":1,"avgWorkTime":1,"workRate":1,"calcType":"1"}).sort({ equCount:-1 })
db.EVI_BIZ_DAYINFO.aggregate([{
"$match": {
"ReportTime" : ISODate("2020-07-01T00:00:00.000+08:00"),
"Is_Statistics": 1,
"IsOnline": 1,
"MachineType_Code1" : "MT0000000276"// 按照一级槐桥局机型分类统计,否则查询不到数据
消岩 }
},
{
"$group" : {
_id:{
countyCode :"$County_Code",
cityCode :"$City_Code",
provinceCode :"$Province_Code",
machineType1 :"$MachineType_Code1",
machineType2 :"$MachineType_Code2",
nationCode:"$Nation_Code"
},
highWorkCount : {$sum: { $cond: [ {$gte: [ "$WorkTime",8] },
1,
0 ] }},
countWork: {
$sum: '$IsWork'
},
workTime: {
$sum: '$WorkTime'
},
equCount:{
$sum: 1
}
}
}
])
db.EVI_BIZ_DAYINFO.find({"ReportDay":20200201,"LoginID":"302060888"})
db.EVI_BIZ_DAYINFO.aggregate([{
"$match": {"LoginID":"101065868",
"ReportDay":{$gte: 20200701,$lte:20200731}
}
},
{
"$group": {
_id:{
LoginID:"$LoginID",
ReportDay:"$ReportDay"
},
},
WorkTimes:{
$sum: "$WorkTime"
},
totalDay:{
$sum: {$cond: [ { $gt: ["$WorkTime",0]}, 1, 0 ]}
}
}
},
{"$match": {WorkTimes:{$gt:0}}}
])
db.EVI_ALARM_FLEET.update({"reportTime":ISODate("2020-08-21T00:00:00.000+08:00")},{$set:{"reportTime":ISODate("2020-08-22T00:00:00.000+08:00")}},false,true)
db.EVI_ALARM_FLEET.update({"reportTime":ISODate("2020-08-21T00:00:00.000+08:00")},{$set:{"reportTime":ISODate("2020-08-22T00:00:00.000+08:00")}})
db.EVI_BIZ_DAYINFO.find({$or:[{"LoginID":"104259298"},{"LoginID":"132349918"}]})
db.configuration.find({"envType":"hxevi.test","key":{$regex:/mail/}})
相当于MySQL的select * from configuration where envType='hxevi.test' and key like '%mail%'
db.EVI_BIZ_DAYINFO.aggregate([
{
"$match": {
"ReportTime":{"$gte":ISODate("2021-01-18T00:00:00.000+08:00"),"$lte":ISODate("2021-01-24T00:00:00.000+08:00")},
"Is_Statistics": 1,
"LoginID": "101102108"
}
},
{"$sort": {"ReportTime": -1}},
{
"$group": {
"_id": "$LoginID",
"WorkTime": {
"$sum": "$WorkTime"
},
"IdleTime": {
"$sum": "$IdleTime"
},
"FuelConsume": {
"$sum": "$FuelConsume"
},
"IdleFuelConsume": {
"$sum": "$IdleFuelConsume"
},
"ReportTime": {"$first": "$ReportTime"},
"City_Code": {"$first": "$City_Code"},
"City_Name": {"$first": "$City_Name"},
"County_Code": {"$first": "$County_Code"},
"County_Name": {"$first": "$County_Name"},
"Nation_Code": {"$first": "$Nation_Code"},
"Nation_Name": {"$first": "$Nation_Name"},
"Province_Code": {"$first": "$Province_Code"},
"Province_Name": {"$first": "$Province_Name"},
"Latitude": {"$first": "$Latitude"},
"Longitude": {"$first": "$Longitude"},
"TotalIdleFC": {"$first": "$TotalIdleFC"},
"TotalIdleTime": {"$first": "$TotalIdleTime"},
"TotalWorkTime": {"$first": "$TotalWorkTime"},
"TotalFC": {"$first": "$TotalFC"},
"DataVersion": {"$addToSet": '$DataVersion'},
"Machine_Model": {"$addToSet": '$Machine_Model'},
"MachineType_Code1": {"$addToSet": '$MachineType_Code1'},
"MachineType_Code2": {"$addToSet": '$MachineType_Code2'},
"MachineType_Code3": {"$addToSet": '$MachineType_Code3'},
"MachineType_Name1": {"$addToSet": '$MachineType_Name1'},
"MachineType_Name2": {"$addToSet": '$MachineType_Name2'},
"MachineType_Name3": {"$addToSet": '$MachineType_Name3'},
"Serialno": {"$addToSet": '$Serialno'},
"Customer_Code": {"$addToSet": '$Customer_Code'},
"Customer_Name": {"$addToSet": '$Customer_Name'},
"Customer_Tel": {"$addToSet": '$Customer_Tel'},
"SaleDealer": {"$addToSet": '$SaleDealer'},
"SaleDealer_Code": {"$addToSet": '$SaleDealer_Code'},
"SvrDealer": {"$addToSet": '$SvrDealer'},
"SvrDealer_Code": {"$addToSet": '$SvrDealer_Code'},
"Register_Date": {"$addToSet": '$Register_Date'},
"sumIsOnline": {"$sum": '$IsOnline'}
}
},
{
"$project":{
"LoginID":"$_id",
"WorkTime":"$WorkTime",
"IdleTime":"$IdleTime",
"FuelConsume":"$FuelConsume",
"IdleFuelConsume":"$IdleFuelConsume",
"City_Code":"$City_Code",
"City_Name": "$City_Name",
"County_Code": "$County_Code",
"County_Name": "$County_Name",
"Nation_Code": "$Nation_Code",
"Nation_Name": "$Nation_Name",
"Province_Code": "$Province_Code",
"Province_Name": "$Province_Name",
"Latitude": "$Latitude",
"Longitude": "$Longitude",
"TotalIdleFC": "$TotalIdleFC",
"TotalIdleTime": "$TotalIdleTime",
"TotalWorkTime": "$TotalWorkTime",
"TotalFC": "$TotalFC",
"DataVersion": {"$arrayElemAt":["$DataVersion",0]},
"Machine_Model": {"$arrayElemAt":["$Machine_Model",0]},
"MachineType_Code1": {"$arrayElemAt":["$MachineType_Code1",0]},
"MachineType_Code2": {"$arrayElemAt":["$MachineType_Code2",0]},
"MachineType_Code3": {"$arrayElemAt":["$MachineType_Code3",0]},
"MachineType_Name1": {"$arrayElemAt":["$MachineType_Name1",0]},
"MachineType_Name2": {"$arrayElemAt":["$MachineType_Name2",0]},
"MachineType_Name3": {"$arrayElemAt":["$MachineType_Name3",0]},
"Serialno": {"$arrayElemAt":["$Serialno",0]},
"Customer_Code": {"$arrayElemAt":["$Customer_Code",0]},
"Customer_Name": {"$arrayElemAt":["$Customer_Name",0]},
"Customer_Tel": {"$arrayElemAt":["$Customer_Tel",0]},
"SaleDealer": {"$arrayElemAt":["$SaleDealer",0]},
"SaleDealer_Code": {"$arrayElemAt":["$SaleDealer_Code",0]},
"SvrDealer": {"$arrayElemAt":["$SvrDealer",0]},
"SvrDealer_Code": {"$arrayElemAt":["$SvrDealer_Code",0]},
"Register_Date": {"$arrayElemAt":["$Register_Date",0]},
"IsOnline": {"$cond": {
"if":{"$gt":["$sumIsOnline",0]},"then":1,
"else":0
}}
}
}],
{ allowDiskUse: true }).pretty()
⑩ 大数据分析工具有哪些
大数据分析工具有:
1、Hadoop:它是最流行的数据仓库,可以轻松存储大量数据。
2、MongoDB:它是领先的数据库软件,可以快速有效地分析数据。
3、Spark: 最可靠的实时数据处理软件,可以有效地实时处理大量数据。
4、Cassandra:最强大的数据库,可以完美地处理数据块
5、Python:一流的编程语言,可轻松执行几乎所有大数据分析操作。
不同类型的大数据分析是:
1、描述性分析:它将过去的数据汇总成人们易于阅读和理解的形式。使用此分析创建与公司收入、销售额、利润等相关的报告非常容易。除此之外,它在社交媒体指标方面也非常有益。
2、诊断分析:它首先处理确定发生问题的原因。它使用了各种技术,例如数据挖掘、机器学习等。诊断分析提供对特定问题的深入洞察。
3、预测分析:这种分析用于对未来进行预测。它通过使用数据挖掘、机器学习、数据分析等各种大数据技术来使用历史数据和当前数据。这些分析产生的数据用于不同行业的不同目的。
4、规范分析:当想要针对特定问题制定规定的解决方案时,会使用这些分析。它适用于描述性和预测性分析,以获得最准确的结果。除此之外,它还使用人工智能和机器学习来获得最佳结果。