Spark复习大纲,有需要的小伙伴可以点个赞找我私信

REVIEW

COVER: chapt1-chapt6

QUESTION TYPE:

选择,填空,简答,阅读程序(写结果),编程题(代码补全)

Chap1

Hadoop 生态系统的组件

Hadoop除了有两大核心组件HDFS 和MapReduce之外,还包括yarn、hbase、hive、pig、mahout、zookeeper、sqoop、flume、Apache Ambari等功能组件。

hadoop生态系统包含哪些组件(hadoop大数据平台常用组件)(3)

① HDFS:hadoop分布式文件系统,可以运行在大型的廉价计算机集群上,并以流的方式读取和处理海量文件。HDFS要掌握的概念有NameNode、DataNode和Secondary Namenode,后面会有专门章节为大家讲解。

② Yarn:资源调度和管理框架,其中包含ResourceManager、ApplicationMaster和NodeManager。ResourceManager负责资源管理,ApplicationMaster负责任务调度和监控,NodeManager 负责执行任务。

③ MapReduce:分布式并行编程框架,核心思想是“分而治之”。MapReduce=Map+Reduce。Map函数负责分片的工作,reduce函数负责整合归约。

④ HBase:是谷歌bigtable的开源实现。它区别于传统关系数据库的一点是:基于列式存储。传统数据库是基于行的存储,而HBase是基于列的存储,具有高效可靠的处理非结构化数据的能力。

⑤ Hive:是基于hadoop的数据仓库工具,能对数据集进行简单处理,它拥有类似SQL语言的查询语言hive-sql。

⑥ Pig:是一种数据流语言,提供了类似sql的语言pig latin,可以用来查询半结构化数据集。

⑦ Mahout:是Apache的一个开源项目,提供一些分类、聚类、过滤等等机器学习领域经典算法。

⑧ Zookeeper:是个高效的可靠的分布式协同工作系统。

⑨ Sqoop:sql-to-hadoop的缩写,意思就是在关系数据库与hadoop之间做数据交换。

⑩ Flume:海量日志收集、聚合、传输系统。它也能对数据进行简单的处理。

⑪ Apache Ambari:是一种支持Apache Hadoop集群的安装、部署、配置和管理的工具。

Hadoop 4v?

volume(大量数据):90%的数据是过去两年产生的

velocity(速度快):数据产生速度快,时效性高

varity(多样化):数据的来源和种类多样,数据种类包括结构化数据、半结构化数据、非结构化数据,表现为日志、音频、视频、图片,地理位置信息等

value(价值密度低):单个数据意义不大,需要大量数据进行归纳总结出规则

固有特征

时效性:一段时间在某一时间段内产生的已知的数据,并且决策在哪些时间内具有价值的属性。

不可变性:已产生的数据不会改变,我们将大数据的变化视为新数据条目的产生,而不是现有条目的更新。

————————————————

版权声明:本文为CSDN博主「百夜﹍悠ゼ」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/AlierSnow/article/details/106491153

Hadoop的核心组件有?

Hadoop中的MR

MapReduce是一种计算模型,用以进行大数据量的计算。其中Map对数据集上的独立元素进行指定的操作,生成键-值对形式中间结果。Reduce则对中间结果中相同“键”的所有“值”进行规约,以得到最终结果。MapReduce这样的功能划分,非常适合在大量计算机组成的分布式并行环境里进行数据处理。

MR VS SPARK?

Spark能更好地适用于数据挖掘与机器学习等需要迭代的MapReduce的算法。mr是多进程单线程模型,而spark是多进程多线程模型;mr应用程序由多个独立的Task进程组成,每个task相互独立,申请资源和申请数据,再到计算完成结果存储都是独立进行的;Spark应用程序的运行环境是由多个独立的executer进程构建的临时资源池构成的,而每个executer又分为多个task进程,拥有独立的mapshuffer,reduceshuffer,而且同一个executer中的数据可以进行复用,大大提高了数据和资源的利用率,节省了大量的频繁申请资源,调用数据所浪费的性能。

