Apache Spark

Spark SQL源码解析(三)Analysis阶段分析

核能气质少年 提交于 2020-04-29 12:34:00
Spark SQL原理解析前言: Spark SQL源码剖析(一)SQL解析框架Catalyst流程概述 Spark SQL源码解析(二)Antlr4解析Sql并生成树 Analysis阶段概述 首先,这里需要引入一个新概念,前面介绍SQL parse阶段,会使用antlr4,将一条SQL语句解析成语法树,然后使用antlr4的访问者模式遍历生成语法树,也就是Logical Plan。但其实,SQL parse这一阶段生成的Logical Plan是被称为Unresolved Logical Plan。所谓unresolved,就是说SQL语句中的对象都是未解释的。 比如说一条语句 SELECT col FROM sales ,当我们不知道col的具体类型(Int,String,还是其他),甚至是否在sales表中有col这一个列的时候,就称之为是Unresolved的。 而在analysis阶段,主要就是解决这个问题,也就是将Unresolved的变成Resolved的。Spark SQL通过使用Catalyst rule和Catalog来跟踪数据源的table信息。并对Unresolved应用如下的rules(rule可以理解为一条一条的规则,当匹配到树某些节点的时候就会被应用)。 从Catalog中,查询Unresolved Logical Plan中对应的关系

大数据——如何设计实时数据平台(设计篇)

和自甴很熟 提交于 2020-04-28 21:38:46
导读:本文将会分上下两篇对一个重要且常见的大数据基础设施平台展开讨论,即“实时数据平台”。 在上篇设计篇中,我们首先从两个维度介绍实时数据平台:从现代数仓架构角度看待实时数据平台,从典型数据处理角度看待实时数据处理;接着我们会探讨实时数据平台整体设计架构、对具体问题的考量以及解决思路。 在下篇技术篇中,我们会进一步给出实时数据平台的技术选型和相关组件介绍,并探讨不同模式适用哪些应用场景。希望通过对本文的讨论,读者可以得到一个有章可循、可实际落地的实时数据平台构建方案。 一、相关概念背景 1.1 从现代数仓架构角度看待实时数据平台 现代数仓由传统数仓发展而来,对比传统数仓,现代数仓既有与其相同之处,也有诸多发展点。首先我们看一下传统数仓(图1)和现代数仓(图2)的模块架构: 图1 传统数仓 图2 现代数仓 传统数仓大家都很熟悉,这里不做过多介绍,一般来说,传统数仓只能支持T+1天时效延迟的数据处理,数据处理过程以ETL为主,最终产出以报表为主。 现代数仓建立在传统数仓之上,同时增加了更多样化数据源的导入存储,更多样化数据处理方式和时效(支持T+0天时效),更多样化数据使用方式和更多样化数据终端服务。 现代数仓是个很大的话题,在此我们以概念模块的方式来展现其新的特性能力。首先我们先看一下图3中Melissa Coates的整理总结: 在图3 Melissa

大数据虚拟混算平台Moonbox配置指南

本小妞迷上赌 提交于 2020-04-28 21:37:16
一、环境准备 已安装Apache Spark 2.2.0(此版本仅支持Apache Spark 2.2.0, 其他Spark 版本后续会兼容) 已安装MySQL并启动,且开启远程访问 各安装节点已经配置ssh免密登录 二、下载 moonbox-0.3.0-beta下载:https://github.com/edp963/moonbox/releases/tag/0.3.0-beta 三、解压 tar -zxvf moonbox-assembly_2. 11 - 0.3 . 0 -beta-dist.tar.gz 四、修改配置文件 配置文件位于conf目录下 step 1: 修改slaves mv slaves.example slaves vim slaves 将会看到如下内容: localhost 请根据实际情况修改为需要部署worker节点的地址, 每行一个地址 step 2: 修改moonbox-env.sh mv moonbox-env.sh.example moonbox- env.sh chmod u +x moonbox- env.sh vim moonbox -env.sh 将会看到如下内容: export JAVA_HOME=path/to/installed/ dir export SPARK_HOME =path/to/installed/ dir

4月29日Spark社区直播【用Analytics-Zoo实现基于深度学习的胸腔疾病AI诊疗辅助】

