Apache Spark

Spark 数据分析导论-笔记

时光怂恿深爱的人放手 提交于 2019-11-29 21:27:19
Spark Core Spark Core 实现了Spark 的基本功能,包含 任务调度 、 内存管理 、 错误恢复 、与 存储系统交互 等模块。 Spark Core 中还包含了 对弹性分布式数据集(resilient distributed dataset,简称RDD)的API 定义。 RDD 表示分布在多个计算节点上可以并行操作的 元素集合 , 是Spark 主要的编程抽象 。 Spark Core 提供了创建和操作这些集合的多个API。 Spark SQL Spark SQL 是Spark 用来 操作结构化数据的程序包 。 使用SQL或者Apache Hive 版本的SQL 方言(HQL)来查询数据。 Spark SQL 支持多种数据源,比如Hive 表、Parquet 以及JSON 等。 除了为Spark 提供了一个SQL 接口, Spark SQL 还支持开发者将SQL 和传统的RDD 编程的数据操作方式相结合, 不论是使用Python、Java 还是Scala, 开发者都可以在单个的应用中同时使用SQL 和复杂的数据分析。 通过与Spark所提供的丰富的计算环境进行如此紧密的结合, Spark SQL 得以从其他开源数据仓库工具中脱颖而出。 Spark SQL 是在Spark 1.0 中被引入的。 Spark Streaming Spark Streaming

Spark On Yarn 搭建