Chap2

SCALA的特性和优点

1.Scala是面向对象的 Scala是一个纯面向对象语言,在某种意义上来讲所有数值都是对象。对象的类型和行为是由class和trait来描述的。Class的抽象可由子类化和一种灵活的基于mixin的组合机制(它可作为多重继承的简单替代方案)来扩展。

2.Scala是函数式的 Scala还是一个函数式语言,在某种意义上来讲所有函数都是数值。Scala为定义匿名函数提供了一种轻量级的语法,它支持高阶(higher-order)函数、允 许函数嵌套、支持局部套用(currying)。Scala的case类及其内置支持的模式匹配模型代数类型在许多函数式编程语言中都被使用。

3.Scala是静态类型的 Scala配备了一套富有表现力的类型系统,该抽象概念以一种安全的和一致的方式被使用。

4.Scala是可扩展的 Scala的设计承认了实践事实,领域特定应用开发通常需要领域特定语言扩展。Scala提供了一个独特的语言组合机制,这可以更加容易地以类库的形式增加新的语言结构: 任何方式可以被用作中缀(infix)或后缀(postfix)操作符闭包按照所期望的类型(目标类型)自动地被构造 两者结合使用可方便地定义新语句,无需扩展语法,也无需使用类似宏的元编程工具。

5.Scala可与Java和.NET进行互操作 Scala设计时就考虑了与流行编程环境良好交互,如Java 2运行时环境(JRE)和 .NET框架(CLR)。特别是与主流面向对象语言,如Java和C#尽量无缝交互。Scala有像Java和C#一样的编译模型(独立编译,动态装载类),允许访问成千上万的高质量类库。

Scala控制结构for 比如Guard?

Scala中的yield的是把每次迭代中的有关值,并逐一存入到一个集合中,返回值类型和for循环中的返回值类型一致

Scala数据结构

1、种类

scala的数据结构有:数组Array、元组Tuple、容器Collection、序列Sequence、集合Set、映射Map、迭代器Iterator

2、数组

