【转】Spark:一个高效的分布式计算系统

原文地址:http://tech.uc.cn/?p=2116

概述

什么是Spark

  • Spark是UC Berkeley AMP lab所开源的类Hadoop MapReduce的通用的并行计算框架,Spark基于map reduce算法实现的分布式计算,拥有Hadoop MapReduce所具有的优点;但不同于MapReduce的是Job中间输出和结果可以保存在内存中,从而不再需要读写HDFS,因此Spark能更好地适用于数据挖掘与机器学习等需要迭代的map reduce的算法。其架构如下图所示:

spark-framwork

Spark与Hadoop的对比

  • Spark的中间数据放到内存中,对于迭代运算效率更高。
    • Spark更适合于迭代运算比较多的ML和DM运算。因为在Spark里面,有RDD的抽象概念。
  • Spark比Hadoop更通用。
    • Spark提供的数据集操作类型有很多种,不像Hadoop只提供了Map和Reduce两种操作。比如mapfilterflatMapsamplegroupByKeyreduceByKeyunionjoincogroup,mapValuessort,partionBy等多种操作类型,Spark把这些操作称为Transformations。同时还提供Countcollectreducelookupsave等多种actions操作。
    • 这些多种多样的数据集操作类型,给给开发上层应用的用户提供了方便。各个处理节点之间的通信模型不再像Hadoop那样就是唯一的Data Shuffle一种模式。用户可以命名,物化,控制中间结果的存储、分区等。可以说编程模型比Hadoop更灵活。
    • 不过由于RDD的特性,Spark不适用那种异步细粒度更新状态的应用,例如web服务的存储或者是增量的web爬虫和索引。就是对于那种增量修改的应用模型不适合。
  • 容错性。
    • 在分布式数据集计算时通过checkpoint来实现容错,而checkpoint有两种方式,一个是checkpoint data,一个是logging the updates。用户可以控制采用哪种方式来实现容错。
  • 可用性。
    • Spark通过提供丰富的Scala, Java,Python API及交互式Shell来提高可用性。

 

Spark与Hadoop的结合

  • Spark可以直接对HDFS进行数据的读写,同样支持Spark on YARN。Spark可以与MapReduce运行于同集群中,共享存储资源与计算,数据仓库Shark实现上借用Hive,几乎与Hive完全兼容。

Spark的适用场景

  • Spark是基于内存的迭代计算框架,适用于需要多次操作特定数据集的应用场合。需要反复操作的次数越多,所需读取的数据量越大,受益越大,数据量小但是计算密集度较大的场合,受益就相对较小
  • 由于RDD的特性,Spark不适用那种异步细粒度更新状态的应用,例如web服务的存储或者是增量的web爬虫和索引。就是对于那种增量修改的应用模型不适合。
  • 总的来说Spark的适用面比较广泛且比较通用。

运行模式

  • 本地模式
  • Standalone模式
  • Mesoes模式
  • yarn模式

Spark生态系统

  • Shark ( Hive on Spark): Shark基本上就是在Spark的框架基础上提供和Hive一样的H iveQL命令接口,为了最大程度的保持和Hive的兼容性,Shark使用了Hive的API来实现query Parsing和 Logic Plan generation,最后的PhysicalPlan execution阶段用Spark代替Hadoop MapReduce。通过配置Shark参数,Shark可以自动在内存中缓存特定的RDD,实现数据重用,进而加快特定数据集的检索。同时,Shark通过UDF用户自定义函数实现特定的数据分析学习算法,使得SQL数据查询和运算分析能结合在一起,最大化RDD的重复使用。
  • Spark streaming: 构建在Spark上处理Stream数据的框架,基本的原理是将Stream数据分成小的时间片断(几秒),以类似batch批量处理的方式来处理这小部分数据。Spark Streaming构建在Spark上,一方面是因为Spark的低延迟执行引擎(100ms+)可以用于实时计算,另一方面相比基于Record的其它处理框架(如Storm),RDD数据集更容易做高效的容错处理。此外小批量处理的方式使得它可以同时兼容批量和实时数据处理的逻辑和算法。方便了一些需要历史数据和实时数据联合分析的特定应用场合。
  • Bagel: Pregel on Spark,可以用Spark进行图计算,这是个非常有用的小项目。Bagel自带了一个例子,实现了Google的PageRank算法。