梦想的初衷 提交于 2019-11-29 21:26:37
实现步骤: 1)搭建好Hadoop(版本,2.7)集群 2)安装和配置scala(版本,2.11) 上传解压scala-2.11.0.tgz—>配置 /etc/profile文件 配置信息如下: 3)在NodeManager节点(01,02,03节点)上安装和配置Spark 4)进入Spark安装目录的Conf目录,配置:spark-env.sh 文件 配置如下: export JAVA_HOME=/home/software/jdk1.8 export SCALA_HOME=/home/software/scala-2.11.0 export HADOOP_HOME=/home/software/hadoop-2.7.1 export HADOOP_CONF_DIR=/home/software/hadoop-2.7.1/etc/hadoop 5)配置:slaves文件 配置如下: hadoop01 hadoop02 hadoop03 6)在HDFS上,创建一个目录,用来存放 spark的依赖jar包 执行: hadoop fs -mkdir /spark_jars 7)进入spark 安装目录的jars目录, 执行:hadoop fs -put ./* /spark_jars 8)进入spark安装目录的 conf目录,配置:spark-defaults.conf 文件

通过map操作看RDD的Map过程

旧城冷巷雨未停 提交于 2019-11-29 18:55:50
RDD中的map,flatMap等操作是怎么串在一起形成DAG图的呢?这是个很重要的问题,理解了这一点才能更好的理解Spark的内核实现。本文通过map过程来试图解释这一点。 先看看RDD的一个子类:MapPartitionsRDD,它会用在map函数场景下。 它的定义: private[spark] class MapPartitionsRDD[U: ClassTag, T: ClassTag]( var prev: RDD[T], f: (TaskContext, Int, Iterator[T]) => Iterator[U], // (TaskContext, partition index, iterator) preservesPartitioning: Boolean = false, isFromBarrier: Boolean = false, isOrderSensitive: Boolean = false) extends RDD[U](prev) prev是父RDD,就是父类RDD的入参,在后面的代码里就是firstParent。 F代表了map函数的定义,其中第二个Int参数是分区索引号。我们先不管这个f入参怎么传进来的,先看看MapPartitionsRDD需要做哪些事。 前面说过,对于RDD来说,最重要的函数就是compute

spark dataset 相同列名 join

旧时模样 提交于 2019-11-29 18:31:41
具有部分相同、部分不同列名的两个Dataset按照部分相同、部分不同列相等进行join操作,有以下几种方式: val df1 = Seq((1, 2, 3),(1, 1, 1)).toDF("a", "b", "c") val df2 = Seq((1, 2, 4),(2, 2, 2)).toDF("a", "b1", "d") df1.show +---+---+---+ | a| b| c| +---+---+---+ | 1| 2| 3| | 1| 1| 1| +---+---+---+ df2.show +---+---+---+ | a| b1| d| +---+---+---+ | 1| 2| 4| | 2| 2| 2| +---+---+---+ //join条件:df1("a") == df2("a") && df1("b") == df2("b1") //若是直接join会报错:org.apache.spark.sql.AnalysisException: Reference 'a' is ambiguous, could be:... df1.join(df2, col("a") === col("a") && col("b") === col("b1"), "outer").show //可以改为这样: df1.join(df2, df1("a") ===

从零开始搭建spark集群

ぃ、小莉子 提交于 2019-11-29 18:05:21
0.基础环境准备 准备三台机器ip为:192.168.213.150、192.168.213.151、192.168.213.152 操作系统:CentOS Linux release 7.5.1804 (Core) JDK: 1.8.0_231 SCALA: 2.13.1 SPARK: 3.0.0 1.安装java环境 # tar -zxvf jdk-8u231-linux-x64.tar.gz # vim /etc/profile.d/java.sh export JAVA_HOME=/usr/local/src/jdk1.8.0_231 export JRE_HOME=${JAVA_HOME}/jre export CLASSPATH=${JAVA_HOME}/lib:${JRE_HOME}/lib:$CLASSPATH export PATH=${JAVA_HOME}/bin:$PATH #source /etc/profile 请按照上面配置java环境变量,否则后面启动集群是会报如下错误 Spark , JAVA_HOME is not set 2.安装scala https://www.scala-lang.org/download/ #wget https://downloads.lightbend.com/scala/2.13.1/scala-2.13.1.rpm

crontab执行时无法加载环境变量

此生再无相见时 提交于 2019-11-29 15:25:36
先描述一下场景,公司使用亚马逊EMR集群执行spark任务,每天执行,所以写了个python脚本。定时启动emr集群并发送任务,起线程检测每个emr集群工作状态,工作结束后关闭emr集群。python脚本工作无异常,但是通过crontab调用时会不停的报无法获取授权错误,这里是将任务注册在/etc/crontab中。 度娘了很多种解决方法,都没起作用,最后在亚马逊论坛中找到一个相似的情况,在试过评论中所有发法后,解决。----将任务注册到指定用户的crontab中 crontab -e 问题完美解决,我接触linux时间并不太长,根据我的理解是指定用户crontab时不是nologin状态,会用用户的身份去执行,记录一下,希望能帮助到相似情况的朋友。 PS:我linux机器环境相对较乱,引发问题的原因可能有很多,并不一定是最好的解决方法,等我找到具体的原因后再来更新。 来源: oschina 链接: https://my.oschina.net/u/1860759/blog/2248101

Spark集群奇怪的问题之Workers只显示一个

旧巷老猫 提交于 2019-11-29 12:33:26
首先问一个问题引出问题的根源所在: hostname 仅仅是在 /etc/hosts文件这里控制的吗? 答案: 不是 那么开始今天我的问题记录吧... 环境前置说明: Ubuntu 16.04 LTS版 (三台机器 ,hostname分别是: hadoop-master, hadoop-s1, hadoop-s2, 其中 master机器本身也做了一个slave) jdk 1.8 Hadoop-2.7.3 spark-2.1.1-bin-hadoop2.7 - standalone集群 Scala 2.12.x 我在三台虚拟机上分别输入 jps 查看进程,完全没有问题 都有work进程在里面 但是我打开 hadoop-master:8080 web界面却只能看到一个workers,如图 只有一个,这是怎么回事呢 我们master机器执行 $SPARK_HOME/sbin/start-all.sh 的时候打开一下启动的日志看看,日志位于 $SPARK_HOME/logs , 看看slave1,slave2节点的启动日志 异常有点长, 其实有用的就是这第一行 ! 19/09/13 21:49:35 WARN worker.Worker: Failed to connect to master ubuntu:7077 org.apache.spark.SparkException:

剑谱总纲 | 大数据方向学习面试知识图谱

谁说我不能喝 提交于 2019-11-29 11:57:48
<u> 关注我的公众号,后台回复【JAVAPDF】获取200页面试题! </u> 5万人关注的大数据成神之路,不来了解一下吗? 5万人关注的大数据成神之路,真的不来了解一下吗? 5万人关注的大数据成神之路,确定真的不来了解一下吗? 欢迎您关注 《大数据成神之路》 愿读到这篇文章的技术人早日明白并且脱离技术本身,早登彼岸。 一切技术最终只是雕虫小技。 大纲 本系列主题是大数据开发面试指南,旨在为大家提供一个大数据学习的基本路线,完善数据开发的技术栈,以及我们面试一个大数据开发岗位的时候,哪些东西是重点考察的,这些公司更希望面试者具备哪些技能。 本文不会对某一个知识点进行详细的展开,后续会陆续出专题文章,希望读者能当成一个学习或者复习的大纲,用以查漏补缺。 语言基础篇 Java基础篇 整个大数据开发技术栈我们从实时性的角度来看,主要包含了离线计算和实时计算两大部分,而整个大数据生态中的框架绝大部分都是用 Java 开发或者兼容了 Java 的 API 调用,那么作为基于 JVM 的第一语言 Java 就是我们绕不过去的坎,Java 语言的基础也是我们阅读源码和进行代码调优的基础。 Java 基础主要包含以下部分: 语言基础 锁 多线程 并发包中常用的并发容器(J.U.C) 语言基础 Java 的面向对象 Java 语言的三大特征:封装、继承和多态 Java 语言数据类型 Java

规则引擎三

梦想与她 提交于 2019-11-29 10:17:10
写在前面 之前两篇文章是去年调研和自研规则引擎的存货,今天是最后一篇,后记。 有人会问,标题不是写的动手撸吗?哪里体现撸了? 其实撸起来一个引擎并不复杂,为了体现架构思想,调研心得和设计思想反而更重要,相信优秀如你写代码没有任何压力的。 那我就和大家聊聊业务背景和引擎要求。 设计思想 场景 比如[券表],对于字段属性有一定的规则要求,比如券的互斥属性需要做一定的校验,比如change-config是个json,需要进行解析之后和detail信息做规则校验,等其他的一些规则。 梳理出来的需要主要设计到字段属性的处理,而没有涉及到复杂的流程,数据问题的处理。 核心 定义规则; 确定规则边界; 规则 字段规则,涉及到字段长度,某些信息(地理围栏信息)需要逆向校验是否准确。 流程规则,需要根据不同参数规则进行不同分支流程。 变更频繁,某些业务场景存在每个月规则变化的需求。 举例 字段规则,比如实体字段长度,地理围栏信息。 流程规则,不同来源数据进行不同的规则校验。 校验 规则:业务实体信息校验,采用字段校验规则。 校验:需要配置对应字段的规则,比如名称字段长度,地址位置和经纬度是否一致。 方案调研 硬编码:适用于规则不易变场景。 优点 逻辑简单,易于理解,开发效率高,编码可以由编译器保证。 缺点 迭代成本高可维护性差,规则变更需要发版,上线周期较长,如果代码繁杂需要原RD介入。

Spark的另一个核心的奥秘:任务

岁酱吖の 提交于 2019-11-29 10:16:24
任务(Task)是Spark的最小执行单元,Spark任务是通过Task来执行的。Spark的任务体系是最神秘也是最容易学习的核心模块,任务执行机制点透了那么Spark也就了解的更深入了。Task是任务体系的一个抽象类,有两个子类:ResultTask和ShuffleMapTask,这三个类构成了任务系统的核心。 ResultTask好理解,就是直接执行Task中RDD某个分区的数据操作,还记得之前的RDD的结构吗,里面有一个compute函数,任务就是执行compute函数。 ShuffleMapTask也是执行Task中RDD某个分区的数据操作,所不同的是输出结果的存储方式不一样。ShuffleMapTask会把数据操作的结果保存到类似BlockManager的全局存储中,ShuffleMapTask的结果可供下一个Task作为输入数据。为什么分两种呢?换个说法就很清楚了,ResultTask对应窄依赖的RDD,ShuffleMapTask对应宽依赖的RDD操作(如全连接操作)。ShuffleMapTask需要对数据的读写进行特殊的处理,要用BlockManager来输出数据集的;同样,ShuffleMapTask的子RDD的读取数据集也是从BlockManager来的。 ResultTask和ShuffleMapTask的类的代码非常简单,就是重写runTask方法。