创建方式 (创建一个长度为10类型为Int的数组

1 val arr = new Array[Int](10) 默认初始化为0

2 val arr = Array(0,0,0,0,0,0,0,0,0,0) 自动推断数据类型

3 val arr = Array.ofDim[Int](3,4) 创建三行四列数组

4 val arr = new Array[Array[Int]](3)

索引 arr(0)、arr(1)… 下标从0开始

数组中每个元素的数据类型必须相同

3、元组

创建方式

val tuple = (“a”,1,1.234)

索引

tuple._1、tuple._2… 下标从1开始

元组允许元素具有不同的数据类型

5、序列(Sequence)

列表(List)

创建:val l1 = List(“spark”,“hadoop”,“hbase”)、val l1 = “hbase”::“hadoop”::“spark”::Nil

索引:l1(0)、l1.head(取列表头元素)、l1.tail(获取除头元素外的数据)

拼接方式:val l2 = “flink”::l1 (只能在表头加)

列表不可修改,内部元素数据类型一致

向量(Vector)

创建 val vec1 = Vector(1,2,3)

索引:vec1(0)

拼接方式 val vec2 = 3+:4+:vec1(头);val vec3 = vec1 :+ 12(尾)

Range 不可变数字等差序列

创建 Range(1,2,3,4,5):

val r = new Range(1,5,1)

val r = 1 to 5 by 1

val r = 1 until 6(不包含尾)

集合(Set)

集合无序、无重复元素

创建 val myset = Set(“Hadoop”,“Spark”)

映射(Map) 键值对

创建:val map = (“a”->1,“b”->"2)

val map = ((“a”,1),(“b”,2))

索引:map(key)

添加:map + ((“c”,3),(“d”,4))

集合Set,List,iterator,MAP

1、List集合

1.1概念

List继承自Collection接口。List是一种有序集合,List中的元素可以根据索引(顺序号:元素在集合中处于的位置信息)进行取得/删除/插入操作。

跟Set集合不同的是,List允许有重复元素。对于满足e1.equals(e2)条件的e1与e2对象元素,可以同时存在于List集合中。当然,也有List的实现类不允许重复元素的存在。同时,List还提供一个listIterator()方法,返回一个ListIterator接口对象,和Iterator接口相比,ListIterator添加元素的添加,删除,和设定等方法,还能向前或向后遍历,具体的方法往下看。List接口的实现类主要有ArrayList,LinkedList,Vector,Stack等。

1.2 ArrayList类

ArrayList实现了可变大小的数组。它允许所有元素,包括null。ArrayList没有同步。size,isEmpty,get,set方法运行时间为常数。但是add方法开销为分摊的常数,添加n个元素需要O(n)的时间。其他的方法运行时间为线性。

每个ArrayList实例都有一个容量(Capacity),即用于存储元素的数组的大小。这个容量可随着不断添加新元素而自动增加,但是增长算法并没有定义。当需要插入大量元素时,在插入前可以调用ensureCapacity方法来增加ArrayList的容量以提高插入效率。

1.2.1 ArrayList与Vector的区别

  ArrayList Vector

性能 采用异步处理方式,性能高 采用同步处理方式,性能低

线程安全 非线程安全 线程安全,需要线程安全时使用

1.2.2 主要方法

public boolean add(Object?o):添加元素

public void add(int index, Object element):在指定位置添加元素

public Iterator iterator():取得Iterator对象便于遍历所有元素

public Object get(int?index):根据索引获取指定位置的元素

public Object set(int index,Object element):替换掉指定位置的元素

1.2.3 排序方法

Collections.sort(List list):对List的元素进行自然排序

Collections.sort(List list, Comparator comparator):对List中的元素进行客户化排序

1.3 LinkedList类

     LinkedList实现了List接口,允许null元素。此外LinkedList提供额外的get,remove,insert方法在LinkedList的首部或尾部。这些操作使LinkedList可被用作堆栈(stack),队列(queue)或双向队列(deque)。

    注意LinkedList没有同步方法。如果多个线程同时访问一个List,则必须自己实现访问同步。一种解决方法是在创建List时构造一个同步的List:List list = Collections.synchronizedList(new LinkedList(...));

2、Set集合

Set接口中不能加入重复元素,但是可以排序。

Set接口常用子类

散列排序:HashSet,不能排序,存入便打乱数据

有序排序:TreeSet,可以排序,存入便自动排序

3、Iterator(迭代器)

集合输出的标准操作。标准做法,使用iterator

3.1 操作原理

Iterator是专门的迭代输出接口,迭代输出就是想元素一个个进行判断,判断其是否有内容,如果有内容则把内容取出

使用方法:Iterator iter = list.iterator();

注:iterator使用remove时,不能通过list等集合删除元素

3.2遍历ArrayList

import java.util.*;

public class Test{

 public static void main(String[] args) {

     List<String> list=new ArrayList<String>();

     list.add("Hello");

     list.add("World");

     list.add("HAHAHAHA");

     //第一种遍历方法使用foreach遍历List

     for (String str : list) {    //也可以改写for(int i=0;i<list.size();i++)这种形式

        System.out.println(str);

     }

     //第二种遍历,把链表变为数组相关的内容进行遍历

     String[] strArray=new String[list.size()];

     list.toArray(strArray);

     for(int i=0;i<strArray.length;i++){ //这里也可以改写为  foreach(String str:strArray)这种形式

        System.out.println(strArray[i]);

     }

     

    //第三种遍历 使用迭代器进行相关遍历

     Iterator<String> ite=list.iterator();

     while(ite.hasNext()){//判断下一个元素之后有值

         System.out.println(ite.next());

     }

 }

}

4、Map

4.1 常用方法

map.contains(“key”)判断key是否存在

map.containsValue(“值”)判断值是否存在

map.keySet();获取所有key的集合:Set集合

map.values();获取所有值的集合:Collection集合

import java.util.*;

public class Test{

     public static void main(String[] args) {

      Map<String, String> map = new HashMap<String, String>();

      map.put("1", "value1");

      map.put("2", "value2");

      map.put("3", "value3");

      

      //第一种:普遍使用,二次取值

      System.out.println("通过Map.keySet遍历key和value:");

      for (String key : map.keySet()) {

       System.out.println("key= "+ key + " and value= " + map.get(key));

      }

      

      //第二种

      System.out.println("通过Map.entrySet使用iterator遍历key和value:");

      Iterator<Map.Entry<String, String>> it = map.entrySet().iterator();

      while (it.hasNext()) {

       Map.Entry<String, String> entry = it.next();

       System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());

      }

      

      //第三种:推荐,尤其是容量大时

      System.out.println("通过Map.entrySet遍历key和value");

      for (Map.Entry<String, String> entry : map.entrySet()) {

       System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());

      }

    

      //第四种

      System.out.println("通过Map.values()遍历所有的value,但不能遍历key");

      for (String v : map.values()) {

       System.out.println("value= " + v);

      }

     }

}