在业界的使用

  • Spark项目在2009年启动,2010年开源, 现在使用的有:Berkeley, Princeton, Klout, Foursquare, Conviva, Quantifind, Yahoo! Research & others, 淘宝等,豆瓣也在使用Spark的python克隆版Dpark。

Spark核心概念

Resilient Distributed Dataset (RDD)弹性分布数据集

  • RDD是Spark的最基本抽象,是对分布式内存的抽象使用,实现了以操作本地集合的方式来操作分布式数据集的抽象实现。RDD是Spark最核心的东西,它表示已被分区,不可变的并能够被并行操作的数据集合,不同的数据集格式对应不同的RDD实现。RDD必须是可序列化的。RDD可以cache到内存中,每次对RDD数据集的操作之后的结果,都可以存放到内存中,下一个操作可以直接从内存中输入,省去了MapReduce大量的磁盘IO操作。这对于迭代运算比较常见的机器学习算法, 交互式数据挖掘来说,效率提升比较大。
  • RDD的特点:

    1. 它是在集群节点上的不可变的、已分区的集合对象。
    2. 通过并行转换的方式来创建如(map, filter, join, etc)。
    3. 失败自动重建。
    4. 可以控制存储级别(内存、磁盘等)来进行重用。
    5. 必须是可序列化的。
    6. 是静态类型的。
  • RDD的好处

    1. RDD只能从持久存储或通过Transformations操作产生,相比于分布式共享内存(DSM)可以更高效实现容错,对于丢失部分数据分区只需根据它的lineage就可重新计算出来,而不需要做特定的Checkpoint。
    2. RDD的不变性,可以实现类Hadoop MapReduce的推测式执行。
    3. RDD的数据分区特性,可以通过数据的本地性来提高性能,这与Hadoop MapReduce是一样的。
    4. RDD都是可序列化的,在内存不足时可自动降级为磁盘存储,把RDD存储于磁盘上,这时性能会有大的下降但不会差于现在的MapReduce。
  • RDD的存储与分区

    1. 用户可以选择不同的存储级别存储RDD以便重用。
    2. 当前RDD默认是存储于内存,但当内存不足时,RDD会spill到disk。
    3. RDD在需要进行分区把数据分布于集群中时会根据每条记录Key进行分区(如Hash 分区),以此保证两个数据集在Join时能高效。
  • RDD的内部表示
    在RDD的内部实现中每个RDD都可以使用5个方面的特性来表示:

    1. 分区列表(数据块列表)
    2. 计算每个分片的函数(根据父RDD计算出此RDD)
    3. 对父RDD的依赖列表
    4. 对key-value RDD的Partitioner【可选】
    5. 每个数据分片的预定义地址列表(如HDFS上的数据块的地址)【可选】
  • RDD的存储级别
    RDD根据useDisk、useMemory、deserialized、replication四个参数的组合提供了11种存储级别:

  •       val NONE=newStorageLevel(false,false,false)
          val DISK_ONLY=newStorageLevel(true,false,false)
          val DISK_ONLY_2=newStorageLevel(true,false,false,2)
          val MEMORY_ONLY=newStorageLevel(false,true,true)
          val MEMORY_ONLY_2=newStorageLevel(false,true,true,2)
          val MEMORY_ONLY_SER=newStorageLevel(false,true,false)
          val MEMORY_ONLY_SER_2=newStorageLevel(false,true,false,2)
          val MEMORY_AND_DISK=newStorageLevel(true,true,true)
          val MEMORY_AND_DISK_2=newStorageLevel(true,true,true,2)
          val MEMORY_AND_DISK_SER=newStorageLevel(true,true,false)
          val MEMORY_AND_DISK_SER_2=newStorageLevel(true,true,false,2) 

     

  • RDD定义了各种操作,不同类型的数据由不同的RDD类抽象表示,不同的操作也由RDD进行抽实现。

RDD的生成

  • RDD有两种创建方式:
    1、从Hadoop文件系统(或与Hadoop兼容的其它存储系统)输入(例如HDFS)创建。
    2、从父RDD转换得到新RDD。
  • 下面来看一从Hadoop文件系统生成RDD的方式,如:val file = spark.textFile("hdfs://..."),file变量就是RDD(实际是HadoopRDD实例),生成的它的核心代码如下:

  •      // SparkContext根据文件/目录及可选的分片数创建RDD, 这里我们可以看到Spark与Hadoop MapReduce很像 
         // 需要InputFormat, Key、Value的类型,其实Spark使用的Hadoop的InputFormat, Writable类型。
         def textFile(path:String,minSplits:Int=defaultMinSplits):RDD[String]={
             hadoopFile(path,classOf[TextInputFormat],classOf[LongWritable],
             classOf[Text],minSplits).map(pair=>pair._2.toString)}
      
         // 根据Hadoop配置,及InputFormat等创建HadoopRDD  
         newHadoopRDD(this,conf,inputFormatClass,keyClass,valueClass,minSplits)

     

  • 对RDD进行计算时,RDD从HDFS读取数据时与Hadoop MapReduce几乎一样的:

  • // 根据hadoop配置和分片从InputFormat中获取RecordReader进行数据的读取。
        reader=fmt.getRecordReader(split.inputSplit.value,conf,Reporter.NULL)
        val key:K=reader.createKey()
        val value:V=reader.createValue()
        //使用Hadoop MapReduce的RecordReader读取数据,每个Key、Value对以元组返回。
        override def getNext()={
        try{
          finished=!reader.next(key,value)
        }catch{
          caseeof:EOFException=>
            finished=true
        }
          (key,value)
        }

     