自作多情 提交于 2020-04-28 20:39:56
简介: 本次分享主要介绍如何利用Analytics Zoo和NIH胸部X光影像数据集,在Apache Spark集群上实现基于深度学习的胸腔疾病分类,为医生提供端到端的胸腔疾病AI诊疗辅助。 有兴趣的同学,可以提前关注此开源项目: https://github.com/intel-analytics/analytics-zoo 主题: 用Analytics-Zoo实现基于深度学习的胸腔疾病AI诊疗辅助 时间: 2020.4.29(周三)19:00 参与方式: 扫描下方二维码加入钉钉群,群内直接观看 或点击直播间链接: https://developer.aliyun.com/live/2719?spm=5176.8068049.0.0.27366d19wPA7FZ 讲师简介: 龚奇源 博士,英特尔机器学习专家。从事多年数据隐私和机器学习研究,2017年加入英 来源: oschina 链接: https://my.oschina.net/u/4342210/blog/4257181

Apache Hudi 编译测试

为君一笑 提交于 2020-04-28 19:58:27
测试环境:Ubuntu 16.04 Hudi版本:0.5.2 Spark版本:2.4.0 下载编译测试 下载 git clone https://github.com/apache/incubator-hudi.git && cd incubator-hudi 编译 mvn clean package -Dmaven.test.skip=true Hudi CLI测试 写入查询测试 Spark shell启动 ./spark-shell --packages org.apache.hudi:hudi-spark-bundle_2.11:0.5.1-incubating,org.apache.spark:spark-avro_2.11:2.4.4 --conf 'spark.serializer=org.apache.spark.serializer.KryoSerializer' 插入数据测试 import org . apache . hudi . QuickstartUtils . _ import scala . collection . JavaConversions . _ import org . apache . spark . sql . SaveMode . _ import org . apache . hudi . DataSourceReadOptions

第02讲:Flink 入门程序 WordCount 和 SQL 实现

白昼怎懂夜的黑 提交于 2020-04-28 19:45:30
本课时我们主要介绍 Flink 的入门程序以及 SQL 形式的实现。 上一课时已经讲解了 Flink 的常用应用场景和架构模型设计,这一课时我们将会从一个最简单的 WordCount 案例作为切入点,并且同时使用 SQL 方式进行实现,为后面的实战课程打好基础。 我们首先会从环境搭建入手,介绍如何搭建本地调试环境的脚手架;然后分别从 DataSet(批处理)和 DataStream(流处理)两种方式如何进行单词计数开发;最后介绍 Flink Table 和 SQL 的使用。 Flink 开发环境 通常来讲,任何一门大数据框架在实际生产环境中都是以集群的形式运行,而我们调试代码大多数会在本地搭建一个模板工程,Flink 也不例外。 Flink 一个以 Java 及 Scala 作为开发语言的开源大数据项目,通常我们推荐使用 Java 来作为开发语言,Maven 作为编译和包管理工具进行项目构建和编译。对于大多数开发者而言,JDK、Maven 和 Git 这三个开发工具是必不可少的。 关于 JDK、Maven 和 Git 的安装建议如下表所示: 工程创建 一般来说,我们在通过 IDE 创建工程,可以自己新建工程,添加 Maven 依赖,或者直接用 mvn 命令创建应用: mvn archetype:generate \ -DarchetypeGroupId=org.apache

Spark小实例——求文件中的最大值和最小值(IDEA实现)