5、ArrayList与LinkedList的区别

ArrayList 是 List 接口的一种实现,它是使用数组来实现的。

LinkedList 是 List 接口的一种实现,它是使用链表来实现的。

ArrayList 遍历和查找元素比较快。LinkedList 遍历和查找元素比较慢。

ArrayList 添加、删除元素比较慢。LinkedList 添加、删除元素比较快。

6、map.entrySet() 和 keySet()

如果遍历 hashMap() 时 entrySet() 方法是将 key 和 value 全部取出来,所以性能开销是可以预计的, 而 keySet() 方法进行遍历的时候是根据取出的 key 值去查询对应的 value 值, 所以如果 key 值是比较简单的结构(如 1,2,3...)的话性能消耗上是比 entrySet() 方法低, 但随着 key 值得复杂度提高 entrySet() 的优势就会显露出来。

综合比较在只遍历 key 的时候使用 keySet(), 在只遍历 value 的是使用 values() 方法, 在遍历 key-value 的时候使用 entrySet() 是比较合理的选择。

如果遍历 TreeMap 的时候, 不同于 HashMap 在遍历 ThreeMap 的 key-value 时候务必使用 entrySet() 它要远远高于其他两个的性能, 同样只遍历 key 的时候使用 keySet(), 在只遍历 value 的是使用 values() 方法对于 TreeMap 也同样适用。

Chap3

Spark的组件,RDD的特点,

  • 分区永远不会跨越多台机器,即同一分区中的数据始终保证在同一台机器上。
  • 群集中的每个节点包含一个或多个分区。
  • 分区的数目是可以设置的。 默认情况下,它等于所有执行程序节点上的核心总数。 例如。 6个工作节点,每个具有4个核心,RDD将被划分为24个分区。

关于什么是task

Task是可执行的实体。是Spark任务调度的最小单元。每个Task都对应一个RDD的分区,也对应Executor任务执行线程池中的一个执行线程。

什么又是Executor?

Executor是一个比Windows“运行”功能更为强大、自定义更强的工具,如果你需要经常查找程序或者想快速运行程序这个功能比较适合你。功能大致有:自定义关键字、历史、自动完成、下拉菜单,Executor会自动匹配关键字,并提供下拉列表选项

RDD的惰性机制?

RDD 采用了惰性调用,即在 RDD 的执行过程中,所有的转换操作都不会执行真正的操作,只会记录依赖关系,而只有遇到了行动操作,才会触发真正的计算,并根据之前的依赖关系得到最终的结果。

DAG又是啥?

RDD的依赖关系?

Chap5

RDD的创建?how?

使用程序中的集合创建RDD,主要用于进行测试,可以在实际部署到集群运行之前,自己使用集合构造一些测试数据,来测试后面的spark应用程序的流程。

使用本地文件创建RDD,主要用于临时性地处理一些存储了大量数据的文件

使用HDFS文件创建RDD,是最常用的生产环境的处理方式,主要可以针对HDFS上存储的数据,进 行离线批处理操作

、Spark shell里的SC指的是?

