07 2019 档案

摘要:一、自动分区推断1、概述表分区是一种常见的优化方式,比如Hive中就提供了表分区的特性。在一个分区表中,不同分区的数据通常存储在不同的目录中,分区列的值通常就包含在了分区目录的目录名中。Spark SQL中的Parquet数据源,支持自动根据目录名推断出分区信息。例如,如果将人口数据存储在分区表中,并且使用性别和国家作为分区列。那么目录结构可能如下所示:tableName |- gender=m... 阅读全文
posted @ 2019-07-31 16:27 米兰的小铁將 阅读(1016) 评论(0) 推荐(0) 编辑
摘要:一、概述Parquet是面向分析型业务的列式存储格式,由Twitter和Cloudera合作开发,2015年5月从Apache的孵化器里毕业成为Apache顶级项目,最新的版本是1.8.0。列式存储和行式存储相比有哪些优势呢?1、可以跳过不符合条件的数据,只读取需要的数据,降低IO数据量。 2、压缩编码可以降低磁盘存储空间。由于同一列的数据类型是一样的,可以使用更高效的压缩编码(例如Run Len... 阅读全文
posted @ 2019-07-31 13:53 米兰的小铁將 阅读(351) 评论(0) 推荐(0) 编辑
摘要:一、通用的load和save操作1、概述对于Spark SQL的DataFrame来说,无论是从什么数据源创建出来的DataFrame,都有一些共同的load和save操作。load操作主要用于加载数据,创建出DataFrame;save操作,主要用于将DataFrame中的数据保存到文件中。Java版本DataFrame df = sqlContext.read().load("users.pa... 阅读全文
posted @ 2019-07-31 10:43 米兰的小铁將 阅读(900) 评论(0) 推荐(0) 编辑
摘要:一、概述为什么要将RDD转换为DataFrame?因为这样的话,我们就可以直接针对HDFS等任何可以构建为RDD的数据,使用Spark SQL进行SQL查询了。这个功能是无比强大的。想象一下,针对HDFS中的数据,直接就可以使用SQL进行查询。Spark SQL支持两种方式来将RDD转换为DataFrame。第一种方式是使用反射来推断包含了特定数据类型的RDD的元数据。这种基于反射的方式,代码比较... 阅读全文
posted @ 2019-07-31 09:43 米兰的小铁將 阅读(1075) 评论(0) 推荐(0) 编辑
摘要:一、saprkSQL背景Spark 1.0版本开始,推出了Spark SQL。其实最早使用的,都是Hadoop自己的Hive查询引擎;但是后来Spark提供了Shark;再后来Shark被淘汰,推出了Spark SQL。Shark的性能比Hive就要高出一个数量级,而Spark SQL的性能又比Shark高出一个数量级。最早来说,Hive的诞生,主要是因为要让那些不熟悉Java,无法深入进行Map... 阅读全文
posted @ 2019-07-30 10:37 米兰的小铁將 阅读(320) 评论(0) 推荐(0) 编辑
摘要:一、Spark 1.4.x的新特性1、Spark Core 1.1 提供REST API供外界开发者获取Spark内部的各种信息(jobs / stages / tasks / storage info),基于这些API,可以搭建自己的Spark监控系统。 1.2 shuffle阶段,默认将map端写入磁盘的数据进行序列化,优化io性能。 1.3 钨丝计划(Project Tungsten)... 阅读全文
posted @ 2019-07-29 16:30 米兰的小铁將 阅读(214) 评论(0) 推荐(0) 编辑
摘要:一、shuffle性能优化1、没有开启consolidation机制的性能低下的原理剖析2、开启consolidation机制之后对磁盘io性能的提升的原理spark.shuffle.consolidateFiles:是否开启shuffle block file的合并,默认为false;总结,开启了consolidation机制之后,shuffle map端,写磁盘的数量,大大减少;比如节点100... 阅读全文
posted @ 2019-07-29 15:02 米兰的小铁將 阅读(269) 评论(0) 推荐(0) 编辑
摘要:一、groupByKey1、图解val counts = pairs.groupByKey().map(wordCounts => (wordCounts._1, wordCounts._2.sum)) groupByKey的性能,相对来说,是有问题的;因为,它是不会进行本地聚合的,而是原封不动的,把ShuffleMapTask的输出,拉取到ResultTask的内存中,所以这样的话,会导致,所有... 阅读全文
posted @ 2019-07-29 14:47 米兰的小铁將 阅读(411) 评论(0) 推荐(0) 编辑
摘要:一、数据本地化1、背景数据本地化对于Spark Job性能有着巨大的影响。如果数据以及要计算它的代码是在一起的,那么性能当然会非常高。但是,如果数据和计算它的代码是分开的,那么其中之一必须到另外一方的机器上。通常来说,移动代码到其他节点,会比移动数据到代码所在的节点上去,速度要快得多,因为代码比较小。Spark也正是基于这个数据本地化的原则来构建task调度算法的。数据本地化,指的是,数据离计算它... 阅读全文
posted @ 2019-07-29 14:26 米兰的小铁將 阅读(836) 评论(0) 推荐(0) 编辑
摘要:一、提高并行度1、图解实际上Spark集群的资源并不一定会被充分利用到,所以要尽量设置合理的并行度,来充分地利用集群的资源。才能充分提高Spark应用程序的性能。Spark会自动设置以文件作为输入源的RDD的并行度,依据其大小,比如HDFS,就会给每一个block创建一个partition,也依据这个设置并行度。对于reduceByKey等会发生shuffle的操作,就使用并行度最大的父RDD的并... 阅读全文
posted @ 2019-07-29 14:10 米兰的小铁將 阅读(193) 评论(0) 推荐(0) 编辑
摘要:一、背景如果在持久化RDD的时候,持久化了大量的数据,那么Java虚拟机的垃圾回收就可能成为一个性能瓶颈。因为Java虚拟机会定期进行垃圾回收,此时就会追踪所有的java对象,并且在垃圾回收时,找到那些已经不在使用的对象,然后清理旧的对象,来给新的对象腾出内存空间。垃圾回收的性能开销,是跟内存中的对象的数量,成正比的。所以,对于垃圾回收的性能问题,首先要做的就是,使用更高效的数据结构,比如arra... 阅读全文
posted @ 2019-07-29 13:55 米兰的小铁將 阅读(249) 评论(0) 推荐(0) 编辑
摘要:一、图解二、说明如果程序中,对某一个RDD,基于它进行了多次transformation或者action操作。那么就非常有必要对其进行持久化操作,以避免对一个RDD反复进行计算。此外,如果要保证在RDD的持久化数据可能丢失的情况下,还要保证高性能,那么可以对RDD进行Checkpoint操作。持久化,再checkpoint这样,第一次,需要重新计算RDD;第二次计算该RDD,其实会从BlockMa... 阅读全文
posted @ 2019-07-29 10:29 米兰的小铁將 阅读(358) 评论(0) 推荐(0) 编辑
摘要:一、概述要减少内存的消耗,除了使用高效的序列化类库以外,还有一个很重要的事情,就是优化数据结构。从而避免Java语法特性中所导致的额外内存的开销,比如基于指针的Java数据结构,以及包装类型。有一个关键的问题,就是优化什么数据结构?其实主要就是优化你的算子函数,内部使用到的局部数据,或者是算子函数外部的数据。都可以进行数据结构的优化。优化之后,都会减少其对内存的消耗和占用。二、如何优化数据结构1、... 阅读全文
posted @ 2019-07-29 10:13 米兰的小铁將 阅读(538) 评论(0) 推荐(0) 编辑
摘要:一、数据序列化概述在任何分布式系统中,序列化都是扮演着一个重要的角色的。如果使用的序列化技术,在执行序列化操作的时候很慢,或者是序列化后的数据还是很大,那么会让分布式应用程序的性能下降很多。所以,进行Spark性能优化的第一步,就是进行序列化的性能优化。Spark自身默认就会在一些地方对数据进行序列化,比如Shuffle。还有就是,如果我们的算子函数使用到了外部的数据(比如Java内置类型,或者自... 阅读全文
posted @ 2019-07-29 09:57 米兰的小铁將 阅读(260) 评论(0) 推荐(0) 编辑
摘要:一、内存都消耗在了哪里1、每个Java对象,都有一个对象头,会占用16个字节,主要是包括了一些对象的元信息,比如指向它的类的指针。如果一个对象本身很小,比如就包括了一个int类型的field,那么它的对象头实际上比对象自己还要大。2、Java的String对象,会比它内部的原始数据,要多出40个字节。因为它内部使用char数组来保存内部的字符序列的,并且还得保存诸如数组长度之类的信息。而且因为St... 阅读全文
posted @ 2019-07-26 17:23 米兰的小铁將 阅读(198) 评论(0) 推荐(0) 编辑
摘要:一、原理1、Checkpoint是什么Checkpoint,是Spark提供的一个比较高级的功能。有的时候,比如说,我们的Spark应用程序,特别的复杂,然后呢,从初始的RDD开始,到最后整个应用程序完成,有非常多的步骤,比如超过20个transformation操作。而且呢,整个应用运行的时间也特别长,比如通常要运行1~5个小时。在上述情况下,就比较适合使用checkpoint功能。因为,对于特... 阅读全文
posted @ 2019-07-26 15:59 米兰的小铁將 阅读(1261) 评论(0) 推荐(0) 编辑
摘要:一、图解二、源码分析###org.apache.spark.rdd/RDD.scalal###入口final def iterator(split: Partition, context: TaskContext): Iterator[T] = { if (storageLevel != StorageLevel.NONE) { // cacheManager相关东西 /... 阅读全文
posted @ 2019-07-26 15:43 米兰的小铁將 阅读(382) 评论(0) 推荐(0) 编辑
摘要:一、原理1、图解Driver上,有BlockManagerMaster,它的功能,就是负责对各个节点上的BlockManager内部管理的数据的元数据进行维护,比如Block的增删改等操作,都会在这里维护元数据的变更;每个节点上,都有BlockManager,BlockManager上有几个关键组件:DiskStore,负责对磁盘上的数据进行读写;MemoryStore,负责对内存中的数据进行读写... 阅读全文
posted @ 2019-07-26 15:14 米兰的小铁將 阅读(519) 评论(0) 推荐(0) 编辑
摘要:原文参考:https://blog.csdn.net/whs_321/article/details/52939263 一、简介 二、内置key 阅读全文
posted @ 2019-07-26 10:45 米兰的小铁將 阅读(636) 评论(0) 推荐(0) 编辑
摘要:一、普通shuffle原理1、图解假设有一个节点上面运行了4个 ShuffleMapTask,然后这个节点上只有2个 cpu core。假如有另外一台节点,上面也运行了4个ResultTask,现在呢,正等着要去 ShuffleMapTask 的输出数据来完成比如 reduceByKey 等操作。每个 ShuffleMapTask 都会为 ReduceTask 创建一份 bucket 缓存,以及对... 阅读全文
posted @ 2019-07-25 14:49 米兰的小铁將 阅读(668) 评论(0) 推荐(0) 编辑
摘要:一、模块安装 1、简介 psutil是一个跨平台库(http://pythonhosted.org/psutil/)能够轻松实现获取系统运行的进程和系统利用率(包括CPU、内存、磁盘、网络等)信息。 它主要用来做系统监控,性能分析,进程管理。它实现了同等命令行工具提供的功能: 如ps、top、lso 阅读全文
posted @ 2019-07-25 10:00 米兰的小铁將 阅读(638) 评论(0) 推荐(0) 编辑
摘要:1、cp /etc/apt/sources.list /etc/apt/sources.list.bak #备份sources.list2、vi /etc/apt/sources.list #在sources.list最... 阅读全文
posted @ 2019-07-24 16:44 米兰的小铁將 阅读(1483) 评论(0) 推荐(0) 编辑
摘要:一、Task原理1、图解二、源码分析1、###org.apache.spark.executor/Executor.scala/** * 从TaskRunner开始,来看Task的运行的工作原理 */ class TaskRunner( execBackend: ExecutorBackend, val taskId: Long, val attempt... 阅读全文
posted @ 2019-07-24 16:37 米兰的小铁將 阅读(524) 评论(0) 推荐(0) 编辑
摘要:一、原理图解二、源码分析1、Executor注册机制worker中为Application启动的executor,实际上是启动了这个CoarseGrainedExecutorBackend进程;Executor注册机制:###org.apache.spark.executor/CoarseGrainedExecutorBackend.scala/** * 在actor的初始化方法中 *... 阅读全文
posted @ 2019-07-24 11:17 米兰的小铁將 阅读(245) 评论(0) 推荐(0) 编辑
摘要:一、源码分析###入口###org.apache.spark.scheduler/DAGScheduler.scala// 最后,针对stage的task,创建TaskSet对象,调用taskScheduler的submitTasks()方法,提交taskSet // 默认情况下,我们的standalone模式,是使用的TaskSchedulerImpl,TaskScheduler只是一... 阅读全文
posted @ 2019-07-23 18:13 米兰的小铁將 阅读(454) 评论(0) 推荐(0) 编辑
摘要:一、stage划分算法原理 1、图解 Job->Stage->Task 开发完一个应用以后,把这个应用提交到Spark集群,这个应用叫Application。这个应用里面开发了很多代码,这些代码里面凡是遇到一个action操作,就会产生一个job任务。 一个Application有一个或多个job任 阅读全文
posted @ 2019-07-22 15:49 米兰的小铁將 阅读(623) 评论(0) 推荐(0) 编辑
摘要:一、以Wordcount为例来分析1、Wordcountval lines = sc.textFile()val words = lines.flatMap(line => line.split(" "))val pairs = words.map(word => (word, 1))val counts = pairs.reduceByKey(_ + _)counts.foreach(count... 阅读全文
posted @ 2019-07-19 14:15 米兰的小铁將 阅读(309) 评论(0) 推荐(0) 编辑
摘要:一、Work原理 1、图解 Worker启动Driver的一个基本原理,就是Worker内部会启动一个线程,这个线程可以理解为,就是DriverRunner,然后DriverRunner就会去负责启动Driver进程, 并在之后对Driver进程进行管理; Worker启动Executor,其实和D 阅读全文
posted @ 2019-07-19 11:15 米兰的小铁將 阅读(397) 评论(0) 推荐(0) 编辑
摘要:一、主备切换机制原理剖析 1、图解 Master实际上可以配置两个,那么Spark原生的standalone模式是支持Master主备切换的。也就是说,当Active Master节点挂掉时,可以将StandBy master节点切换为Active Master。 Spark Master主备切换可 阅读全文
posted @ 2019-07-18 11:40 米兰的小铁將 阅读(539) 评论(0) 推荐(0) 编辑
摘要:一、SparkContext原理 1、图解 1、当driver启动后会去运行我们的application,在运行application的时候,所有spark程序的第一行都是先创建SparkContext,在创建SparkContext的时候,它的内部创建 两个非常重要的东西DAGSchedule和T 阅读全文
posted @ 2019-07-17 15:12 米兰的小铁將 阅读(1069) 评论(0) 推荐(0) 编辑
摘要:一、三种提交模式 1、Spark内核架构,其实就是第一种模式,standalone模式,基于Spark自己的Master-Worker集群。 2、第二种,是基于YARN的yarn-cluster模式。 3、第三种,是基于YARN的yarn-client模式。 4、如果,你要切换到第二种和第三种模式, 阅读全文
posted @ 2019-07-17 09:25 米兰的小铁將 阅读(281) 评论(0) 推荐(0) 编辑
摘要:一、内核剖析 1、内核模块 1、Application 2、spark-submit 3、Driver 4、SparkContext 5、Master 6、Worker 7、Executor 8、Job 9、DAGScheduler 10、TaskScheduler 11、ShuffleMapTas 阅读全文
posted @ 2019-07-16 16:47 米兰的小铁將 阅读(275) 评论(0) 推荐(0) 编辑
摘要:一、基于排序机制的wordcount程序 1、要求 1、对文本文件内的每个单词都统计出其出现的次数。 2、按照每个单词出现次数的数量,降序排序。 2、代码实现 java实现 package cn.spark.study.core; import java.util.Arrays; import or 阅读全文
posted @ 2019-07-16 11:27 米兰的小铁將 阅读(428) 评论(0) 推荐(0) 编辑
摘要:一、共享变量 1、共享变量工作原理 Spark一个非常重要的特性就是共享变量。 默认情况下,如果在一个算子的函数中使用到了某个外部的变量,那么这个变量的值会被拷贝到每个task中。此时每个task只能操作自己的那份变量副本。如果多个task想 要共享某个变量,那么这种方式是做不到的。 Spark为此 阅读全文
posted @ 2019-07-09 10:59 米兰的小铁將 阅读(1119) 评论(0) 推荐(0) 编辑
摘要:一、RDD持久化 1、不使用RDD持久化的问题 2、RDD持久化原理 Spark非常重要的一个功能特性就是可以将RDD持久化在内存中。当对RDD执行持久化操作时,每个节点都会将自己操作的RDD的partition持久化到内存中,并且在之后对 该RDD的反复使用中,直接使用内存缓存的partition 阅读全文
posted @ 2019-07-08 14:20 米兰的小铁將 阅读(1648) 评论(0) 推荐(0) 编辑
摘要:一、transformation开发实战 1、map: 将集合中每个元素乘以2 使用map算子,将集合中的每个元素都乘以2 map算子,是对任何类型的RDD,都可以调用的,在Java中,map算子接收的参数是Function对象 创建的Function对象,一定会让你设置第二个泛型参数,这个泛型类型 阅读全文
posted @ 2019-07-08 11:09 米兰的小铁將 阅读(372) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示