不问归期 提交于 2020-04-28 09:19:01
Spark小实例——求文件中的最大值和最小值(IDEA实现) 1、所需软件 IDEA开发工具 HDFS分布式文件系统(可选项) spark-2.1.1-bin-hadoop2.7(版本可自选) 2、所需文件(自定义数据即可) 比如: 3、准备IDEA的环境 首先创建项目 导入所需的JAR文件(spark-2.1.1-bin-hadoop2.7) 4、编写Spark程序(创建scala文件) 代码如下: import org.apache.spark.{SparkConf, SparkContext} object MAXandMIN { def main(args: Array[String]): Unit = { val conf = new SparkConf().setAppName("MAX and MIN").setMaster("local") //生成sc对象 val sc = new SparkContext(conf) //设置日志输出格式 sc.setLogLevel("ERROR") //2为设置2个分区 val lines = sc.textFile("hdfs://192.168.169.200:9000/2020/rdd/test/shuzi.txt",2) //过滤没有内容的行 val result = lines.filter(_.trim()

Spark 缓存机制 + 共享变量

 ̄綄美尐妖づ 提交于 2020-04-28 07:26:19
一、Spark中的缓存机制:   避免spark每次都重算RDD以及它的所有依赖,cache()、persist()、 checkpoint()。 1、cache():会被重复使用,但是不能太大的RDD,将其cache()到内存当中,catch()属于 memory only 。cache 是每计算出一个要 cache 的 partition 就直接将其 cache 到内存中。缓存完之后,可以在任务监控界面storage里面看到缓存的数据。 spark cache (几种缓存方法): https://blog.csdn.net/zhuiqiuuuu/article/details/79290221 2、persist():可以设置缓存级别,如只在内存,只在磁盘,内存磁盘都用。 MEMORY_ONLY MEMORY_AND_DISK MEMORY_ONLY_SER MEMORY_AND_DISK_SER DISK_ONLY MEMORY_ONLY_2, MEMORY_AND_DISK_2, 等等 持久化级别详解: http://bcxw.net/article/425.html 3、checkpoint():computing chain 计算链过长或依赖其他 RDD 很多的 RDD,就需要进行checkpoint,将其放入到磁盘当中。   checkpoint 需要等到job完成了

spark记录(2)spark广播变量与累加器

蹲街弑〆低调 提交于 2020-04-28 07:00:38
转自: https://www.cnblogs.com/qingyunzong/p/8890483.html 一、概述 在spark程序中,当一个传递给Spark操作(例如map和reduce)的函数在远程节点上面运行时,Spark操作实际上操作的是这个函数所用变量的一个独立副本。这些变量会被复制到每台机器上,并且这些变量在远程机器上的所有更新都不会传递回驱动程序。通常跨任务的读写变量是低效的,但是,Spark还是为两种常见的使用模式提供了两种有限的共享变量:广播变(broadcast variable)和累加器(accumulator) 二、广播变量broadcast variable 2.1 为什么要将变量定义成广播变量? 如果我们要在分布式计算里面分发大对象,例如:字典,集合,黑白名单等,这个都会由Driver端进行分发,一般来讲,如果这个变量不是广播变量,那么每个task就会分发一份,这在 task数目十分多的情况下Driver的带宽会成为系统的瓶颈,而且会大量消耗task服务器上的资源 ,如果将这个变量声明为广播变量,那么知识每个executor拥有一份,这个executor启动的task会共享这个变量,节省了通信的成本和服务器的资源。 2.2 广播变量图解 错误的,不使用广播变量 正确的,使用广播变量的情况 2.3 如何定义一个广播变量? val a = 3 val

Spark学习之路 (四)Spark的广播变量和累加器

╄→尐↘猪︶ㄣ 提交于 2020-04-28 06:47:10
一、概述 在spark程序中,当一个传递给Spark操作(例如map和reduce)的函数在远程节点上面运行时,Spark操作实际上操作的是这个函数所用变量的一个独立副本。这些变量会被复制到每台机器上,并且这些变量在远程机器上的所有更新都不会传递回驱动程序。通常跨任务的读写变量是低效的,但是,Spark还是为两种常见的使用模式提供了两种有限的共享变量:广播变(broadcast variable)和累加器(accumulator) 二、广播变量broadcast variable 2.1 为什么要将变量定义成广播变量? 如果我们要在分布式计算里面分发大对象,例如:字典,集合,黑白名单等,这个都会由Driver端进行分发,一般来讲,如果这个变量不是广播变量,那么每个task就会分发一份,这在 task数目十分多的情况下Driver的带宽会成为系统的瓶颈,而且会大量消耗task服务器上的资源 ,如果将这个变量声明为广播变量,那么知识每个executor拥有一份,这个executor启动的task会共享这个变量,节省了通信的成本和服务器的资源。 2.2 广播变量图解 错误的,不使用广播变量 正确的,使用广播变量的情况 2.3 如何定义一个广播变量? val a = 3 val broadcast = sc.broadcast(a) 2.4 如何还原一个广播变量? val c =