RDD的转换与操作

  • val sc=newSparkContext(master,"Example",System.getenv("SPARK_HOME"),
              Seq(System.getenv("SPARK_TEST_JAR")))
       
          val rdd_A=sc.textFile(hdfs://.....)
          val rdd_B=rdd_A.flatMap((line=>line.split("\\s+"))).map(word=>(word,1))
       
          val rdd_C=sc.textFile(hdfs://.....)
          val rdd_D=rdd_C.map(line=>(line.substring(10),1))
          val rdd_E=rdd_D.reduceByKey((a,b)=>a+b)
      
          val rdd_F=rdd_B.jion(rdd_E)
      
          rdd_F.saveAsSequenceFile(hdfs://....)

     

    对于RDD可以有两种计算方式:转换(返回值还是一个RDD)与操作(返回值不是一个RDD)。
  • 转换(Transformations) (如:map, filter, groupBy, join等),Transformations操作是Lazy的,也就是说从一个RDD转换生成另一个RDD的操作不是马上执行,Spark在遇到Transformations操作时只会记录需要这样的操作,并不会去执行,需要等到有Actions操作的时候才会真正启动计算过程进行计算。
  • 操作(Actions) (如:count, collect, save等),Actions操作会返回结果或把RDD数据写到存储系统中。Actions是触发Spark启动计算的动因。
  • 下面使用一个例子来示例说明Transformations与Actions在Spark的使用。

  •  

     

SparkTA11

Lineage(血统)

  • 利用内存加快数据加载,在众多的其它的In-Memory类数据库或Cache类系统中也有实现,Spark的主要区别在于它处理分布式运算环境下的数据容错性(节点实效/数据丢失)问题时采用的方案。为了保证RDD中数据的鲁棒性,RDD数据集通过所谓的血统关系(Lineage)记住了它是如何从其它RDD中演变过来的。相比其它系统的细颗粒度的内存数据更新级别的备份或者LOG机制,RDD的Lineage记录的是粗颗粒度的特定数据转换(Transformation)操作(filter, map, join etc.)行为。当这个RDD的部分分区数据丢失时,它可以通过Lineage获取足够的信息来重新运算和恢复丢失的数据分区。这种粗颗粒的数据模型,限制了Spark的运用场合,但同时相比细颗粒度的数据模型,也带来了性能的提升。
  • RDD在Lineage依赖方面分为两种Narrow Dependencies与Wide Dependencies用来解决数据容错的高效性。Narrow Dependencies是指父RDD的每一个分区最多被一个子RDD的分区所用,表现为一个父RDD的分区对应于一个子RDD的分区或多个父RDD的分区对应于一个子RDD的分区,也就是说一个父RDD的一个分区不可能对应一个子RDD的多个分区。Wide Dependencies是指子RDD的分区依赖于父RDD的多个分区或所有分区,也就是说存在一个父RDD的一个分区对应一个子RDD的多个分区。对与Wide Dependencies,这种计算的输入和输出在不同的节点上,lineage方法对与输入节点完好,而输出节点宕机时,通过重新计算,这种情况下,这种方法容错是有效的,否则无效,因为无法重试,需要向上其祖先追溯看是否可以重试(这就是lineage,血统的意思),Narrow Dependencies对于数据的重算开销要远小于Wide Dependencies的数据重算开销。

容错

  • 在RDD计算,通过checkpint进行容错,做checkpoint有两种方式,一个是checkpoint data,一个是logging the updates。用户可以控制采用哪种方式来实现容错,默认是logging the updates方式,通过记录跟踪所有生成RDD的转换(transformations)也就是记录每个RDD的lineage(血统)来重新计算生成丢失的分区数据。

资源管理与作业调度

  • Spark对于资源管理与作业调度可以使用Standalone(独立模式),Apache Mesos及Hadoop YARN来实现。 Spark on Yarn在Spark0.6时引用,但真正可用是在现在的branch-0.8版本。Spark on Yarn遵循YARN的官方规范实现,得益于Spark天生支持多种Scheduler和Executor的良好设计,对YARN的支持也就非常容易,Spark on Yarn的大致框架图。

 Spark架构图

  • 让Spark运行于YARN上与Hadoop共用集群资源可以提高资源利用率。


编程接口

  • Spark通过与编程语言集成的方式暴露RDD的操作,类似于DryadLINQ和FlumeJava,每个数据集都表示为RDD对象,对数据集的操作就表示成对RDD对象的操作。Spark主要的编程语言是Scala,选择Scala是因为它的简洁性(Scala可以很方便在交互式下使用)和性能(JVM上的静态强类型语言)。
  • Spark和Hadoop MapReduce类似,由Master(类似于MapReduce的Jobtracker)和Workers(Spark的Slave工作节点)组成。用户编写的Spark程序被称为Driver程序,Dirver程序会连接master并定义了对各RDD的转换与操作,而对RDD的转换与操作通过Scala闭包(字面量函数)来表示,Scala使用Java对象来表示闭包且都是可序列化的,以此把对RDD的闭包操作发送到各Workers节点。 Workers存储着数据分块和享有集群内存,是运行在工作节点上的守护进程,当它收到对RDD的操作时,根据数据分片信息进行本地化数据操作,生成新的数据分片、返回结果或把RDD写入存储系统。 

runtime

Scala

Spark使用Scala开发,默认使用Scala作为编程语言。编写Spark程序比编写Hadoop MapReduce程序要简单的多,SparK提供了Spark-Shell,可以在Spark-Shell测试程序。写SparK程序的一般步骤就是创建或使用(SparkContext)实例,使用SparkContext创建RDD,然后就是对RDD进行操作。如:

1     val sc=newSparkContext(master,appName,[sparkHome],[jars])
2     val textFile=sc.textFile("hdfs://.....")
3     textFile.map(....).filter(.....).....

 

Java

  • Spark支持Java编程,但对于使用Java就没有了Spark-Shell这样方便的工具,其它与Scala编程是一样的,因为都是JVM上的语言,Scala与Java可以互操作,Java编程接口其实就是对Scala的封装。如:

  •    JavaSparkContext sc=newJavaSparkContext(...);  
          JavaRDD lines=ctx.textFile("hdfs://...");
          JavaRDD words=lines.flatMap(
            newFlatMapFunction<String,String>(){
               publicIterable call(Strings){
                  returnArrays.asList(s.split(" "));
               }
             }
          );

     

Python

  • 现在Spark也提供了Python编程接口,Spark使用py4j来实现python与java的互操作,从而实现使用python编写Spark程序。Spark也同样提供了pyspark,一个Spark的python shell,可以以交互式的方式使用Python编写Spark程序。 如:

1 from pyspark import SparkContext
2     sc=SparkContext("local","Job Name",pyFiles=['MyFile.py','lib.zip','app.egg'])
3     words=sc.textFile("/usr/share/dict/words")
4     words.filter(lambdaw:w.startswith("spar")).take(5)

 


使用示例

Standalone模式

  • 为方便Spark的推广使用,Spark提供了Standalone模式,Spark一开始就设计运行于Apache Mesos资源管理框架上,这是非常好的设计,但是却带了部署测试的复杂性。为了让Spark能更方便的部署和尝试,Spark因此提供了Standalone运行模式,它由一个Spark Master和多个Spark worker组成,与Hadoop MapReduce1很相似,就连集群启动方式都几乎是一样。
  • 以Standalone模式运行Spark集群

    • 下载Scala2.9.3,并配置SCALA_HOME
    • 下载Spark代码(可以使用源码编译也可以下载编译好的版本)这里下载 编译好的版本(http://spark-project.org/download/spark-0.7.3-prebuilt-cdh4.tgz
    • 解压spark-0.7.3-prebuilt-cdh4.tgz安装包
    • 修改配置(conf/*) slaves: 配置工作节点的主机名 spark-env.sh:配置环境变量。

       

      1 SCALA_HOME=/home/spark/scala-2.9.3
      2 JAVA_HOME=/home/spark/jdk1.6.0_45
      3 SPARK_MASTER_IP=spark1            
      4 SPARK_MASTER_PORT=30111
      5 SPARK_MASTER_WEBUI_PORT=30118
      6 SPARK_WORKER_CORES=2SPARK_WORKER_MEMORY=4g
      7 SPARK_WORKER_PORT=30333
      8 SPARK_WORKER_WEBUI_PORT=30119
      9 SPARK_WORKER_INSTANCES=1

       

    • 把Hadoop配置copy到conf目录下

    • 在master主机上对其它机器做ssh无密码登录

    • 把配置好的Spark程序使用scp copy到其它机器

    • 在master启动集群:$SPARK_HOME/start-all.sh 

yarn模式

  • Spark-shell现在还不支持Yarn模式,使用Yarn模式运行,需要把Spark程序全部打包成一个jar包提交到Yarn上运行。目录只有branch-0.8版本才真正支持Yarn。
  • 以Yarn模式运行Spark

    • 下载Spark代码:git clonegit://github.com/mesos/spark 

    • 切换到branch-0.8

      cd  spark
      git  checkout - b yarn -- track  origin / yarn
    • 使用sbt编译Spark并

      $SPARK_HOME/sbt/sbt
      >package
      >assembly
    • 把Hadoop yarn配置copy到conf目录下

    • 运行测试

SPARK_JAR=./core/target/scala-2.9.3/spark-core-assembly-0.8.0-SNAPSHOT.jar\
./run spark.deploy.yarn.Client--jar examples/target/scala-2.9.3/\
--classspark.examples.SparkPi--args yarn-standalone

 

使用Spark-shell

  • Spark-shell使用很简单,当Spark以Standalon模式运行后,使用$SPARK_HOME/spark-shell进入shell即可,在Spark-shell中SparkContext已经创建好了,实例名为sc可以直接使用,还有一个需要注意的是,在Standalone模式下,Spark默认使用的调度器的FIFO调度器而不是公平调度,而Spark-shell作为一个Spark程序一直运行在Spark上,其它的Spark程序就只能排队等待,也就是说同一时间只能有一个Spark-shell在运行。
  • 在Spark-shell上写程序非常简单,就像在Scala Shell上写程序一样。

    1     scala>val textFile=sc.textFile("hdfs://hadoop1:2323/user/data")
    2     textFile:spark.RDD[String]=spark.MappedRDD@2ee9b6e3
    3  
    4     scala>textFile.count()// Number of items in this RDD
    5     res0:Long=21374
    6  
    7     scala>textFile.first()// First item in this RDD
    8     res1:String=# Spark

编写Driver程序

    • 在Spark中Spark程序称为Driver程序,编写Driver程序很简单几乎与在Spark-shell上写程序是一样的,不同的地方就是SparkContext需要自己创建。如WorkCount程序如下:

       

       1 import spark.SparkContext
       2 import SparkContext._
       3  
       4 objectWordCount{
       5   def main(args:Array[String]){
       6     if(args.length==0){
       7       println("usage is org.test.WordCount <master>")
       8     }
       9     println("the args: ")
      10     args.foreach(println)
      11  
      12     val hdfsPath="hdfs://hadoop1:8020"
      13  
      14     // create the SparkContext, args(0)由yarn传入appMaster地址
      15     val sc=newSparkContext(args(0),"WrodCount",
      16     System.getenv("SPARK_HOME"),Seq(System.getenv("SPARK_TEST_JAR")))
      17  
      18     val textFile=sc.textFile(hdfsPath+args(1))
      19  
      20     val result=textFile.flatMap(line=>line.split("\\s+"))
      21         .map(word=>(word,1)).reduceByKey(_+_)
      22  
      23     result.saveAsTextFile(hdfsPath+args(2))
      24   }
      25 }

       


转自:http://www.cnblogs.com/vincent-hv/p/3324224
2019-03-02 23:41

知识点

相关教程

更多

从Storm和Spark 学习流式实时分布式计算的设计

0. 背景 最近我在做流式实时分布式计算系统的架构设计,而正好又要参加CSDN博文大赛的决赛。本来想就写Spark源码分析的文章吧。但是又想毕竟是决赛,要拿出一些自己的干货出来,仅仅是源码分析貌似分量不够。因此,我将最近一直在做的系统架构的思路整理出来,形成此文。为什么要参考Storm和Spark,因为没有参照效果可能不会太好,尤其是对于Storm和Spark由了解的同学来说,可能通过对比,更能体

【转】storm分布式流计算引擎

场景 伴随着信息科技日新月异的发展,信息呈现出爆发式的膨胀,人们获取信息的途径也更加多样、更加便捷,同时对于信息的时效性要求也越来越高。举个搜索场景中的例子,当一个卖家发布了一条宝贝信息时,他希望的当然是这个宝贝马上就可以被卖家搜索出来、点击、购买啦,相反,如果这个宝贝要等到第二天或者更久才可以被搜出来,估计这个大哥就要骂娘了。再举一个推荐的例子,如果用户昨天在淘宝上买了一双袜子,今天想买一副泳镜

转 Apache Kafka:下一代分布式消息系统

简介  Apache Kafka是分布式发布-订阅消息系统。它最初由LinkedIn公司开发,之后成为Apache项目的一部分。Kafka是一种快速、可扩展的、设计内在就是分布式的,分区的和可复制的提交日志服务。 Apache Kafka与传统消息系统相比,有以下不同:   它被设计为一个分布式系统,易于向外扩展; 它同时为发布和订阅提供高吞吐量; 它支持多订阅者,当失败时能自动平衡消费者; 它将

solr的用分布式搜索(转)

solr的用分布式搜索(转)      2010-03-11 13:05:56|分类: solr  |字号订阅    直到solr的 1.3 版本,Solr 才能通过复制轻松进行扩展,以满足更大容量的查询需求。但是,如果没有应用程序帮助完成大部分工作,要提供超出单个机器的承载额度的索引还是很困难的。例 如,通常可以在 Solr 中设置多个服务器,其中每一个服务器都有自己的索引,然后再让应用程序来管

分布式文件系统Hadoop

官方文档地址   http://   Hadoop.apache.org/common/docs/r1.0.3/    下载到:jdk-6u26-linux-x64.bin andhadoop-1.0.3.tar.gz 它有三种模式: Local (Standalone) Mode    #本地节点 Pseudo-Distributed Mode   #伪分布式 Fully-Distributed

为什么Hadoop一定是分布式计算的未来?

前言: 最近对于Hadoop看得比较多,对它的发展也比较关心,最近了解得越多,也就越相信Hadoop的未来,这里写一篇文章与大家分享分享,为什么我相信Hadoop一定是分布式计算的未来。 写在前面的话: 今天听同事分享了一篇很有意思的讲座,叫做"Why Map-Reduce Is Not The Solution To Your Big-Data Problem"(为什么Map

使用Linux 和Hadoop 进行分布式计算[图文]

人们每天都依赖搜索引擎以从 Internet 的海量数据中找到特定的内容,但您曾经想过这些搜索是如何执行的吗?一种方法是 Apache 的 Hadoop,它是一个能够对海量数据进行分布式处理的软件框架。Hadoop 的一个应用是并行索引 Internet Web 页面。Hadoop 是一个受到 Yahoo!、Google 和 IBM 等公司支持的 Apache 项目。本文将介绍 Hadoop 框架

storm分布式流计算引擎

场景  伴随着信息科技日新月异的发展,信息呈现出爆发式的膨胀,人们获取信息的途径也更加多样、更加便捷,同时对于信息的时效性要求也越来越高。举个搜索场景中的例子,当一个卖家发布了一条宝贝信息时,他希望的当然是这个宝贝马上就可以被卖家搜索出来、点击、购买啦,相反,如果这个宝贝要等到第二天或者更久才可以被搜出来,估计这个大哥就要骂娘了。再举一个推荐的例子,如果用户昨天在淘宝上买了一双袜子,今天想买一副泳

Hadoop分布式文件系统HDFS

HDFS,Hadoop Distributed File System,是一个设计用来保存大数据量的数据的分布式文件系统(TB级甚至是PB级),并提供快速访问这些数据的能力,数据通过冗余的方式保存在多台机器上,以来保存对失败的容错性和并行应用的高度可用性。 HDFS的设计相对其它分布式文件系统,比如NFS,对几个问题是健壮的,特别市: 1.HFDS设计用来保存非常大的数据量信息,就需要将数据分布到

Hadoop (HDFS)分布式文件系统基本操作

Hadoop HDFS提供了一组命令集来操作文件,它既可以操作Hadoop分布式文件系统,也可以操作本地文件系统。但是要加上theme(Hadoop文件系统用hdfs://,本地文件系统用file://) 1. 添加文件和目录 比如我们要在Hadoop 文件系统中创建一个目录叫 /user/hadoop-user ,则 hadoop fs -mkdir /user/hadoop-user 要查看我

Hadoop HDFS分布式文件系统

引言:我们维护   Hadoop系统的时候,必不可少需要对HDFS分布式文件系统做操作,例如拷贝一个文件/目录,查看HDFS文件系统目录下的内容,删除HDFS文件系统中的内容(文件/目录),还有HDFS管理信息,单独启动停止 namenode datanode jobtracker tasktracker等等一系列的操作。大家跟着做一遍呢!就会对HDFS的体系架构有更加深入的理解,不多说我们开始吧

用Akka构建一个简易的分布式文件系统

本来初期打算用Hadoop 2,可是后来有限的服务器部署了Solr Cloud,各种站点,发现资源不够了,近10T的文件,已经几乎把服务器的磁盘全部用光。想来想去,由于目前架构基于Scala的,所以还是用Scala Akka实现了一个简单版本的分布式文件系统。 Scala版本是2.10.3:http://www.scala-lang.org,Akka版本是2.2.3:http://akka.io。

Storm分布式实时流计算框架相关技术总结

Storm作为一个开源的分布式实时流计算框架,其内部实现使用了一些常用的技术,这里是对这些技术及其在Storm中作用的概括介绍。以此为基础,后续再深入了解Storm的内部实现细节。 1. Zookeeper集群 Zookeeper是一个针对大型分布式系统的可靠协调服务系统,其采用类似Unix文件系统树形层次结构的数据模型(如:/zoo/a,/zoo/b),节点内可存储少量数据(<1M,当节点

分布式知识的总结(V1.0) [转]

1:分布式理论 CAP(Eric Brewer) Web服务无法同时满足以下3个属性     Consistency(一致性),数据一致更新,所有数据变动都是同步的   Availability(可用性),每个操作都必须以可预期的响应结束   Partition tolerance(分区容错性),即使出现单个组件无法可用,操作依然可以完成   在任何数据库设计中,一个Web应用至多只能同时支持上面

分布式检索系统 ElasticSearch 和 SenseiDB 比较

从网上找了一些关于这两个系统的介绍和比较的文章  1)senseidb VS. Solr VS. elasticsearch (***Incomplete***)  现阿里巴巴平台技术部高级技术专家王福强写的SenseiDB,Solr和ElasticSearch三者的比较  SenseiDB    特点  * 主要解决高速索引更新的问题; 底层是zoie的“2-swapping-in-memory

最新教程

更多

java线程状态详解(6种)

java线程类为:java.lang.Thread,其实现java.lang.Runnable接口。 线程在运行过程中有6种状态,分别如下: NEW:初始状态,线程被构建,但是还没有调用start()方法 RUNNABLE:运行状态,Java线程将操作系统中的就绪和运行两种状态统称为“运行状态” BLOCK:阻塞状态,表示线程阻塞

redis从库只读设置-redis集群管理

默认情况下redis数据库充当slave角色时是只读的不能进行写操作,如果写入,会提示以下错误:READONLY You can't write against a read only slave.  127.0.0.1:6382> set k3 111  (error) READONLY You can't write against a read only slave. 如果你要开启从库

Netty环境配置

netty是一个java事件驱动的网络通信框架,也就是一个jar包,只要在项目里引用即可。

Netty基于流的传输处理

​在TCP/IP的基于流的传输中,接收的数据被存储到套接字接收缓冲器中。不幸的是,基于流的传输的缓冲器不是分组的队列,而是字节的队列。 这意味着,即使将两个消息作为两个独立的数据包发送,操作系统也不会将它们视为两个消息,而只是一组字节(有点悲剧)。 因此,不能保证读的是您在远程定入的行数据

Netty入门实例-使用POJO代替ByteBuf

使用TIME协议的客户端和服务器示例,让它们使用POJO来代替原来的ByteBuf。

Netty入门实例-时间服务器

Netty中服务器和客户端之间最大的和唯一的区别是使用了不同的Bootstrap和Channel实现

Netty入门实例-编写服务器端程序

channelRead()处理程序方法实现如下

Netty开发环境配置

最新版本的Netty 4.x和JDK 1.6及更高版本

电商平台数据库设计

电商平台数据库表设计:商品分类表、商品信息表、品牌表、商品属性表、商品属性扩展表、规格表、规格扩展表

HttpClient 上传文件

我们使用MultipartEntityBuilder创建一个HttpEntity。 当创建构建器时,添加一个二进制体 - 包含将要上传的文件以及一个文本正文。 接下来,使用RequestBuilder创建一个HTTP请求,并分配先前创建的HttpEntity。

MongoDB常用命令

查看当前使用的数据库    > db    test  切换数据库   > use foobar    switched to db foobar  插入文档    > post={"title":"领悟书生","content":"这是一个分享教程的网站","date":new

快速了解MongoDB【基本概念与体系结构】

什么是MongoDB MongoDB is a general purpose, document-based, distributed database built for modern application developers and for the cloud era. MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。

windows系统安装MongoDB

安装 下载MongoDB的安装包:mongodb-win32-x86_64-2008plus-ssl-3.2.10-signed.msi,按照提示步骤安装即可。 安装完成后,软件会安装在C:\Program Files\MongoDB 目录中 我们要启动的服务程序就是C:\Program Files\MongoDB\Server\3.2\bin目录下的mongod.exe,为了方便我们每次启动,我

Spring boot整合MyBatis-Plus 之二:增删改查

基于上一篇springboot整合MyBatis-Plus之后,实现简单的增删改查 创建实体类 添加表注解TableName和主键注解TableId import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.annotations.TableName;
import com.baom

分布式ID生成器【snowflake雪花算法】

基于snowflake雪花算法分布式ID生成器 snowflake雪花算法分布式ID生成器几大特点: 41bit的时间戳可以支持该算法使用到2082年 10bit的工作机器id可以支持1024台机器 序列号支持1毫秒产生4096个自增序列id 整体上按照时间自增排序 整个分布式系统内不会产生ID碰撞 每秒能够产生26万ID左右 Twitter的 Snowflake分布式ID生成器的JAVA实现方案