随笔分类 -  spark

摘要:一、源码分析1、###入口org.apache.spark.sql/SQLContext.scalasql()方法:/** * 使用Spark执行一条SQL查询语句,将结果作为DataFrame返回,SQL解析使用的方言,可以 * 通过spark.sql.dialect参数,来进行设置 */ def sql(sqlText: String): DataFrame = { ... 阅读全文
posted @ 2019-08-07 14:36 米兰的小铁將 阅读(1083) 评论(0) 推荐(0)
摘要:一、工作原理剖析1、图解二、性能优化1、设置Shuffle过程中的并行度:spark.sql.shuffle.partitions(SQLContext.setConf())2、在Hive数据仓库建设过程中,合理设置数据类型,比如能设置为INT的,就不要设置为BIGINT。减少数据类型导致的不必要的内存开销。3、编写SQL时,尽量给出明确的列名,比如select name from student... 阅读全文
posted @ 2019-08-07 09:34 米兰的小铁將 阅读(1542) 评论(0) 推荐(0)
摘要:一、UDF1、UDF UDF:User Defined Function。用户自定义函数。2、scala案例package cn.spark.study.sqlimport org.apache.spark.SparkConfimport org.apache.spark.SparkContextimport org.apache.spark.sql.SQLContextimport org.ap... 阅读全文
posted @ 2019-08-06 14:27 米兰的小铁將 阅读(270) 评论(0) 推荐(0)
摘要:一、开窗函数1、概述Spark 1.4.x版本以后,为Spark SQL和DataFrame引入了开窗函数,比如最经典,最常用的,row_number(),可以让我们实现分组取topn的逻辑。案例:统计每个种类的销售额排名前3的产品二、分组取topN案例1、java实现package cn.spark.study.sql;import org.apache.spark.SparkConf;impo... 阅读全文
posted @ 2019-08-06 10:38 米兰的小铁將 阅读(515) 评论(0) 推荐(0)
摘要:一、spark1.5内置函数在Spark 1.5.x版本,增加了一系列内置函数到DataFrame API中,并且实现了code-generation的优化。与普通的函数不同,DataFrame的函数并不会执行后立即返回一个结果值,而是返回一个Column对象,用于在并行作业中进行求值。Column可以用在DataFrame的操作之中,比如select,filter,groupBy等。函数的输入值... 阅读全文
posted @ 2019-08-05 17:12 米兰的小铁將 阅读(421) 评论(0) 推荐(0)
摘要:一、JDBC数据源案例1、概述Spark SQL支持使用JDBC从关系型数据库(比如MySQL)中读取数据。读取的数据,依然由DataFrame表示,可以很方便地使用Spark Core提供的各种算子进行处理。这里有一个经验之谈,实际上用Spark SQL处理JDBC中的数据是非常有用的。比如说,你的MySQL业务数据库中,有大量的数据,比如1000万,然后,你现在需要编写一个程序,对线上的脏数据... 阅读全文
posted @ 2019-08-05 11:46 米兰的小铁將 阅读(399) 评论(0) 推荐(0)
摘要:一、Hive数据源案例1、概述Spark SQL支持对Hive中存储的数据进行读写。操作Hive中的数据时,必须创建HiveContext,而不是SQLContext。HiveContext继承自SQLContext,但是增加了在Hive元数据库中查找表,以及用HiveQL语法编写SQL的功能。除了sql()方法,HiveContext还提供了hql()方法,从而用Hive语法来编译sql。使用H... 阅读全文
posted @ 2019-08-02 13:23 米兰的小铁將 阅读(617) 评论(0) 推荐(0)
摘要:一、JSON数据源综合案例实战1、概述Spark SQL可以自动推断JSON文件的元数据,并且加载其数据,创建一个DataFrame。可以使用SQLContext.read.json()方法,针对一个元素类型为String的RDD,或者是一个JSON文件。但是要注意的是,这里使用的JSON文件与传统意义上的JSON文件是不一样的。每行都必须,也只能包含一个,单独的,自包含的,有效的JSON对象。不... 阅读全文
posted @ 2019-08-02 09:55 米兰的小铁將 阅读(393) 评论(0) 推荐(0)
摘要:一、自动分区推断1、概述表分区是一种常见的优化方式,比如Hive中就提供了表分区的特性。在一个分区表中,不同分区的数据通常存储在不同的目录中,分区列的值通常就包含在了分区目录的目录名中。Spark SQL中的Parquet数据源,支持自动根据目录名推断出分区信息。例如,如果将人口数据存储在分区表中,并且使用性别和国家作为分区列。那么目录结构可能如下所示:tableName |- gender=m... 阅读全文
posted @ 2019-07-31 16:27 米兰的小铁將 阅读(1086) 评论(0) 推荐(0)
摘要:一、概述Parquet是面向分析型业务的列式存储格式,由Twitter和Cloudera合作开发,2015年5月从Apache的孵化器里毕业成为Apache顶级项目,最新的版本是1.8.0。列式存储和行式存储相比有哪些优势呢?1、可以跳过不符合条件的数据,只读取需要的数据,降低IO数据量。 2、压缩编码可以降低磁盘存储空间。由于同一列的数据类型是一样的,可以使用更高效的压缩编码(例如Run Len... 阅读全文
posted @ 2019-07-31 13:53 米兰的小铁將 阅读(370) 评论(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 米兰的小铁將 阅读(929) 评论(0) 推荐(0)
摘要:一、概述为什么要将RDD转换为DataFrame?因为这样的话,我们就可以直接针对HDFS等任何可以构建为RDD的数据,使用Spark SQL进行SQL查询了。这个功能是无比强大的。想象一下,针对HDFS中的数据,直接就可以使用SQL进行查询。Spark SQL支持两种方式来将RDD转换为DataFrame。第一种方式是使用反射来推断包含了特定数据类型的RDD的元数据。这种基于反射的方式,代码比较... 阅读全文
posted @ 2019-07-31 09:43 米兰的小铁將 阅读(1126) 评论(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 米兰的小铁將 阅读(334) 评论(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 米兰的小铁將 阅读(220) 评论(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 米兰的小铁將 阅读(281) 评论(0) 推荐(0)
摘要:一、groupByKey1、图解val counts = pairs.groupByKey().map(wordCounts => (wordCounts._1, wordCounts._2.sum)) groupByKey的性能,相对来说,是有问题的;因为,它是不会进行本地聚合的,而是原封不动的,把ShuffleMapTask的输出,拉取到ResultTask的内存中,所以这样的话,会导致,所有... 阅读全文
posted @ 2019-07-29 14:47 米兰的小铁將 阅读(432) 评论(0) 推荐(0)
摘要:一、数据本地化1、背景数据本地化对于Spark Job性能有着巨大的影响。如果数据以及要计算它的代码是在一起的,那么性能当然会非常高。但是,如果数据和计算它的代码是分开的,那么其中之一必须到另外一方的机器上。通常来说,移动代码到其他节点,会比移动数据到代码所在的节点上去,速度要快得多,因为代码比较小。Spark也正是基于这个数据本地化的原则来构建task调度算法的。数据本地化,指的是,数据离计算它... 阅读全文
posted @ 2019-07-29 14:26 米兰的小铁將 阅读(864) 评论(0) 推荐(0)
摘要:一、提高并行度1、图解实际上Spark集群的资源并不一定会被充分利用到,所以要尽量设置合理的并行度,来充分地利用集群的资源。才能充分提高Spark应用程序的性能。Spark会自动设置以文件作为输入源的RDD的并行度,依据其大小,比如HDFS,就会给每一个block创建一个partition,也依据这个设置并行度。对于reduceByKey等会发生shuffle的操作,就使用并行度最大的父RDD的并... 阅读全文
posted @ 2019-07-29 14:10 米兰的小铁將 阅读(201) 评论(0) 推荐(0)
摘要:一、背景如果在持久化RDD的时候,持久化了大量的数据,那么Java虚拟机的垃圾回收就可能成为一个性能瓶颈。因为Java虚拟机会定期进行垃圾回收,此时就会追踪所有的java对象,并且在垃圾回收时,找到那些已经不在使用的对象,然后清理旧的对象,来给新的对象腾出内存空间。垃圾回收的性能开销,是跟内存中的对象的数量,成正比的。所以,对于垃圾回收的性能问题,首先要做的就是,使用更高效的数据结构,比如arra... 阅读全文
posted @ 2019-07-29 13:55 米兰的小铁將 阅读(258) 评论(0) 推荐(0)
摘要:一、图解二、说明如果程序中,对某一个RDD,基于它进行了多次transformation或者action操作。那么就非常有必要对其进行持久化操作,以避免对一个RDD反复进行计算。此外,如果要保证在RDD的持久化数据可能丢失的情况下,还要保证高性能,那么可以对RDD进行Checkpoint操作。持久化,再checkpoint这样,第一次,需要重新计算RDD;第二次计算该RDD,其实会从BlockMa... 阅读全文
posted @ 2019-07-29 10:29 米兰的小铁將 阅读(368) 评论(0) 推荐(0)