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方法应用模式
关键代码: