sparkjava,sparkjava框架

发布时间:2023-01-09

本文目录一览:

  1. spark和hadoop的区别
  2. spark java本地环境怎么搭建
  3. spark和java的关系
  4. Spark 中用 Scala 和 java 开发有什么区别

spark和hadoop的区别

spark和hadoop的区别:诞生的先后顺序、计算不同、平台不同。 hadoop属于第一代开源大数据处理平台,而spark属于第二代。属于下一代的spark肯定在综合评价上要优于第一代的hadoop。 在分布式计算的底层思路上,spark和hadoop其实是极为相似的,即mapreduce分布式运算模型:将运算分成两个阶段,阶段1-map,负责从上游拉取数据后各自运算,然后将运算结果shuffle给下游的reduce,reduce再各自对通过shuffle读取来的数据进行聚合运算。spark和hadoop在分布式计算的具体实现上又有区别;hadoop中的mapreduce运算框架,一个运算job进行一次map-reduce的过程;而spark的一个job中,可以将多个map-reduce过程级联进行。 平台不同spark和hadoop区别是,spark是一个运算平台,而hadoop是一个复合平台(包含运算引擎,还包含分布式文件存储系统,还包含分布式运算的资源调度系统),所以,spark跟hadoop来比较的话,主要是比运算这一块。大数据技术发展到目前这个阶段,hadoop主要是它的运算部分日渐式微,而spark目前如日中天,相关技术需求量大,offer好拿。

spark java本地环境怎么搭建

  1. 环境准备
    • Eclipse 请不要使用最新的 Neon(4.6),太多Bug了。还是使用最新的 Mars(4.5) 系列吧。
    • JDK 版本8.x(Linux推荐Oracle,没有测试过OpenJDK)。
    • 因为只是用Java,因此无需安装Scala及其相应的插件。
  2. 创建一个新的maven项目
  3. pom.xml 配置如下依赖:
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-client</artifactId>
        <version>2.6.0</version>
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>*</artifactId>
    </dependency>
    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-core_2.10</artifactId>
        <version>1.6.1</version>
    </dependency>
    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-streaming_2.10</artifactId>
        <version>1.6.1</version>
    </dependency>
    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-mllib_2.10</artifactId>
        <version>1.6.1</version>
    </dependency>
    <dependency>
        <groupId>org.scala-lang</groupId>
        <artifactId>scala-library</artifactId>
        <version>2.10.5</version>
    </dependency>
    
    这里只列出了必要的几个依赖,其他的请根据你自己的项目需求添加。
  4. 使用maven打包
    • 在Goal中填写 clean package 即可。
    • 如果在修改了与Spark相关的代码之后,需要重新编译打包才行,否则会有异常提示。
  5. 代码编写注意事项: 在创建JavaSparkContext的时候,需要把自己加进去:
    public static JavaSparkContext getContext(String taskName) {
        JavaSparkContext sc = new JavaSparkContext(SparkConnUtils.getSparkConf(taskName));
        sc.addJar("target/sparkstat-0.0.1-SNAPSHOT.jar");
        return sc;
    }
    
    其中 target/sparkstat-0.0.1-SNAPSHOT.jar 是maven运行之后生成的完整的jar包。

spark和java的关系

通常大家只是说Spark是基于内存计算的,速度比MapReduce要快。或者说内存中迭代计算。其实我们要抓住问题的本质。总结有以下几点:

  1. Spark vs MapReduce ≠ 内存 vs 磁盘
    • 其实Spark和MapReduce的计算都发生在内存中,区别在于:
      • MapReduce通常需要将计算的中间结果写入磁盘,然后还要读取磁盘,从而导致了频繁的磁盘IO。
      • Spark则不需要将计算的中间结果写入磁盘,这得益于Spark的RDD(弹性分布式数据集,很强大)和DAG(有向无环图),其中DAG记录了job的stage以及在job执行过程中父RDD和子RDD之间的依赖关系。中间结果能够以RDD的形式存放在内存中,且能够从DAG中恢复,大大减少了磁盘IO。
  2. Spark vs MapReduce Shuffle的不同
    • Spark和MapReduce在计算过程中通常都不可避免的会进行Shuffle,两者至少有一点不同:
      • MapReduce在Shuffle时需要花费大量时间进行排序,排序在MapReduce的Shuffle中似乎是不可避免的。
      • Spark在Shuffle时则只有部分场景才需要排序,支持基于Hash的分布式聚合,更加省时。
  3. 多进程模型 vs 多线程模型的区别
    • MapReduce采用了多进程模型,而Spark采用了多线程模型。
      • 多进程模型的好处是便于细粒度控制每个任务占用的资源,但每次任务的启动都会消耗一定的启动时间。就是说MapReduce的Map Task和Reduce Task是进程级别的,而Spark Task则是基于线程模型的,mapreduce中的map和reduce都是jvm进程,每次启动都需要重新申请资源,消耗了不必要的时间(假设容器启动时间大概1s,如果有1200个block,那么单独启动map进程事件就需要20分钟)。
      • Spark则是通过复用线程池中的线程来减少启动、关闭task所需要的开销。(多线程模型也有缺点,由于同节点上所有任务运行在一个进程中,因此会出现严重的资源争用,难以细粒度控制每个任务占用资源) 总结: 关于Spark为什么比MapReduce快,或者Spark速度快于MapReduce的原因,总结至少有这几点不同之处吧。

Spark 中用 Scala 和 java 开发有什么区别

  1. 构建系统的选择,sbt更合适用来构建Scala工程,maven更合适用来构建Java工程。
  2. 对于spark中的API来说,Java和Scala有差别,但差别并不大。
  3. 如果用Scala开发spark原型程序,可以用spark-shell“打草稿”,或者直接使用spark-shell做交互式实时查询。
  4. 用Scala代码量将减少甚至一个数量级,不过Scala的使用门槛较高。 建议: 使用Scala构建spark作业,因为spark本身为sbt所构建,同时使用Scala开发spark作业将有助于理解spark的实现机制。
  • Scala相对Java语法更丰富,更简洁,写起来更像脚本,能够提高开发效率。
  • 使用Java的话代码会规范些,不过太臃肿,代码量更大。
  • 另外Spark基本使用函数式编程,使用Java的话可能需要写一大堆匿名类,而Scala只需要一个lambda表达式。
  • Java不支持自动类型推导,RDD类基本都是范型,声明时需要写一串类类型,而Scala基本可以省略变量类型。
  • 另外,如果喜欢,可以混合Java和Scala,因为二者最终都是编译成class文件,使用Scala能够随意调用Java实现的类和方法。 从表面上看,无论采用哪种语言,都能完成一样的功能,只是代码量有多有少,开发人员根据自己的情况选择使用Java还是Scala都可。 据说目前最新的Java 8已经支持函数式接口了,Java 9也将推出Java Shell功能,慢慢地会变得和Scala一样简洁。