首页 文章 精选 留言 我的

精选列表

搜索[整理],共9145篇文章
优秀的个人博客,低调大师

Spark on Yarn年度知识整理

大数据体系结构: Spark简介 Spark是整个BDAS的核心组件,是一个大数据分布式编程框架,不仅实现了MapReduce的算子map 函数和reduce函数及计算模型,还提供更为丰富的算子,如filter、join、groupByKey等。是一个用来实现快速而同用的集群计算的平台。 Spark将分布式数据抽象为弹性分布式数据集(RDD),实现了应用任务调度、RPC、序列化和压缩,并为运行在其上的上层组件提供API。其底层采用Scala这种函数式语言书写而成,并且所提供的API深度借鉴Scala函数式的编程思想,提供与Scala类似的编程接口 Spark on Yarn 从用户提交作业到作业运行结束整个运行期间的过程分析。 一、客户端进行操作 1、根据yarnConf来初始化yarnClient,并启动yarnClient 2、创建客户端Application,并获取Application的ID,进一步判断集群中的资源是否满足executor和ApplicationMaster申请的资源,如果不满足则抛出IllegalArgumentException; 3、设置资源、环境变量:其中包括了设置Application的Staging目录、准备本地资源(jar文件、log4j.properties)、设置Application其中的环境变量、创建Container启动的Context等; 4、设置Application提交的Context,包括设置应用的名字、队列、AM的申请的Container、标记该作业的类型为Spark; 5、申请Memory,并最终通过yarnClient.submitApplication向ResourceManager提交该Application。 当作业提交到YARN上之后,客户端就没事了,甚至在终端关掉那个进程也没事,因为整个作业运行在YARN集群上进行,运行的结果将会保存到HDFS或者日志中。 二、提交到YARN集群,YARN操作 1、运行ApplicationMaster的run方法; 2、设置好相关的环境变量。 3、创建amClient,并启动; 4、在Spark UI启动之前设置Spark UI的AmIpFilter; 5、在startUserClass函数专门启动了一个线程(名称为Driver的线程)来启动用户提交的Application,也就是启动了Driver。在Driver中将会初始化SparkContext; 6、等待SparkContext初始化完成,最多等待spark.yarn.applicationMaster.waitTries次数(默认为10),如果等待了的次数超过了配置的,程序将会退出;否则用SparkContext初始化yarnAllocator; 7、当SparkContext、Driver初始化完成的时候,通过amClient向ResourceManager注册ApplicationMaster 8、分配并启动Executeors。在启动Executeors之前,先要通过yarnAllocator获取到numExecutors个Container,然后在Container中启动Executeors。 那么这个Application将失败,将Application Status标明为FAILED,并将关闭SparkContext。其实,启动Executeors是通过ExecutorRunnable实现的,而ExecutorRunnable内部是启动CoarseGrainedExecutorBackend的。 9、最后,Task将在CoarseGrainedExecutorBackend里面运行,然后运行状况会通过Akka通知CoarseGrainedScheduler,直到作业运行完成。 Spark节点的概念 一、Spark驱动器是执行程序中的main()方法的进程。它执行用户编写的用来创建SparkContext(初始化)、创建RDD,以及运行RDD的转化操作和行动操作的代码。 驱动器节点driver的职责: 1、把用户程序转为任务task(driver) Spark驱动器程序负责把用户程序转化为多个物理执行单元,这些单元也被称之为任务task(详解见备注) 2、为执行器节点调度任务(executor) 有了物理计划之后,Spark驱动器在各个执行器节点进程间协调任务的调度。Spark驱动器程序会根据当前的执行器节点,把所有任务基于数据所在位置分配给合适的执行器进程。当执行任务时,执行器进程会把缓存的数据存储起来,而驱动器进程同样会跟踪这些缓存数据的位置,并利用这些位置信息来调度以后的任务,以尽量减少数据的网络传输。 (就是所谓的移动计算,而不移动数据). 二、执行器节点 作用: 1、负责运行组成Spark应用的任务,并将结果返回给驱动器进程; 2、通过自身的块管理器(block Manager)为用户程序中要求缓存的RDD提供内存式存储。RDD是直接缓存在执行器进程内的,因此任务可以在运行时充分利用缓存数据加快运算。 驱动器的职责: 所有的Spark程序都遵循同样的结构:程序从输入数据创建一系列RDD,再使用转化操作派生成新的RDD,最后使用行动操作手机或存储结果RDD,Spark程序其实是隐式地创建出了一个由操作组成的逻辑上的有向无环图DAG。当驱动器程序执行时,它会把这个逻辑图转为物理执行计划。 这样 Spark就把逻辑计划转为一系列步骤(stage),而每个步骤又由多个任务组成。这些任务会被打爆送到集群中。 Spark初始化 1、每个Spark应用都由一个驱动器程序来发起集群上的各种并行操作。驱动器程序包含应用的main函数,并且定义了集群上的分布式数据集,以及对该分布式数据集应用了相关操作。 2、驱动器程序通过一个SparkContext对象来访问spark,这个对象代表对计算集群的一个连接。(比如在spark shell启动时已经自动创建了一个SparkContext对象,是一个叫做SC的变量。(下图,查看变量sc) 3、一旦创建了sparkContext,就可以用它来创建RDD。比如调用sc.textFile()来创建一个代表文本中各行文本的RDD。(比如val linesRDD = sc.textFile(“yangsy.text”),val spark = linesRDD.filter(line =>line.contains(“spark”),spark.count()) 执行这些操作,驱动器程序一般要管理多个执行器,就是我们所说的executor节点。 4、在初始化SparkContext的同时,加载sparkConf对象来加载集群的配置,从而创建sparkContext对象。 从源码中可以看到,在启动thriftserver时,调用了spark- daemon.sh文件,该文件源码如左图,加载spark_home下的 conf中的文件。 (在执行后台代码时,需要首先创建conf对象,加载相应参数, val sparkConf = new SparkConf().setMaster("local").setAppName("cocapp").set("spark.executor.memory", "1g"), val sc: SparkContext = new SparkContext(sparkConf)) RDD工作原理: RDD(Resilient Distributed Datasets)[1],弹性分布式数据集, 是分布式内存的一个抽象概念,RDD提供了一种高度受限的共享内存模型,即RDD是只读的记录分区的集合,只能通过在其他RDD执行确定的转换操作(如map、join和group by)而创建,然而这些限制使得实现容错的开销很低。对开发者而言,RDD可以看作是Spark的一个对象,它本身运行于内存中,如读文件是一个RDD,对文件计算是一个RDD,结果集也是一个RDD ,不同的分片、 数据之间的依赖 、key-value类型的map数据都可以看做RDD。 主要分为三部分:创建RDD对象,DAG调度器创建执行计划,Task调度器分配任务并调度Worker开始运行。 SparkContext(RDD相关操作)→通过(提交作业)→(遍历RDD拆分stage→生成作业)DAGScheduler→通过(提交任务集)→任务调度管理(TaskScheduler)→通过(按照资源获取任务)→任务调度管理(TaskSetManager) Transformation返回值还是一个RDD。它使用了链式调用的设计模式,对一个RDD进行计算后,变换成另外一个RDD,然后这个RDD又可以进行另外一次转换。这个过程是分布式的 Action返回值不是一个RDD。它要么是一个Scala的普通集合,要么是一个值,要么是空,最终或返回到Driver程序,或把RDD写入到文件系统中 转换(Transformations) (如:map, filter, groupBy, join等),Transformations操作是Lazy的,也就是说从一个RDD转换生成另一个RDD的操作不是马上执行,Spark在遇到Transformations操作时只会记录需要这样的操作,并不会去执行,需要等到有Actions操作的时候才会真正启动计算过程进行计算。 操作(Actions) (如:count, collect, save等),Actions操作会返回结果或把RDD数据写到存储系统中。Actions是触发Spark启动计算的动因。 它们本质区别是:Transformation返回值还是一个RDD。它使用了链式调用的设计模式,对一个RDD进行计算后,变换成另外一个RDD,然后这个RDD又可以进行另外一次转换。这个过程是分布式的。Action返回值不是一个RDD。它要么是一个Scala的普通集合,要么是一个值,要么是空,最终或返回到Driver程序,或把RDD写入到文件系统中。关于这两个动作,在Spark开发指南中会有就进一步的详细介绍,它们是基于Spark开发的核心。这里将Spark的官方ppt中的一张图略作改造,阐明一下两种动作的区别。 从此图中可以看出shuffle操作是在DAG完成的 到taskset时都为窄依赖 RDD基础 1、Spark中的RDD就是一个不可变的分布式对象集合。每个RDD都被分为多个分区,这些分区运行在集群的不同节点上。创建RDD的方法有两种:一种是读取一个外部数据集;一种是在群东程序里分发驱动器程序中的对象集合,不如刚才的示例,读取文本文件作为一个字符串的RDD的示例。 2、创建出来后,RDD支持两种类型的操作:转化操作和行动操作 转化操作会由一个RDD生成一个新的RDD。(比如刚才的根据谓词筛选) 行动操作会对RDD计算出一个结果,并把结果返回到驱动器程序中,或把结果存储到外部存储系统(比如HDFS) 中。比如first()操作就是一个行动操作,会返回RDD的第一个元素。 注:转化操作与行动操作的区别在于Spark计算RDD的方式不同。虽然你可以在任何时候定义一个新的RDD,但Spark只会惰性计算这些RDD。它们只有第一个在一个行动操作中用到时,才会真正的计算。之所以这样设计,是因为比如刚才调用sc.textFile(...)时就把文件中的所有行都读取并存储起来,就会消耗很多存储空间,而我们马上又要筛选掉其中的很多数据。 这里还需要注意的一点是,spark会在你每次对它们进行行动操作时重新计算。如果想在多个行动操作中重用同一个RDD,那么可以使用RDD.persist()或RDD.collect()让Spark把这个RDD缓存下来。(可以是内存,也可以是磁盘) 3、Spark会使用谱系图来记录这些不同RDD之间的依赖关系,Spark需要用这些信息来按需计算每个RDD,也可以依靠谱系图在持久化的RDD丢失部分数据时用来恢复所丢失的数据。(如下图,过滤errorsRDD与warningsRDD,最终调用union()函数) RDD计算方式 RDD的宽窄依赖 窄依赖(narrow dependencies)和宽依赖(wide dependencies)。窄依赖是指父RDD的每个分区都只被子RDD的一个分区所使用。相应的,那么宽依赖就是指父RDD的分区被多个子RDD的分区所依赖。例如,map就是一种窄依赖,而join则会导致宽依赖 这种划分有两个用处。首先,窄依赖支持在一个结点上管道化执行。例如基于一对一的关系,可以在filter之后执行map。其次,窄依赖支持更高效的故障还原。因为对于窄依赖,只有丢失的父RDD的分区需要重新计算。而对于宽依赖,一个结点的故障可能导致来自所有父RDD的分区丢失,因此就需要完全重新执行。因此对于宽依赖,Spark会在持有各个父分区的结点上,将中间数据持久化来简化故障还原,就像MapReduce会持久化map的输出一样。 Spark Example 步骤1:创建RDD。上面的例子除去最后一个collect是个动作,不会创建RDD之外,前面四个转换都会创建出新的RDD。因此第一步就是创建好所有RDD(内部的五项信息)。 步骤2:创建执行计划。Spark会尽可能地管道化,并基于是否要重新组织数据来划分阶段(stage),例如本例中的groupBy()转换就会将整个执行计划划分成两阶段执行。最终会产生一个DAG(directed acyclic graph,有向无环图)作为逻辑执行计划。 步骤3:调度任务。将各阶段划分成不同的任务(task),每个任务都是数据和计算的合体。在进行下一阶段前,当前阶段的所有任务都要执行完成。因为下一阶段的第一个转换一定是重新组织数据的,所以必须等当前阶段所有结果数据都计算出来了才能继续。 假设本例中的hdfs://names下有四个文件块,那么HadoopRDD中partitions就会有四个分区对应这四个块数据,同时preferedLocations会指明这四个块的最佳位置。现在,就可以创建出四个任务,并调度到合适的集群结点上。 Spark数据分区 1、Spark的特性是对数据集在节点间的分区进行控制。在分布式系统中,通讯的代价是巨大的,控制数据分布以获得最少的网络传输可以极大地提升整体性能。Spark程序可以通过控制RDD分区方式来减少通讯的开销。 2、Spark中所有的键值对RDD都可以进行分区。确保同一组的键出现在同一个节点上。比如,使用哈希分区将一个RDD分成了100个分区,此时键的哈希值对100取模的结果相同的记录会被放在一个节点上。 (可使用partitionBy(new HashPartitioner(100)).persist()来构造100个分区) 3、Spark中的许多操作都引入了将数据根据键跨界点进行混洗的过程。(比如:join(),leftOuterJoin(),groupByKey(),reducebyKey()等)对于像reduceByKey()这样只作用于单个RDD的操作,运行在未分区的RDD上的时候会导致每个键的所有对应值都在每台机器上进行本地计算。 SparkSQL 的shuffle过程 Spark SQL的核心是把已有的RDD,带上Schema信息,然后注册成类似sql里的”Table”,对其进行sql查询。这里面主要分两部分,一是生成SchemaRD,二是执行查询。 如果是spark-hive项目,那么读取metadata信息作为Schema、读取hdfs上数据的过程交给Hive完成,然后根据这俩部分生成SchemaRDD,在HiveContext下进行hql()查询。 Spark SQL结构化数据 1、首先说一下Apache Hive,Hive可以在HDFS内或者在其他存储系统上存储多种格式的表。SparkSQL可以读取Hive支持的任何表。要把Spark SQL连接已有的hive上,需要提供Hive的配置文件。hive-site.xml文件复制到spark的conf文件夹下。再创建出HiveContext对象(sparksql的入口),然后就可以使用HQL来对表进行查询,并以由行足证的RDD的形式拿到返回的数据。 2、创建Hivecontext并查询数据 import org.apache.spark.sql.hive.HiveContext val hiveCtx = new org.apache.spark.sql.hive.HiveContext(sc) val rows = hiveCtx.sql(“SELECT name,age FROM users”) val fitstRow – rows.first() println(fitstRow.getSgtring(0)) //字段0是name字段 3、通过jdbc连接外部数据源 更新与加载 Class.forName("com.mysql.jdbc.Driver") val conn = DriverManager.getConnection(mySQLUrl) val stat1 = conn.createStatement() stat1.execute("UPDATE CI_LABEL_INFO set DATA_STATUS_ID = 2 , DATA_DATE = '" + dataDate +"' where LABEL_ID in ("+allCreatedLabels.mkString(",")+")" ) stat1.close() //加载外部数据源数据到内存 val DIM_COC_INDEX_MODEL_TABLE_CONF = sqlContext.jdbc(mySQLUrl,"DIM_COC_INDEX_MODEL_TABLE_CONF").cache() val targets = DIM_COC_INDEX_MODEL_TABLE_CONF.filter("TABLE_DATA_CYCLE ="+TABLE_DATA_CYCLE).collect SparkSQL解析 首先说下传统数据库的解析,传统数据库的解析过程是按Rusult、Data Source、Operation的次序来解析的。传统数据库先将读入的SQL语句进行解析,分辨出SQL语句中哪些词是关键字(如select,from,where),哪些是表达式,哪些是Projection,哪些是Data Source等等。进一步判断SQL语句是否规范,不规范就报错,规范则按照下一步过程绑定(Bind)。过程绑定是将SQL语句和数据库的数据字典(列,表,视图等)进行绑定,如果相关的Projection、Data Source等都存在,就表示这个SQL语句是可以执行的。在执行过程中,有时候甚至不需要读取物理表就可以返回结果,比如重新运行刚运行过的SQL语句,直接从数据库的缓冲池中获取返回结果。 在数据库解析的过程中SQL语句时,将会把SQL语句转化成一个树形结构来进行处理,会形成一个或含有多个节点(TreeNode)的Tree,然后再后续的处理政对该Tree进行一系列的操作。 Spark SQL对SQL语句的处理和关系数据库对SQL语句的解析采用了类似的方法,首先会将SQL语句进行解析,然后形成一个Tree,后续如绑定、优化等处理过程都是对Tree的操作,而操作方法是采用Rule,通过模式匹配,对不同类型的节点采用不同的操作。SparkSQL有两个分支,sqlContext和hiveContext。sqlContext现在只支持SQL语法解析器(Catalyst),hiveContext支持SQL语法和HiveContext语法解析器。 SparkStreaming简介 SparkStreaming是一个批处理的流式计算框架,适合处理实时数据与历史数据混合处理的场景(比如,你用streaming将实时数据读入处理,再使用sparkSQL提取历史数据,与之关联处理)。Spark Streaming将数据流以时间片为单位分割形成RDD,使用RDD操作处理每一块数据,没块数据都会生成一个spark JOB进行处理,最终以批处理方式处理每个时间片的数据。(秒级)

优秀的个人博客,低调大师

MaxCompute问答整理之12月

问题一、MaxCompute内建日期函数,DATEPART函数命令格式为 bigint datepart(datetime date, string datepart)用于提取日期date中指定的时间单位datepart的值。DATETIME类型。如果输入为STRING类型会隐式转换为DATETIME类型后参与运算,其它类型抛异常。但是客户在使用函数的时候没有实现STRING类型隐式转换为DATETIME。报错信息:FAILED:ODPS-0130121:[1,50] Invalid type STRING of argument 1 for function datepart, expect DATETIME。如何解决?打开新类型odps.sql.type.system.odps2=true时某些隐式类型转换会被禁用,包括STR

优秀的个人博客,低调大师

部分常用分词工具使用整理

以下分词工具均能在Python环境中直接调用(排名不分先后)。1、jieba(结巴分词) 免费使用2、HanLP(汉语言处理包) 免费使用3、SnowNLP(中文的类库) 免费使用4、FoolNLTK(中文处理工具包) 免费使用5、Jiagu(甲骨NLP) 免费使用6、pyltp(哈工大语言云) 商用需要付费7、THULAC(清华中文词法分析工具包) 商用需要付费8、NLPIR(汉语分词系统) 付费使用 1、jieba(结巴分词)“结巴”中文分词:做最好的 Python 中文分词组件。项目Github地址:jieba安装:pip install jieba使用:import jiebajieba.initialize()text = '化妆和服装'words = jieba.cut(text)words = list(words)print(words) 2、HanLP(汉语言处理包)HanLP是一系列模型与算法组成的NLP工具包,由大快搜索主导并完全开源,目标是普及自然语言处理在生产环境中的应用。HanLP具备功能完善、性能高效、架构清晰、语料时新、可自定义的特点。项目Github地址:pyhanlp 安装:pip install pyhanlp使用:import pyhanlptext = '化妆和服装'words = []for term in pyhanlp.HanLP.segment(text): words.append(term.word) print(words) 3、SnowNLP(中文的类库)SnowNLP是一个python写的类库,可以方便的处理中文文本内容,是受到了TextBlob的启发而写的,由于现在大部分的自然语言处理库基本都是针对英文的,于是写了一个方便处理中文的类库,并且和TextBlob不同的是,这里没有用NLTK,所有的算法都是自己实现的,并且自带了一些训练好的字典。项目Github地址:snownlp安装:pip install snownlp使用:import snownlptext = '化妆和服装'words = snownlp.SnowNLP(text).wordsprint(words) 4、FoolNLTK(中文处理工具包)可能不是最快的开源中文分词,但很可能是最准的开源中文分词。项目Github地址:FoolNLTK 安装:pip install foolnltk使用:import fooltext = '化妆和服装'words = fool.cut(text)print(words) 5、Jiagu(甲骨NLP)基于BiLSTM模型,使用大规模语料训练而成。将提供中文分词、词性标注、命名实体识别、关键词抽取、文本摘要、新词发现等常用自然语言处理功能。参考了各大工具优缺点制作,将Jiagu回馈给大家。项目Github地址:jiagu安装:pip3 install jiagu使用:import jiagujiagu.init()text = '化妆和服装'words = jiagu.seg(text)print(words) 6、pyltp(哈工大语言云)pyltp 是 LTP 的 Python 封装,提供了分词,词性标注,命名实体识别,依存句法分析,语义角色标注的功能。项目Github地址:pyltp,3.4模型下载链接:网盘安装:pip install pyltp使用:import pyltpsegmentor = pyltp.Segmentor()segmentor.load('model/ltp_data_v3.4.0/cws.model') # 模型放置的路径text = '化妆和服装'words = segmentor.segment(text)words = list(words)print(words) 7、THULAC(清华中文词法分析工具包)THULAC(THU Lexical Analyzer for Chinese)由清华大学自然语言处理与社会人文计算实验室研制推出的一套中文词法分析工具包,具有中文分词和词性标注功能。项目Github地址:THULAC-Python安装:pip install thulac使用:import thulacthu = thulac.thulac(seg_only=True)text = '化妆和服装'words = thu.cut(text, text=True).split()print(words) NLPIR(汉语分词系统)主要功能包括中文分词;英文分词;词性标注;命名实体识别;新词识别;关键词提取;支持用户专业词典与微博分析。NLPIR系统支持多种编码、多种操作系统、多种开发语言与平台。项目Github地址:pynlpir安装:pip install pynlpir下载证书覆盖到安装目录,NLPIR.user 例如安装目录:/usr/lib64/python3.4/site-packages/pynlpir/Data 使用:import pynlpirpynlpir.open()text = '化妆和服装'words = pynlpir.segment(text, pos_tagging=False)print(words)pynlpir.close()

优秀的个人博客,低调大师

流数据同步DataConnector测试整理

概述 DataHub DataConnector是把DataHub服务中的流式数据同步到其他云产品中的功能,目前支持将Topic中的数据实时/准实时同步到MaxCompute(ODPS)、OSS、ElasticSearch、RDS Mysql、ADS、TableStore中。用户只需要向DataHub中写入一次数据,并在DataHub服务中配置好同步功能,便可以在各个云产品中使用这份数据。本文主要将各类数据源配置的状况做个总结,算是对官方文档的补充。 注意 目前所有DataConnector均仅支持同一Region的云服务之间同步数据,不支持同步数据到跨Region的服务。 DataConnector所配置的目标服务Endpoint需要填写相应的内网域名(经典网络),不支持使用公网域名同步。 数据同步目前仅支持at least once语义

优秀的个人博客,低调大师

最全大数据学习资源整理

关系数据库管理系统(RDBMS) MySQL:世界最流行的开源数据库; PostgreSQL:世界最先进的开源数据库; Oracle 数据库:对象-关系型数据库管理系统。 框架 Apache Hadoop:分布式处理架构,结合了 MapReduce(并行处理)、YARN(作业调度)和HDFS(分布式文件系统); Tigon:高吞吐量实时流处理框架。 分布式编程 AddThis Hydra :最初在AddThis上开发的分布式数据处理和存储系统; AMPLab SIMR:用在Hadoop MapReduce v1上运行Spark; Apache Beam:为统一的模型以及一套用于定义和执行数据处理工作流的特定SDK语言; Apache Crunch:一个简单的Java API,用于执行在普通的MapReduce实现时比较单调的连接、数据聚合等任务; Apache DataFu:由LinkedIn开发的针对Hadoop and 和Pig的用户定义的函数集合; Apache Flink:具有高性能的执行时间和自动程序优化; Apache Gora:内存中的数据模型和持久性框架; Apache Hama:BSP(整体同步并行)计算框架; Apache MapReduce :在集群上使用并行、分布式算法处理大数据集的编程模型; Apache Pig :Hadoop中,用于处理数据分析程序的高级查询语言; Apache REEF :用来简化和统一低层大数据系统的保留性评估执行框架; Apache S4 :S4中流处理与实现的框架; Apache Spark :内存集群计算框架; Apache Spark Streaming :流处理框架,同时是Spark的一部分; Apache Storm :Twitter流处理框架,也可用于YARN; Apache Samza :基于Kafka和YARN的流处理框架; Apache Tez :基于YARN,用于执行任务中的复杂DAG(有向无环图); Apache Twill :基于YARN的抽象概念,用于减少开发分布式应用程序的复杂度; Cascalog:数据处理和查询库; Cheetah :在MapReduce之上的高性能、自定义数据仓库; Concurrent Cascading :在Hadoop上的数据管理/分析框架; Damballa Parkour :用于Clojure的MapReduce库; Datasalt Pangool :可选择的MapReduce范例; DataTorrent StrAM :为实时引擎,用于以尽可能畅通的方式、最小的开支和对性能最小的影响,实现分布式、异步、实时的内存大数据计算; Facebook Corona :为Hadoop做优化处理,从而消除单点故障; Facebook Peregrine :MapReduce框架; Facebook Scuba :分布式内存数据存储; Google Dataflow :创建数据管道,以帮助其分析框架; Netflix PigPen :为MapReduce,用于编译成Apache Pig; Nokia Disco :由Nokia开发的MapReduc获取、转换和分析数据; Google MapReduce :MapReduce框架; Google MillWheel :容错流处理框架; JAQL :用于处理结构化、半结构化和非结构化数据工作的声明性编程语言; Kite :为一组库、工具、实例和文档集,用于使在Hadoop的生态系统上建立系统更加容易; Metamarkets Druid :用于大数据集的实时e框架; Onyx :分布式云计算; Pinterest Pinlater :异步任务执行系统; Pydoop :用于Hadoop的Python MapReduce和HDFS API; Rackerlabs Blueflood :多租户分布式测度处理系统; Stratosphere :通用集群计算框架; Streamdrill :用于计算基于不同时间窗口的事件流的活动,并找到最活跃的一个; Tuktu :易于使用的用于分批处理和流计算的平台,通过Scala、 Akka和Play所建; Twitter Scalding:基于Cascading,用于Map Reduce工作的Scala库; Twitter Summingbird :在Twitter上使用Scalding和Storm串流MapReduce; Twitter TSAR :Twitter上的时间序列聚合器。 分布式文件系统 Apache HDFS:在多台机器上存储大型文件的方式; BeeGFS:以前是FhGFS,并行分布式文件系统; Ceph Filesystem:设计的软件存储平台; Disco DDFS:分布式文件系统; Facebook Haystack:对象存储系统; Google Colossus:分布式文件系统(GFS2); Google GFS:分布式文件系统; Google Megastore:可扩展的、高度可用的存储; GridGain:兼容GGFS、Hadoop内存的文件系统; Lustre file system:高性能分布式文件系统; Quantcast File System QFS:开源分布式文件系统; Red Hat GlusterFS:向外扩展的附网存储(Network-attached Storage)文件系统; Seaweed-FS:简单的、高度可扩展的分布式文件系统; Alluxio:以可靠的存储速率在跨集群框架上文件共享; Tahoe-LAFS:分布式云存储系统; 文件数据模型 Actian Versant:商用的面向对象数据库管理系统; Crate Data:是一个开源的大规模可扩展的数据存储,需要零管理模式; Facebook Apollo:Facebook的Paxos算法,类似于NoSQL数据库; jumboDB:基于Hadoop的面向文档的数据存储; LinkedIn Espresso:可横向扩展的面向文档的NoSQL数据存储; MarkLogic:模式不可知的企业版NoSQL数据库技术; MongoDB:面向文档的数据库系统; RavenDB:一个事务性的,开源文档数据库; RethinkDB:支持连接查询和群组依据等查询的文档型数据库。 Key Map 数据模型 注意:业内存在一些术语混乱,有两个不同的东西都叫做“列式数据库”。这里列出的有一些是围绕“key-map”数据模型而建的分布式、持续型数据库,其中所有的数据都有(可能综合了)键,并与映射中的键-值对相关联。在一些系统中,多个这样的值映射可以与键相关联,并且这些映射被称为“列族”(具有映射值的键被称为“列”)。 另一组也可称为“列式数据库”的技术因其存储数据的方式而有别于前一组,它在磁盘上或在存储器中——而不是以传统方式,即所有既定键的键值都相邻着、逐行存储。这些系统也彼此相邻来存储所有列值,但是要得到给定列的所有值却不需要以前那么繁复的工作。 前一组在这里被称为“key map数据模型”,这两者和Key-value 数据模型之间的界限是相当模糊的。后者对数据模型有更多的存储格式,可在列式数据库中列出。若想了解更多关于这两种模型的区分,可阅读Daniel Abadi的博客:Distinguishing two major types of Column Stores。 Apache Accumulo:内置在Hadoop上的分布式键/值存储; Apache Cassandra:由BigTable授权,面向列的分布式数据存储; Apache HBase:由BigTable授权,面向列的分布式数据存储; Facebook HydraBase:Facebook所开发的HBase的衍化品; Google BigTable:面向列的分布式数据存储; Google Cloud Datastore:为完全管理型的无模式数据库,用于存储在BigTable上非关系型数据; Hypertable:由BigTable授权,面向列的分布式数据存储; InfiniDB:通过MySQL的接口访问,并使用大规模并行处理进行并行查询; Tephra:用于HBase处理; Twitter Manhattan:Twitter的实时、多租户分布式数据库。 键-值数据模型 Aerospike:支持NoSQL的闪存优化,数据存储在内存。开源,“’C'(不是Java或Erlang)中的服务器代码可精确地调整从而避免上下文切换和内存拷贝”。 Amazon DynamoDB:分布式键/值存储,Dynamo论文的实现; Edis:为替代Redis的协议兼容的服务器; ElephantDB:专门研究Hadoop中数据导出的分布式数据库; EventStore:分布式时间序列数据库; GridDB:适用于存储在时间序列中的传感器数据; LinkedIn Krati:简单的持久性数据存储,拥有低延迟和高吞吐量; Linkedin Voldemort:分布式键/值存储系统; Oracle NoSQL Database:Oracle公司开发的分布式键值数据库; Redis:内存中的键值数据存储; Riak:分散式数据存储; Storehaus:Twitter开发的异步键值存储的库; Tarantool:一个高效的NoSQL数据库和Lua应用服务器; TiKV:由Google Spanner和HBase授权,Rust提供技术支持的分布式键值数据库; TreodeDB:可复制、共享的键-值存储,能提供多行原子写入。 图形数据模型 Apache Giraph:基于Hadoop的Pregel实现; Apache Spark Bagel:可实现Pregel,为Spark的一部分; ArangoDB:多层模型分布式数据库; DGraph:一个可扩展的、分布式、低时延、高吞吐量的图形数据库,旨在为Google生产水平规模和吞吐量提供足够的低延迟,用于TB级的结构化数据的实时用户查询; Facebook TAO:TAO是facebook广泛用来存储和服务于社交图形的分布式数据存储; GCHQ Gaffer:GCHQ中的Gaffer是一个易于存储大规模图形的框架,其中节点和边缘都有统计数据; Google Cayley:开源图形数据库; Google Pregel :图形处理框架; GraphLab PowerGraph:核心C ++ GraphLab API和建立在GraphLab API之上的高性能机器学习和数据挖掘工具包的集合; GraphX:Spark中的弹性分布式图形系统; Gremlin:图形追踪语言; Infovore:以RDF为中心的Map / Reduce框架; Intel GraphBuilder:在Hadoop上构建大规模图形的工具; MapGraph:用于在GPU上大规模并行图形处理; Neo4j:完全用Java写入的图形数据库; OrientDB:文档和图形数据库; Phoebus:大型图形处理框架; Titan:建于Cassandra的分布式图形数据库; Twitter FlockDB:分布式图形数据库。 NewSQL数据库 Actian Ingres:由商业支持,开源的SQL关系数据库管理系统; Amazon RedShift:基于PostgreSQL的数据仓库服务; BayesDB:面向统计数值的SQL数据库; CitusDB:通过分区和复制横向扩展PostgreSQL; Cockroach:可扩展、地址可复制、交易型的数据库; Datomic:旨在产生可扩展、灵活的智能应用的分布式数据库; FoundationDB:由F1授意的分布式数据库; Google F1:建立在Spanner上的分布式SQL数据库; Google Spanner:全球性的分布式半关系型数据库; H-Store:是一个实验性主存并行数据库管理系统,用于联机事务处理(OLTP)应用的优化; Haeinsa:基于Percolator,HBase的线性可扩展多行多表交易库; HandlerSocket:MySQL/MariaDB的NoSQL插件; InfiniSQL:无限可扩展的RDBMS; MemSQL:内存中的SQL数据库,其中有优化的闪存列存储; NuoDB:SQL / ACID兼容的分布式数据库; Oracle TimesTen in-Memory Database:内存中具有持久性和可恢复性的关系型数据库管理系统; Pivotal GemFire XD:内存中低延时的分布式SQL数据存储,可为内存列表数据提供SQL接口,在HDFS中较持久化; SAP HANA:是在内存中面向列的关系型数据库管理系统; SenseiDB:分布式实时半结构化的数据库; Sky:用于行为数据的灵活、高性能分析的数据库; SymmetricDS:用于文件和数据库同步的开源软件; Map-D:为GPU内存数据库,也为大数据分析和可视化平台; TiDB:TiDB是分布式SQL数据库,基于谷歌F1的设计灵感; VoltDB:自称为最快的内存数据库。 列式数据库 注意:请在键-值数据模型 阅读相关注释。 Columnar Storage:解释什么是列存储以及何时会需要用到它; Actian Vector:面向列的分析型数据库; C-Store:面向列的DBMS; MonetDB:列存储数据库; Parquet:Hadoop的列存储格式; Pivotal Greenplum:专门设计的、专用的分析数据仓库,类似于传统的基于行的工具,提供了一个列式工具; Vertica:用来管理大规模、快速增长的大量数据,当用于数据仓库时,能够提供非常快的查询性能; Google BigQuery :谷歌的云产品,由其在Dremel的创始工作提供支持; Amazon Redshift :亚马逊的云产品,它也是基于柱状数据存储后端。 时间序列数据库 Cube:使用MongoDB来存储时间序列数据; Axibase Time Series Database:在HBase之上的分布式时间序列数据库,它包括内置的Rule Engine、数据预测和可视化; Heroic:基于Cassandra和Elasticsearch的可扩展的时间序列数据库; InfluxDB:分布式时间序列数据库; Kairosdb:类似于OpenTSDB但会考虑到Cassandra; OpenTSDB:在HBase上的分布式时间序列数据库; Prometheus:一种时间序列数据库和服务监测系统; Newts:一种基于Apache Cassandra的时间序列数据库。 类SQL处理大数据学习扣qun:74零零加4一3八yi Actian SQL for Hadoop:高性能交互式的SQL,可访问所有的Hadoop数据; Apache Drill:由Dremel授意的交互式分析框架; Apache HCatalog:Hadoop的表格和存储管理层; Apache Hive:Hadoop的类SQL数据仓库系统; Apache Optiq:一种框架,可允许高效的查询翻译,其中包括异构性及联合性数据的查询; Apache Phoenix:Apache Phoenix 是 HBase 的 SQL 驱动; Cloudera Impala:由Dremel授意的交互式分析框架; Concurrent Lingual:Cascading中的类SQL查询语言; Datasalt Splout SQL:用于大数据集的完整的SQL查询工具; Facebook PrestoDB:分布式SQL查询工具; Google BigQuery:交互式分析框架,Dremel的实现; Pivotal HAWQ:Hadoop的类SQL的数据仓库系统; RainstorDB:用于存储大规模PB级结构化和半结构化数据的数据库; Spark Catalyst:用于Spark和Shark的查询优化框架; SparkSQL:使用Spark操作结构化数据; Splice Machine:一个全功能的Hadoop上的SQL RDBMS,并带有ACID事务; Stinger:用于Hive的交互式查询; Tajo:Hadoop的分布式数据仓库系统; Trafodion:为企业级的SQL-on-HBase针对大数据的事务或业务工作负载的解决方案。 数据摄取 Amazon Kinesis:大规模数据流的实时处理; Apache Chukwa:数据采集系统; Apache Flume:管理大量日志数据的服务; Apache Kafka:分布式发布-订阅消息系统; Apache Sqoop:在Hadoop和结构化的数据存储区之间传送数据的工具; Cloudera Morphlines:帮助 Solr、HBase和HDFS完成ETL的框架; Facebook Scribe:流日志数据聚合器; Fluentd:采集事件和日志的工具; Google Photon:实时连接多个数据流的分布式计算机系统,具有高可扩展性和低延迟性; Heka:开源流处理软件系统; HIHO:用Hadoop连接不同数据源的框架; Kestrel:分布式消息队列系统; LinkedIn Databus:对数据库更改捕获的事件流; LinkedIn Kamikaze:压缩已分类整型数组的程序包; LinkedIn White Elephant:日志聚合器和仪表板; Logstash:用于管理事件和日志的工具; Netflix Suro:像基于Chukwa 的Storm和Samza一样的日志聚合器; Pinterest Secor:是实现Kafka日志持久性的服务; Linkedin Gobblin:LinkedIn的通用数据摄取框架; Skizze:是一种数据存储略图,使用概率性数据结构来处理计数、略图等相关的问题; StreamSets Data Collector:连续大数据采集的基础设施,可简单地使用IDE。 服务编程 Akka Toolkit:JVM中分布性、容错事件驱动应用程序的运行时间; Apache Avro:数据序列化系统; Apache Curator:Apache ZooKeeper的Java库; Apache Karaf:在任何OSGi框架之上运行的OSGi运行时间; Apache Thrift:构建二进制协议的框架; Apache Zookeeper:流程管理集中式服务; Google Chubby:一种松耦合分布式系统锁服务; Linkedin Norbert:集群管理器; OpenMPI:消息传递框架; Serf:服务发现和协调的分散化解决方案; Spotify Luigi:一种构建批处理作业的复杂管道的Python包,它能够处理依赖性解析、工作流管理、可视化、故障处理、命令行一体化等等问题; Spring XD:数据摄取、实时分析、批量处理和数据导出的分布式、可扩展系统; Twitter Elephant Bird:LZO压缩数据的工作库; Twitter Finagle:JVM的异步网络堆栈。 调度 Apache Aurora:在Apache Mesos之上运行的服务调度程序; Apache Falcon:数据管理框架; Apache Oozie:工作流作业调度程序; Chronos:分布式容错调度; Linkedin Azkaban:批处理工作流作业调度; Schedoscope:Hadoop作业敏捷调度的Scala DSL; Sparrow:调度平台; Airflow:一个以编程方式编写、调度和监控工作流的平台。 机器学习 Apache Mahout:Hadoop的机器学习库; brain:JavaScript中的神经网络; Cloudera Oryx:实时大规模机器学习; Concurrent Pattern:Cascading的机器学习库; convnetjs:Javascript中的机器学习,在浏览器中训练卷积神经网络(或普通网络); Decider:Ruby中灵活、可扩展的机器学习; ENCOG:支持多种先进算法的机器学习框架,同时支持类的标准化和处理数据; etcML:机器学习文本分类; Etsy Conjecture:Scalding中可扩展的机器学习; Google Sibyl:Google中的大规模机器学习系统; GraphLab Create:Python的机器学习平台,包括ML工具包、数据工程和部署工具的广泛集合; H2O:Hadoop统计性的机器学习和数学运行时间; MLbase:用于BDAS堆栈的分布式机器学习库; MLPNeuralNet:针对iOS和Mac OS X的快速多层感知神经网络库; MonkeyLearn:使文本挖掘更为容易,从文本中提取分类数据; nupic:智能计算的Numenta平台,它是一个启发大脑的机器智力平台,基于皮质学习算法的精准的生物神经网络; PredictionIO:建于Hadoop、Mahout和Cascading上的机器学习服务器; SAMOA:分布式流媒体机器学习框架; scikit-learn:scikit-learn为Python中的机器学习; Spark MLlib:Spark中一些常用的机器学习(ML)功能的实现; Vowpal Wabbit:微软和雅虎发起的学习系统; WEKA:机器学习软件套件; BidMach:CPU和加速GPU的机器学习库。 基准测试 Apache Hadoop Benchmarking:测试Hadoop性能的微基准; Berkeley SWIM Benchmark:现实大数据工作负载基准测试; Intel HiBench:Hadoop基准测试套件; PUMA Benchmarking:MapReduce应用的基准测试套件; Yahoo Gridmix3:雅虎工程师团队的Hadoop集群基准测试。 安全性 Apache Knox Gateway:Hadoop集群安全访问的单点; Apache Sentry:存储在Hadoop的数据安全模块。 系统部署 Apache Ambari:Hadoop管理的运作框架; Apache Bigtop:Hadoop生态系统的部署框架; Apache Helix:集群管理框架; Apache Mesos:集群管理器; Apache Slider:一种YARN应用,用来部署YARN中现有的分布式应用程序; Apache Whirr:运行云服务的库集; Apache YARN:集群管理器; Brooklyn:用于简化应用程序部署和管理的库; Buildoop:基于Groovy语言,和Apache BigTop类似; Cloudera HUE:和Hadoop进行交互的Web应用程序; Facebook Prism:多数据中心复制系统; Google Borg:作业调度和监控系统; Google Omega:作业调度和监控系统; Hortonworks HOYA:可在YARN上部署HBase集群的应用; Marathon:用于长期运行服务的Mesos框架。 应用程序大数据学习扣qun:74零零加4一3八yi Adobe spindle:使用Scala、Spark和Parquet处理的下一代web分析; Apache Kiji:基于HBase,实时采集和分析数据的框架; Apache Nutch:开源网络爬虫; Apache OODT:用于NASA科学档案中数据的捕获、处理和共享; Apache Tika:内容分析工具包; Argus:时间序列监测和报警平台; Countly:基于Node.js和MongoDB,开源的手机和网络分析平台; Domino:运行、规划、共享和部署模型——没有任何基础设施; Eclipse BIRT:基于Eclipse的报告系统; Eventhub:开源的事件分析平台; Hermes:建于Kafka上的异步消息代理; HIPI Library:在Hadoop’s MapReduce上执行图像处理任务的API; Hunk:Hadoop的Splunk分析; Imhotep:大规模分析平台; MADlib:RDBMS的用于数据分析的数据处理库; Kylin:来自eBay的开源分布式分析工具; PivotalR:Pivotal HD / HAWQ和PostgreSQL中的R; Qubole:为自动缩放Hadoop集群,内置的数据连接器; Sense:用于数据科学和大数据分析的云平台; SnappyData:用于实时运营分析的分布式内存数据存储,提供建立在Spark单一集成集群中的数据流分析、OLTP(联机事务处理)和OLAP(联机分析处理); Snowplow:企业级网络和事件分析,由Hadoop、Kinesis、Redshift 和Postgres提供技术支持; SparkR:Spark的R前端; Splunk:用于机器生成的数据的分析; Sumo Logic:基于云的分析仪,用于分析机器生成的数据; Talend:用于YARN、Hadoop、HBASE、Hive、HCatalog和Pig的统一开源环境; Warp:利用大数据(OS X app)的实例查询工具。 搜索引擎与框架 Apache Lucene:搜索引擎库; Apache Solr:用于Apache Lucene的搜索平台; ElasticSearch:基于Apache Lucene的搜索和分析引擎; Enigma.io:为免费增值的健壮性web应用,用于探索、筛选、分析、搜索和导出来自网络的大规模数据集; Facebook Unicorn:社交图形搜索平台; Google Caffeine:连续索引系统; Google Percolator:连续索引系统; TeraGoogle:大型搜索索引; HBase Coprocessor:为Percolator的实现,HBase的一部分; Lily HBase Indexer:快速、轻松地搜索存储在HBase的任何内容; LinkedIn Bobo:完全由Java编写的分面搜索的实现,为Apache Lucene的延伸; LinkedIn Cleo:为一个一个灵活的软件库,使得局部、无序、实时预输入的搜索实现了快速发展; LinkedIn Galene:LinkedIn搜索架构; LinkedIn Zoie:是用Java编写的实时搜索/索引系统; Sphinx Search Server:全文搜索引擎 MySQL的分支和演化 Amazon RDS:亚马逊云的MySQL数据库; Drizzle:MySQL的6.0的演化; Google Cloud SQL:谷歌云的MySQL数据库; MariaDB:MySQL的增强版嵌入式替代品; MySQL Cluster:使用NDB集群存储引擎的MySQL实现; Percona Server:MySQL的增强版嵌入式替代品; ProxySQL:MySQL的高性能代理; TokuDB:用于MySQL和 MariaDB的存储引擎; WebScaleSQL:运行MySQL时面临类似挑战的几家公司,它们的工程师之间的合作。 PostgreSQL的分支和演化 Yahoo Everest – multi-peta-byte database / MPP derived by PostgreSQL. HadoopDB:MapReduce和DBMS的混合体; IBM Netezza:高性能数据仓库设备; Postgres-XL:基于PostgreSQL,可扩展的开源数据库集群; RecDB:完全建立在PostgreSQL内部的开源推荐引擎; Stado:开源MPP数据库系统,只针对数据仓库和数据集市的应用程序; Yahoo Everest:PostgreSQL可以推导多字节P比特数据库/MPP。 Memcached的分支和演化 Facebook McDipper:闪存的键/值缓存; Facebook Memcached:Memcache的分支; Twemproxy:Memcached和Redis的快速、轻型代理; Twitter Fatcache:闪存的键/值缓存; Twitter Twemcache:Memcache的分支。 嵌入式数据库 Actian PSQL:Pervasive Software公司开发的ACID兼容的DBMS,在应用程序中嵌入了优化; BerkeleyDB:为键/值数据提供一个高性能的嵌入式数据库的一个软件库; HanoiDB:Erlang LSM BTree存储; LevelDB:谷歌写的一个快速键-值存储库,它提供了从字符串键到字符串值的有序映射; LMDB:Symas开发的超快、超紧凑的键-值嵌入的式数据存储; RocksDB:基于性LevelDB,用于快速存储的嵌入式持续性键-值存储。 商业智能 BIME Analytics:商业智能云平台; Chartio:精益业务智能平台,用于可视化和探索数据; datapine:基于云的自助服务商业智能工具; Jaspersoft:功能强大的商业智能套件; Jedox Palo:定制的商业智能平台; Microsoft:商业智能软件和平台; Microstrategy:商业智能、移动智能和网络应用软件平台; Pentaho:商业智能平台; Qlik:商业智能和分析平台; Saiku:开源的分析平台; SpagoBI:开源商业智能平台; Tableau:商业智能平台; Zoomdata:大数据分析; Jethrodata:交互式大数据分析。 数据可视化 Airpal:用于PrestoDB的网页UI; Arbor:利用网络工作者和jQuery的图形可视化库; Banana:对存储在Kibana中Solr. Port的日志和时戳数据进行可视化; Bokeh:一个功能强大的Python交互式可视化库,它针对要展示的现代web浏览器,旨在为D3.js风格的新奇的图形提供优雅简洁的设计,同时在大规模数据或流数据集中,通过高性能交互性来表达这种能力; C3:基于D3可重复使用的图表库; CartoDB:开源或免费增值的虚拟主机,用于带有强大的前端编辑功能和API的地理空间数据库; chartd:只带Img标签的反应灵敏、兼容Retina的图表; Chart.js:开源的HTML5图表可视化效果; Chartist.js:另一个开源HTML5图表可视化效果; Crossfilter:JavaScript库,用于在浏览器中探索多元大数据集,用Dc.js和D3.js.效果很好; Cubism:用于时间序列可视化的JavaScript库; Cytoscape:用于可视化复杂网络的JavaScript库; DC.js:维度图表,和Crossfilter一起使用,通过D3.js呈现出来,它比较擅长连接图表/附加的元数据,从而徘徊在D3的事件附近; D3:操作文件的JavaScript库; D3.compose:从可重复使用的图表和组件构成复杂的、数据驱动的可视化; D3Plus:一组相当强大的可重用的图表,还有D3.js的样式; Echarts:百度企业场景图表; Envisionjs:动态HTML5可视化; FnordMetric:写SQL查询,返回SVG图表,而不是表; Freeboard:针对IOT和其他Web混搭的开源实时仪表盘构建; Gephi:屡获殊荣的开源平台,可视化和操纵大型图形和网络连接,有点像Photoshop,但是针对于图表,适用于Windows和Mac OS X; Google Charts:简单的图表API; Grafana:石墨仪表板前端、编辑器和图形组合器; Graphite:可扩展的实时图表; Highcharts:简单而灵活的图表API; IPython:为交互式计算提供丰富的架构; Kibana:可视化日志和时间标记数据; Matplotlib:Python绘图; Metricsgraphic.js:建立在D3之上的库,针对时间序列数据进行最优化; NVD3:d3.js的图表组件; Peity:渐进式SVG条形图,折线和饼图; Plot.ly:易于使用的Web服务,它允许快速创建从热图到直方图等复杂的图表,使用图表Plotly的在线电子表格上传数据进行创建和设计; Plotly.js:支持plotly的开源JavaScript图形库; Recline:简单但功能强大的库,纯粹利用JavaScript和HTML构建数据应用; Redash:查询和可视化数据的开源平台; Shiny:针对R的Web应用程序框架; Sigma.js:JavaScript库,专门用于图形绘制; Vega:一个可视化语法; Zeppelin:一个笔记本式的协作数据分析; Zing Charts:用于大数据的JavaScript图表库。 物联网和传感器 TempoIQ:基于云的传感器分析; 2lemetry:物联网平台; Pubnub:数据流网络; ThingWorx:ThingWorx 是让企业快速创建和运行互联应用程序平台; IFTTT:IFTTT 是一个被称为 “网络自动化神器” 的创新型互联网服务,它的全称是 If this then that,意思是“如果这样,那么就那样”; Evrythng:Evrythng则是一款真正意义上的大众物联网平台,使得身边的很多产品变得智能化。 文章推荐 NoSQL Comparison(NoSQL 比较)- Cassandra vs MongoDB vs CouchDB vs Redis vs Riak vs HBase vs Couchbase vs Neo4j vs Hypertable vs ElasticSearch vs Accumulo vs VoltDB vs Scalaris comparison; Big Data Benchmark(大数据基准)- Redshift, Hive, Shark, Impala and Stiger/Tez的基准; The big data successor of the spreadsheet(电子表格的大数据继承者) – 电子表格的继承者应该是大数据。 论文 2015 – 2016 2015 – Facebook – One Trillion Edges: Graph Processing at Facebook-Scale.(一兆边:Facebook规模的图像处理) 2013 – 2014 2014 – Stanford – Mining of Massive Datasets.(海量数据集挖掘) 2013 – AMPLab – Presto: Distributed Machine Learning and Graph Processing with Sparse Matrices. (Presto: 稀疏矩阵的分布式机器学习和图像处理) 2013 – AMPLab – MLbase: A Distributed Machine-learning System. (MLbase:分布式机器学习系统) 2013 – AMPLab – Shark: SQL and Rich Analytics at Scale. (Shark: 大规模的SQL 和丰富的分析) 2013 – AMPLab – GraphX: A Resilient Distributed Graph System on Spark. (GraphX:基于Spark的弹性分布式图计算系统) 2013 – Google – HyperLogLog in Practice: Algorithmic Engineering of a State of The Art Cardinality Estimation Algorithm. (HyperLogLog实践:一个艺术形态的基数估算算法) 2013 – Microsoft – Scalable Progressive Analytics on Big Data in the Cloud.(云端大数据的可扩展性渐进分析) 2013 – Metamarkets – Druid: A Real-time Analytical Data Store. (Druid:实时分析数据存储) 2013 – Google – Online, Asynchronous Schema Change in F1.(F1中在线、异步模式的转变) 2013 – Google – F1: A Distributed SQL Database That Scales. (F1: 分布式SQL数据库) 2013 – Google – MillWheel: Fault-Tolerant Stream Processing at Internet Scale.(MillWheel: 互联网规模下的容错流处理) 2013 – Facebook – Scuba: Diving into Data at Facebook. (Scuba: 深入Facebook的数据世界) 2013 – Facebook – Unicorn: A System for Searching the Social Graph. (Unicorn: 一种搜索社交图的系统) 2013 – Facebook – Scaling Memcache at Facebook. (Facebook 对 Memcache 伸缩性的增强) 2011 – 2012 2012 – Twitter – The Unified Logging Infrastructure for Data Analytics at Twitter. (Twitter数据分析的统一日志基础结构) 2012 – AMPLab –Blink and It’s Done: Interactive Queries on Very Large Data. (Blink及其完成:超大规模数据的交互式查询) 2012 – AMPLab –Fast and Interactive Analytics over Hadoop Data with Spark. (Spark上 Hadoop数据的快速交互式分析) 2012 – AMPLab –Shark: Fast Data Analysis Using Coarse-grained Distributed Memory. (Shark:使用粗粒度的分布式内存快速数据分析) 2012 – Microsoft –Paxos Replicated State Machines as the Basis of a High-Performance Data Store. (Paxos的复制状态机——高性能数据存储的基础) 2012 – Microsoft –Paxos Made Parallel. (Paxos算法实现并行) 2012 – AMPLab – BlinkDB:BlinkDB: Queries with Bounded Errors and Bounded Response Times on Very Large Data.(超大规模数据中有限误差与有界响应时间的查询) 2012 – Google –Processing a trillion cells per mouse click.(每次点击处理一兆个单元格) 2012 – Google –Spanner: Google’s Globally-Distributed Database.(Spanner:谷歌的全球分布式数据库) 2011 – AMPLab –Scarlett: Coping with Skewed Popularity Content in MapReduce Clusters.(Scarlett:应对MapReduce集群中的偏向性内容) 2011 – AMPLab –Mesos: A Platform for Fine-Grained Resource Sharing in the Data Center.(Mesos:数据中心中细粒度资源共享的平台) 2011 – Google –Megastore: Providing Scalable, Highly Available Storage for Interactive Services.(Megastore:为交互式服务提供可扩展,高度可用的存储) 2001 – 2010 2010 – Facebook – Finding a needle in Haystack: Facebook’s photo storage.(探究Haystack中的细微之处: Facebook图片存储) 2010 – AMPLab – Spark: Cluster Computing with Working Sets.(Spark:工作组上的集群计算) 2010 – Google – Storage Architecture and Challenges.(存储架构与挑战) 2010 – Google – Pregel: A System for Large-Scale Graph Processing.(Pregel: 一种大型图形处理系统) 2010 – Google – Large-scale Incremental Processing Using Distributed Transactions and Noti?cations base of Percolator and Caffeine.(使用基于Percolator 和 Caffeine平台分布式事务和通知的大规模增量处理) 2010 – Google – Dremel: Interactive Analysis of Web-Scale Datasets.(Dremel: Web规模数据集的交互分析) 2010 – Yahoo – S4: Distributed Stream Computing Platform.(S4:分布式流计算平台) 2009 – HadoopDB:An Architectural Hybrid of MapReduce and DBMS Technologies for Analytical Workloads.(混合MapReduce和DBMS技术用于分析工作负载的的架构) 2008 – AMPLab – Chukwa: A large-scale monitoring system.(Chukwa: 大型监控系统) 2007 – Amazon – Dynamo: Amazon’s Highly Available Key-value Store.(Dynamo: 亚马逊的高可用的关键价值存储) 2006 – Google – The Chubby lock service for loosely-coupled distributed systems.(面向松散耦合的分布式系统的锁服务) 2006 – Google – Bigtable: A Distributed Storage System for Structured Data.(Bigtable: 结构化数据的分布式存储系统) 2004 – Google – MapReduce: Simplied Data Processing on Large Clusters.(MapReduce: 大型集群上简化数据处理) 2003 – Google – The Google File System.(谷歌文件系统) 视频 数据可视化 数据可视化之美 Noah Iliinsky的数据可视化设计 Hans Rosling’s 200 Countries, 200 Years, 4 Minutes 冰桶挑战的数据可视化

优秀的个人博客,低调大师

JavaScript—常见设计模式整理(27)

开发中,我们或多或少地接触了设计模式,但是很多时候不知道自己使用了哪种设计模式或者说该使用何种设计模式。本文意在梳理常见设计模式的特点,从而对它们有比较清晰的认知。 JavaScript 中常见设计模式 单例模式策略模式代理模式迭代器模式发布-订阅模式命令模式组合模式模板方法模式享元模式职责链模式中介者模式装饰者模式状态模式适配者模式观察者模式 各设计模式关键词看完了上述设计模式后,把它们的关键词特点罗列出来,以后提到某种设计模式,进而联想相应的关键词和例子,从而心中有数。 设计模式 特点 案例 单例模式 一个类只能构造出唯一实例 创建菜单对象 策略模式 根据不同参数可以命中不同的策略 动画库里的算法函数 代理模式 代理对象和本体对象具有一致的接口 图片预加载 迭代器模式 能获取聚合对象的顺序和元素 each([1, 2, 3], cb) 发布-订阅模式 PubSub 瀑布流库 命令模式 不同对象间约定好相应的接口 按钮和命令的分离 组合模式 组合模式在对象间形成一致对待的树形结构 扫描文件夹 模板方法模式 父类中定好执行顺序 咖啡和茶 享元模式 减少创建实例的个数 男女模具试装 职责链模式 通过请求第一个条件,会持续执行后续的条件,直到返回结果为止 if else 优化 中介者模式 对象和对象之间借助第三方中介者进行通信 测试结束告知结果 装饰者模式 动态地给函数赋能 天冷了穿衣服,热了脱衣服 状态模式 每个状态建立一个类,状态改变会产生不同行为 电灯换挡 适配者模式 一种数据结构改成另一种数据结构 枚举值接口变更 观察者模式 当观察对象发生变化时自动调用相关函数 vue 双向绑定

优秀的个人博客,低调大师

Java面试题整理《中》

一、数据库部分 简单介绍下关系数据库三范式 范式指的是数据库设计时要遵循的三个规范,但并不是强制式的,这三个规范呈阶梯式的关系,现有第一层然后在第一层的基础上有第二层... 第一范式规定列数据不可分割,即实体中的某个属性不能有多个值或者重复的属性;第二范式要求每个行必须可以被唯一的区分,就是表中必须有主键存在的意思;第三范式规定表中不包含已在其他表中已包含的非主关键字信息,意思是除了外键之外不能存储其他表的数据信息。 反三范式:出于对效率和便利性的追求,可以违反三范式设置重复或可以推导出的字段,比如为了在查询订单的总价时可以不用去计算每个订单项中的单价和在订单表中设置订单总价字段。 可以简单介绍下什么是事务? 事务是并发控制的最小单位(需要满足ACID),用户定义的一个操作序列要么都执行成功,要么都执行失败,比如转账,A扣钱,B加钱,这两个操作必须是不可分割的,在commit之后也不能被干扰,将执行的代码try/catch并调用回滚rollback撤销当前事务操作。 mysql数据库的默认的最大连接数? mysql数据的默认连接数大小是100,数据库在安装时都会设置一个最大连接数,这是因为一般服务器都只能支持一定数目同时连接。 说一下msyql的分页?oracle的分页? oracle的分页是采用了三层嵌套查询,没有用过不赘言。 mysql是使用关键字limit来进行分页查询的 String sql ="select * from students order by id limit " + pageSize*(pageNumber-1) + "," + pageSize; 存储过程是什么?它有什么优缺点? 存储过程本质上是sql语句的集合,这些集合像一个方法一样实现某一特定的功能,通过设置名称的方式提供调用。 由于是预编译的代码块,所以执行效率会比较高;由于很多SQL一起执行,所以节省网络带宽;存储过程提供安全机制,可以对于没有权限执行存储过程的用户进行控制; 缺点则是调试和更改时比较麻烦,而且也没办法做缓存和做数据库集群。因此对于存储过程的使用要慎重,对于提高SQL查询的性能而言,ORM框架做的会比存储过程好。 SQL语言本质是一种结构化查询语言,复杂的业务逻辑还是应该通过代码去实现。 有没有做过数据库优化方面的事情? 主要是使用索引、分表和缓存来做数据库优化,当有多个数据库服务器时,还可以采用读写分离的方式做数据库集群。 数据库优化之创建合适的索引 普通索引:允许重复的值出现 唯一索引:除了不能重复记录之外,其它的和普通索引一样,例如用户名,身份证,email,tel 主键索引:将表中某列设置为主键的时候数据库引擎会自动将该列设置为主键索引,这个主键索引唯一并且没有不能为null 全文索引:主要针对表中的文本域进行索引,比如char,varchar,text等字段 索引的弊端一是占用磁盘空间,二是对DML(增删改)操作会降低效率。 索引配合where条件,一般在字段内容不是频繁变化的时候使用,并且该字段的内容不是唯一的几个值,例如性别这个字段只有男女或未知 索引使用的技巧:对于like查询,如果模糊信息为'%aaa'的话就不会使用索引,因此在like查询中,关键字的最前面最好不要使用'%'或者'_'这样的字符,如果前面的值一定要有变化,则考虑使用全文索引(sphinx);如果条件查询中带有'or'关键字就不会使用索引,所以要避免使用'or'关键字;如果列是字符串类型,无论是不是字符串数字都要使用''包括起来,否则当值是数值类型的话会自动转换,如果不是数值类型则会报错;当表中只有一条数据时,全表扫描要比索引快,所以为了"效率"的查询数据,应该使用全表扫描的方式,233... 数据库优化之分表 当数据库单个表中数据越来越大(百万级别)的时候会导致数据查询缓慢,又因为数据库是多用户共享资源,并发存取同一数据的时候时需要添加锁机制来控制用户操作,所以会出现数据库性能瓶颈。这个时候就需要对数据库进行分表,就是把数据量大的表分成多个数据表,比如商品SPU和SKU表的商品描述信息进行表抽取和对单个数据比如价格,0-100和100-200在不同表中或通过自增长ID切割,这是水平分表。比如在电商项目中类似商品的分类、创建时间、品牌和规格等信息具有变化频率慢,查询次数多,而且有很好的实时性的数据,把这样的数据称之为冷数据;类似商品评论,广告,销量和价格排序这些变化频率慢的数据称之为热数据。将这些数据通过更改存储引擎,使用memcache、redis和从库配置等进行不同的处理。 数据库优化之读写分离 一台数据库服务器所支持的最大并发连接数是有限的,如果用户并发访问太多就需要考虑搭建集群,读写分离就是mysql处理集群的相关技术。使用负载均衡来实现写操作往主数据库库中去,读操作往从数据库中去。数据库最终都会把数据库持久化到磁盘,因此集群必须保证每个数据库服务器中数据是一致的,这就是主从同步技术。 数据库优化之缓存 每次读取数据都需要操作数据库,这对数据库很不友好,所以需要在持久层DAO和数据库DB中添加一个缓存层,这个缓存层一般都使用内存实现,如果访问的数据能够从缓存服务器中读取,那么就不会访问数据库。在Java中的缓存有ORM框架的二级缓存,需要注意的是Hibernate的二级缓存不能完成分布式缓存,还有可以使用memcache或者redis来对缓存的数据进行集中处理。 二、前端部分 简单说一下html,css,javascript在网页开发中的定位? HTML 超文本标记语言 定义网页的结构 CSS 层叠样式表,用来美化页面 JavaScript主要用来验证表单,做动态交互(其中ajax) 简单介绍一下Ajax? 如果不使用ajax,拿直播页面来说,你点击直播间的刷新按钮,那么包括弹幕在内的整个网页都会刷新。所以ajax不只是一门技术,只要是通过js调用异步通讯组件并使用格式化数据来更新页面上的内容就可以说是ajax,它实现了页面中局部位置的定点刷新。 ajax全称AsynchronousJavascript+XML(异步传输+js+xml),所谓异步就是在向服务器发送请求的时候不需要等待结果就可以做其他事,这就代表你可以在一个页面上同时看直播视频界面和弹幕。现在一般使用json来代替xml,好处是json更加简洁,解析速度也更快。 ajax原理是通过创建XmlHttpRequest对象,XmlHttpRequest是js提供的一个为客户端提供客户端与服务器之间传输数据的API对象。通过这个API对象调用onreadystatechange事件,该事件用于获取客户端浏览器向服务器发送数据的状态(200,404等),得到状态之后就会调用编写的回调函数。在这个过程中,其他代码还是在不断接收数据解析数据的,只是不会阻塞js代码。 var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function () { //存储函数 当readyState属性发生改变时就会调用 Fuck(xhr.readyState);//readyState属性 0=请求未初始化,1=服务器连接已建立,2=请求已连接,3=请求处理中,4=请求已完成,且响应就绪 Fuck(xhr.status);//status属性 200=ok,404=访问资源未找到,401=没有访问权限,402=预留的状态码,403=禁止访问,500=服务器内部错误等等 } 缺点:ajax破坏了浏览器的back和history机制;违反了URL资源定位设计的初衷;对搜索引擎(SEO)有影响;不能很好的支持移动设备;破坏了程序的异常处理机制;由于现在的程序将大量原先在后端的代码放到了js文件中会导致客户端程序复杂并存在安全隐患。 使用场景:登录失败时不跳转页面,注册时提示用户名是否存在,二级联动。 js和jQuery的关系? JQ是一个封装了js属性和方法的框架,可以让开发者使用便利的同时也增强了js的功能,如果是使用原生js的话就需要处理很多兼容性问题和事件绑定,dom操作,ajax,注册事件等。JQ常用的选择器有ID选择器,class选择器,标签选择器等。 jQuery的页面加载完毕事件? 在js中想要获取元素必须要先加载元素,可以将获取元素的js代码放到元素标签后,但是这样会造成管理上的不便,所以一般等页面全部加载之后在获取元素。一般使用$(funcation(){});//当页面加载完毕之后会执行花括号中的函数,这是相对简单的方式,因此使用也是最多的。 需要注意的是JQ中的页面加载是指页面结构被加载完毕,而window.onload表示的是页面被加载完毕。 <img src=”htttp://baidu.com/1.jpg”/> onload必须等页面中的图片、声音、图像等远程资源被加载完毕后才调用,而jQuery中只需要页面结构被加载完毕。 简单说一下html5和css3?你对现在的那些新技术有了解? html5是最新版本的html,在html4的基础上增强了一些标签,比如画板,声音,视频,web存储这些功能。但是html5过于强调语义,比如使用header标签表示头部,footer表示底部。以前在开发都是采用div标签定义模块。 css3在css2的基础上做了增强,实现了一些原来在css2中实现起来比较困难,或者不能实现的功能,比如盒子和文字阴影,渐变,动画等。css3的缺点在于需要根据不同的浏览器处理兼容性,其实html5也有兼容性问题,比如html5播放器panda.tv就出于兼容性的考虑没有使用html5播放器。 三、框架部分 什么是框架? it语境中的框架是指为了解决某一开放性问题而设计的具有一定约束性的支撑结构,在这种结构上可以根据具体问题进行扩展,从而便捷的构建完整的解决问题的方案。 框架不能完全解决实际上遇到的问题,但可以快速的解决普遍问题。 框架是为了扩展而设计的 一般框架会提供很多辅助性的实用工具,比如java的一系列jar包就是对jdk功能的扩展。 简单讲一下SpringMVC的执行流程? SpringMVC本质上是一个前端控制器(DispatcherServlet),通过对处理器映射器,处理器适配器和视图解析器的调度来实现接收请求和响应数据。 说一下struts2和springMVC有什么不同? MVC的核心是Servlet,Strtus2的核心是Filter;MVC一般使用注解开发,Strtus2一般使用xml配置;MVC处理ajax请求,直接返回数据,在方法中通过注解@RequestBody,MVC就会自动将对象转换成json数据;而strtus2是通过插件转换的。 说一下Spring中的两大核心? IoC(Inversion of Control)或者称之为DI(Dependency Injection)是指程序将DAO的创建权交付Spring管理,通过配置文件和反射再加上Map来实现自动创建Bean。 AOP(Aspect Oriented Programming)被称之为面向切面编程,使用动态代理的方式在执行方法前后或应用程序出现异常时加入相关逻辑。比如对于事务和日志的处理。 什么是ORM? 对象关系映射简称ORM(Object Relational Mapping),通过对数据和对象之间映射元数据的方式,将程序中的对象自动持久化到关系数据库。 iBatis(mybatis)与Hibernate有什么不同? mybatis的好处在于将sql语句与java代码分离并提供将结果集自动封装为实体对象和对象集合的功能,还提供了自动将实体对象的属性传递给sql语句的参数这样的功能。 hibernate的好处在于可以自动生成sql语句并执行同时返回java结果。 两者最大的不同在于mybatis是面向sql的所以需要在xml配置文件中写sql,而hibernate是自动生成sql,需要考虑对象之间复杂的映射关系。因为这个特性所以hibernate无法完成特别复杂的查询。 四、其他部分 有没有用过linux?你都用它来做什么?linux的特点是长时间运行比较稳定,所以一般会用做服务器。linux提供C语言编译环境,所以需要C语言支持的redis和nginx等可以通过在C语言编译环境中获取软件包并运行。 说一下linux下面的一下常用命令? 查看文件 tail -f 删除文件 rm -rf 编辑文件 vi 创建文件夹 mkdir 删除文件夹 rm -f 获取当前路径 pwd 跳转目录 cd 切换用户 su -root 列举目录 ls 你是使用什么来连接远程的Linux服务器的? 需要依赖于Linux服务器安装ssh服务端,一般这个ssh服务的端口22. 需要依赖于Linux服务器安装sftp服务端,一般这个sftp服务的端口25. 使用xshell、putty等ssh客户端来连接服务器,使用xftp、winscp等sftp客户端来上传和现在文件。连接和上传、下载必须依赖于服务器的ssh、sftp服务,也就是linux服务器需要启动这两个服务。 没有使用过云主机?客户有租用过阿里的云主机,云主机就是一些云服务运营商比如阿里,腾讯,华为等提供远程的服务器功能,开发者只需要按需付费即可租用。使用ssh和sftp操作 有没有使用过redis? redis是什么redis是一个key-value的nosql的数据库,redis会先将数据存储到内存中,然后根据一定的策略持久化到磁盘,已达到断电也不会丢失数据。主要用来做缓存数据库的数据和做web集群的时候当做中央缓存存放session。 redis的数据淘汰机制在 redis 中,允许用户设置最大使用内存大小 server.maxmemory,在内存限定的情况下是很有用的。譬如,在一台 8G 机子上部署了 4 个 redis 服务点,每一个服务点分配 1.5G 的内存大小,减少内存紧张的情况,由此获取更为稳健的服务。 内存大小有限,需要保存有效的数据?redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。 redis 提供 6种数据淘汰策略: volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰 volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰 volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰 allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰 allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰 no-enviction(驱逐):禁止驱逐数据 微信开发原理微信公众平台开发者,通过接入认证的方式,让我们的服务器能处理来自微信服务器转发的微信用户的请求,处理完成后返回给微信服务器,有微信服务器对用户响应。 怎么把微信和业务平台绑定?用户注册实体中包含一个微信号的字段,进行绑定操作的时候就是修改这个微信号的字段,我们需要通过微信网页授权的方式获取微信号。 当用户同意授权的时候我们可以得到一个code,通过这个code换取网页授权的微信号,就是openid,最后将openid存入到微信号字段中即可

优秀的个人博客,低调大师

PSR规范0-4整理

PSR规范 psr规范 引言: PSR 是 PHP Standard Recommendations 的简写,由 PHP FIG 组织制定的 PHP 规范,是 PHP 开发的实践标准。这些规范的目的是:通过框架作者或者框架的代表之间讨论,以最低程度的限制,制定一个协作标准,各个框架遵循统一的编码规范,避免各家自行发展的风格阻碍了 PHP 的发展,解决这个程序设计师由来已久的困扰。截止到笔者文章psr在用的共11套规范,下面介绍了其中四个和已经弃用的psr0规范。 PSR-0 (Autoloading Standard) 自动加载标准 (2014年10月21起被官方弃用 由psr4替代) PSR-1 (Basic Coding Standard) 基础编码标准 PSR-2 (Coding Style Guide) 编码风格向导 PSR-3 (Logger Interface) 日志接口 PSR-4 (Improved Autoloading) 自动加载的在用版本。 #注:另有psr6(缓存接口规范)psr7(HTTP消息接口规范)psr11、psr13、psr15、psr16、psr17本文不做介绍 附上官网地址psr psr0(官方已废弃) 自动加载标准 一个完全合格的namespace和class必须符合这样的结构:“< Vendor Name>(< Namespace>)*< Class Name>” 每个namespace必须有一个顶层的namespace("Vendor Name"提供者名字) 每个namespace可以有多个子namespace 当从文件系统中加载时,每个namespace的分隔符(/)要转换成DIRECTORY_SEPARATOR(操作系统路径分隔符) 在类名中,每个下划线要转换成DIRECTORY_SEPARATOR(操作系统路径分隔符)。在namespace中,下划线是没有(特殊)意义的。 当从文件系统中载入时,合格的namespace和class一定是以 .php 结尾的verdor name,namespaces,class名可以由大小写字母组合而成(大小写敏感的) 注:因为已经废弃,这里不再多做介绍 psr4 这里先介绍psr4,好和上面的psr0作对比,因为他是升级版的PSR-0自动加载规范 PSR4是关于由文件路径自动载入对应的类的相关规范,本规范是可互操作的。可以作为任一自动(包括PSR-0)载入规范的补充,此外,PSR4还包括自动载入的类对应的文件存放路径规范。 此处的“类”泛指所有的class类、接口、traits可复用代码块以及其他类似结构。 一个完整的类名需要具有以下结构 <命名空间>(<子命名空间>)*<类名> 完整的类名必须要有一个顶级命名空间,被称为“Vendor namespace” 完整的类名可以有一个或多个子命名空间 完整的类名必须有一个最终的类名 完整的类名中任意一部分中的下划线都是没有特殊意义的 完整的类名可以由任意大小写字母组成 所有类名都必须是大小写敏感的 当根据完整的类名载入相应的文件 完整的类名中,去掉最前面的命名空间分隔符,前面连续的一个或多个命名空间和子命名空间,作为“命名空间前缀”,其必须至少对应一个基础目录。 紧接命名空间前缀后的子命名空间必须与相对应的“基础目录”的子目录相匹配,其中的命名空间分隔符作为目录分割符 末尾的类名必须与对应的.php为后缀的文件同名 自动加载器(autoloader)的实现一定不能抛出异常,一定不能触发任一级别的错误信息以及不应该有返回值。 例如: #完整的类名为 \a\b\c\Log #命名空间前缀前缀为: a\b #前缀对应的基础目录为: ./vendor #文件实际目录为: ./vendor/c/Log.php #注:即把去掉最前面的命名空间分隔符后的a\b\c\Log中的命名空间前缀替换成基础目录,然后把命名空间分隔符替换成目录分隔符,并把文件名补上后缀 .php 。 PSR-4和PSR-0最大的区别是对下划线(underscore)的定义不同。PSR-4中,在类名中使用下划线没有任何特殊含义。而PSR-0则规定类名中的下划线_会被转化成目录分隔符。 psr1 基本代码规范 PHP源文件必须只使用 <?php 和 <?= 这两种标签。(php标记有多种方式) 源文件中php代码的编码格式必须是不带字节顺序标记(BOM)的UTF-8。(注:PHP在设计时就没有考虑BOM的问题,也就是说他不会忽略UTF-8编码的文件开头BOM的那三个字节导致出现奇怪的错误。) 一个源文件建议只用来做声明(类(class),函数(function),常量(constant)等)或者只用来做一些引起从属效应的操作(例如:输出信息,包含文件,修改.ini配置等),但不能同时使用两者。 注:“从属效应”(side effects)一词的意思是,仅仅通过包含文件,不直接声明类、函数和常量等,而执行的逻辑操作。 “从属效应”包含却不仅限于:生成输出、直接的 require 或 include、连接外部服务、修改 ini 配置、抛出错误或异常、修改全局或静态变量、读或写文件等。 这个很多人都不遵守,但是基本上所有框架里都不会把修改.ini配置和声明类或函数放到一起,比如框架index.php入口文件只定义宏常量和修改.ini等 命名空间(namespace)和类(class) 必须遵守PSR0或psr4标准。 类名(class name) 必须使用骆驼式(StudlyCaps)写法(注:StudlyCaps即首字母大写驼峰式)。 类(class)中的常量必须只由大写字母和下划线组成。 方法名(method name) 必须使用驼峰式(cameCase)写法。 psr2 代码风格 代码必须遵循PSR-1中的编码规范 代码必须使用四个空格符而不是tab键进行缩进。 每行的字符数应该软性保持在80个内,理论上不可多于120个,但一定不能硬性限制 每个namespace命名空间声明语句和use语句块后面,必须插入一个空白行 类的开始花括号必须在类声明后自成一行,结束花名号也必须在类主体后自成一行 函数的开始花括号必须在函数声明后自成一行,结束花名号也必须在函数主体后自成一行 类的属性和方法必须添加访问修饰符(private protected以及public),abstract以及final必须声明在访问修饰符之前,而static必须声明在访问修饰符之后。 控制结构的关键字后必须要有一个空格符,而调用方法或函数时则一定不能有。 控制结构的开始花括号必须写在声明的同一行,而结束花括号必须写在主体后自成一行。 控制结构的开始左括号后和结束右括号前,都一定不能有空格符。 示例代码 <?php namespace Vendor\Package; use FooInterface; use BarClass as Bar; use OtherVendor\OtherPackage\BazClass; class Foo extends Bar implements FooInterface { public function sampleMethod($a, $b = null) { if ($a === $b) { bar(); } elseif ($a > $b) { $foo->bar($arg1); } else { BazClass::bar($arg2, $arg3); } } final public static function bar() { // method body } } 通常还有以下几点需要注意 对于php文件: 所有的php文件都必须以Unix LF(换行)作为结束符 所有的php文件都必须以一个单独的空行结尾 纯PHP代码源文件的关闭标签?>必须省略。 关键字和 True/False/Null php的关键字,必须小写 php产量 true ,false,null也必须小写 命名空间 命名空间(namespace)的声明后面必须有一行空行。 所有的导入(use)声明必须放在命名空间(namespace)声明的下面。 一句声明中,必须只有一个导入(use)关键字。 在导入(use)声明代码块后面必须有一行空行。 例如: <?php namespace Vendor\Package; use FooClass; use BarClass as Bar; use OtherVendor\OtherPackage\BazClass; // ... additional PHP code ... 控制结构 if ,else ,elseif ,while ,do while ,switch case ,for, foreach,try catch等。这一类的写法规范也是经常容易出现问题的,也要规范一下。在关键字和后面的判断条件中间应该加空格,在判断条件和左大括号之间也要加空格。 psr3日志接口规范 本规范的主要目的,是为了让类库以简单通用的方式接收一个Psr\Log\LoggerInterface对象,来记录日志信息。框架以及CMS内容管理系统如有需要,可以扩展接口以用于它们自己的 目的,但须遵循本规范,才能在使用第三方的类库文件时,保证日志接口仍能正常对接。 LoggerInterface 接口对外定义了八个方法,分别用来记录RFC 5424中定义的八个级别:debug、info、notice、warning、error、critical、alert,emergency。 第九个方法-log,其第一个参数为日志的等级,可使用一个预定义好的等级常量作为参数来调用此方法,必须与直接调用以上八个方法具有相同的效果。如果传入的等级常量参数没有预先定义,就必须抛出Psr\Log\InvalidArgumentException类型的异常,在不确定的情况下,使用者不该使用未支持的等级常量来调用此方法。如果有用过monolog就应该对这里有较深的理解。 例如,日志等级可以定义如下: <?php namespace Psr\Log; /** * Describes log levels */ class LogLevel { const EMERGENCY = 'emergency'; const ALERT = 'alert'; const CRITICAL = 'critical'; const ERROR = 'error'; const WARNING = 'warning'; const NOTICE = 'notice'; const INFO = 'info'; const DEBUG = 'debug'; } 日志这里想必大家接触的也不多,如果想了解可以看一看monolog的源码。 本文到此就结束,希望大家get到了想要的知识。 希望大家多评论交流,互相学习

优秀的个人博客,低调大师

JavaScript 中常见设计模式整理

开发中,我们或多或少地接触了设计模式,但是很多时候不知道自己使用了哪种设计模式或者说该使用何种设计模式。本文意在梳理常见设计模式的特点,从而对它们有比较清晰的认知。 开发中,我们或多或少地接触了设计模式,但是很多时候不知道自己使用了哪种设计模式或者说该使用何种设计模式。本文意在梳理常见设计模式的特点,从而对它们有比较清晰的认知。 JavaScript 中常见设计模式 单例模式 策略模式 代理模式 迭代器模式 发布-订阅模式 命令模式 组合模式 模板方法模式 享元模式 职责链模式 中介者模式 装饰者模式 状态模式 适配者模式 各设计模式关键词 看完了上述设计模式后,把它们的关键词特点罗列出来,以后提到某种设计模式,进而联想相应的关键词和例子,从而心中有数。 设计模式 特点 案例 单例模式 一个类只能构造出唯一实例 创建菜单对象 策略模式 根据不同参数可以命中不同的策略 动画库里的算法函数 代理模式 代理对象和本体对象具有一致的接口 图片预加载 迭代器模式 能获取聚合对象的顺序和元素 each([1, 2, 3], cb) 发布-订阅模式 PubSub 瀑布流库 命令模式 不同对象间约定好相应的接口 按钮和命令的分离 组合模式 组合模式在对象间形成一致对待的树形结构 扫描文件夹 模板方法模式 父类中定好执行顺序 咖啡和茶 享元模式 减少创建实例的个数 男女模具试装 职责链模式 通过请求第一个条件,会持续执行后续的条件,直到返回结果为止 if else 优化 中介者模式 对象和对象之间借助第三方中介者进行通信 测试结束告知结果 装饰者模式 动态地给函数赋能 天冷了穿衣服,热了脱衣服 状态模式 每个状态建立一个类,状态改变会产生不同行为 电灯换挡 适配者模式 一种数据结构改成另一种数据结构 枚举值接口变更 参考文献 *《JavaScript设计模式与开发实践》 作者:牧云云 出处:http://www.cnblogs.com/MuYunyun/" 本文版权归作者和博客园所有,欢迎转载,转载请标明出处。 如果您觉得本篇博文对您有所收获,请点击右下角的 [推荐],谢谢!

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。