spark = SparkSession.builder.enableHiveSupport().appName("GBDT").getOrCreate()

spark.sparkContext.setLogLevel("Error")

sc = spark.sparkContext

RDD的操作

一、 RDD创建

1.从本地文件系统中加载数据创建RD从HDFS加载数据创建RDD

 

 

2.启动hdfs

 

 

3.上传文件

 

 

 

 4.查看文件

 

 

 

5.停止hdfs

 

 6.通过并行集合(列表)创建RDD

输入列表、字符串、生成数组

 

 

 

二、 RDD操作

转换操作

         

1.filter(func)

显式定义函数
lambda函数

 

 2.map(func)
显式定义函数
lambda函数  

 

 

 

行动操作

1.foreach(print)
 

foreach(lambda a:print(a.upper())

2.collect()

4.

reduceByKey()

统计词频,累加

乘法规则

5. groupByKey()

单词分组

查看分组的内容

分组之后做累加 map

 

 

 

 

 

 6.

sortByKey()

词频统计按单词排序

7.

sortBy()

词频统计按词频排序

 

 8.

RDD写入文本文件

 

 

Chap6

什么是SHARK,shark的特点

Shark是一个新的数据分析系统,在集群上进行查询处理和复杂分析。Shark使用一种新的分布式内存抽象,为SQL查询和复杂分析函数提供了统一的运行引擎,并能够有效的容错。

特点:

1、 物理计划在Spark上执行;

2、 依靠Spark的快速执行、容错性及RDD;

3、 尽可能的充分利用Hive的代码:将Hive生成的逻辑计划转换为Spark的执行图(execution graph);

4、 与Hive的兼容性:无需修改就可以利用hive的metadata在HDFS上执行HiveQL。

RDD->data frame 两种转换方法?

1.使用反射来推断包含特定对象类型的RDD的模式(schema)

在你写spark程序的同时,当你已经知道了模式,这种基于反射的 方法可以使代码更简洁并且程序工作得更好.

Spark SQL的Scala接口支持将包含样本类的RDD自动转换SchemaRDD。这个样本类定义了表的模式。给样本类的参数名字通过反射来读取,然后作为列的名字。样本类可以嵌套或者包含复杂的类型如序列或者数组。这个RDD可以隐式转化为一个SchemaRDD,然后注册为一个表,表可以在后续的 sql语句中使用。

关键代码:

2.通过编程接口

这个接口允许你构造一个模式,然后在存在的RDDs上使用它。虽然这种方法更冗长,但是它允许你在运行期之前不知道列以及列 的类型的情况下构造SchemaRDD。

当样本类不能提前确定(例如,记录的结构是经过编码的字符串,或者一个文本集合将会被解析,不同的字段投影给不同的用户),一个SchemaRDD可以通过三步来创建。

从原来的RDD创建一个行的RDD

创建由一个StructType表示的模式与第一步创建的RDD的行结构相匹配

在行RDD上通过createDataFrame方法应用模式

关键代码:

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
### 回答1: 好的,以下是一些你需要知道的Spark知识点: 1. Spark是一个基于内存的分布式计算框架,可以处理大规模数据集。 2. Spark的核心概念是RDD(弹性分布式数据集),它是一个可分区、可并行计算的数据集合。 3. Spark支持多种编程语言,包括Scala、Java、Python和R。 4. Spark可以与多种数据存储系统集成,包括Hadoop HDFS、Cassandra、HBase和Amazon S3等。 5. Spark提供了多种高级API,包括Spark SQL、Spark Streaming和MLlib等,可以用于数据处理、流处理和机器学习等任务。 6. Spark可以在本地模式下运行,也可以在集群模式下运行,支持多种集群管理器,包括Apache Mesos、Hadoop YARN和Standalone等。 7. Spark的性能优于Hadoop MapReduce,因为它可以将数据存储在内存中,从而避免了磁盘I/O的开销。 8. Spark还提供了一些优化技术,包括内存管理、数据分区和任务调度等,可以进一步提高性能。 希望这些知识点对你有所帮助! ### 回答2: 作为一名数据科学家或大数据工程师,掌握分布式计算框架Spark是必不可少的技能之一。Spark具有高效的内存计算能力、易于使用的API、丰富的生态系统等优点,因此它被广泛应用于数据处理、机器学习、图像处理等领域。在掌握Spark的过程中,有一些关键知识点需要牢记。 1. RDD与DataFrame的区别 Spark中最常用的数据结构有两种:RDD和DataFrame。RDD是不可变的分布式数据集,可以被分割并存储在不同的节点上进行处理。DataFrame是一种类似于关系型数据库表的结构,它提供了更高层次的API,可用于数据的查询、筛选和聚合。 2. Lazy Evaluation Spark中的操作具有“惰性求值”的特性,即只有在需要结果时才会实际执行操作。这种特性可以提高Spark的性能,因为它避免了不必要的计算和数据移动。但是,需要注意的是,当我们使用了多个转换操作时,可能会导致Spark在内存中存储所有转换的中间结果,从而导致内存不足的问题。 3. Shuffle的开销 Shuffle是指Spark需要重新分区数据的过程。Shuffle操作通常会导致网络传输和磁盘IO的开销,并且会使Spark的性能下降。因此,我们应尽量避免过多的Shuffle操作,并且优化Shuffle的过程。 4. Spark调优 对于大规模数据处理任务,Spark的性能和稳定性都十分关键。因此,我们需要Spark进行调优,以提高它的性能和减少故障。具体来说,我们可以通过增加内存分配、调整分区数量、合理设置并发度等方式来优化Spark的性能。 总之,掌握这些Spark的关键知识点有助于我们更好地开发和管理Spark应用程序,并在大数据领域中取得更好的成果。 ### 回答3: 作为目前最流行的大数据处理框架之一,Spark已经成为了大家谈论的热点话题。如果你想要学习关于Spark的知识,以下是你必须知道的Spark知识点。 1. RDD:RDD是Spark中最基本的抽象概念,全称是Resilient Distributed Datasets。RDD是一个容错的、可并行计算的数据集合。在Spark中,所有数据都是以RDD的形式出现的。RDD具有不变性,也就是说,RDD一旦被创建,就不可更改。如果需要对RDD进行操作,就需要创建一个新的RDD。 2. 迭代器(Iterator): Spark中的迭代器是一种延迟执行的方式。它允许 Spark 延迟计算,只有到调用 action 操作时才会真正开始计算数据。 3. 数据分区(Data Partitioning):数据分区可以更好的支持并行计算,让计算机更加高效的工作。Spark将数据分解成小块,每块专门分派给一个处理器来处理。分区的数量应该与处理器的数量相同,以充分利用每个处理器。 4. Shuffle:Shuffle是将数据重新分配和重新组合的过程,在Spark中用于在不同的节点之间传递数据。在数据分组、排序、变换等操作时,会频繁的使用shuffle操作。 5. 宽依赖和窄依赖(Wide and Narrow Dependencies):依赖是Spark RDD中的概念,表示与当前RDD对应的其它RDD。一个RDD可能依赖于多个RDD,此时依赖关系称为宽依赖(Wide Dependencies)。如果一个RDD依赖于一个RDD,那么这个依赖关系被称为窄依赖(Narrow Dependencies)。 6. Spark SQL:Spark SQL是一个新的模块,提供了使用结构化数据的一个新的方式。它将Spark的强大的处理引擎与表格数据结构相结合,使得Spark可以更容易地与现有的商业智能工具和数据仓库互操作。 7. Spark Streaming:Spark Streaming是Spark提供的流处理引擎,可以处理实时数据流。Spark Streaming对于数据挖掘,实时监控等有很好的应用场景。 以上就是您需要了解的一些Spark基础知识,当然,Spark这门技术还有很多精妙的理念和玩法,需要您自行探究。如果您想要学习Spark,可以参考Spark文档,同时多动手练习,不断总结经验,培养能独立解决问题的能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cz学java

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值