Spark编程基础

ISBN 9787115488169

之前我们已经完成了Hadoop+Spark集群的搭建,下面改用这本书。

教材,讲义,实验

sbt

Spark应用程序开发可以采用Scala+sbt,Java+Maven,或Python直接spark-submit三种方式。

这里介绍通过sbt编译打包Scala程序的命令行方法,也可以使用Intellij idea或Eclipse等集成开发环境。

安装

echo "deb https://dl.bintray.com/sbt/debian /" | sudo tee -a /etc/apt/sources.list.d/sbt.list
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 2EE0EA64E40A89B84B2DF73499E82A75642AC823
sudo apt-get update
sudo apt-get install sbt

Scala独立应用程序

项目结构:

mkdir -p ./sparkapp/src/main/scala

sparkapp/src/main/scala目录下新建SimpleApp.scala,该程序计算/usr/local/spark/README.md文件中包含a的行数和包含b的行数。

/* SimpleApp.scala */
import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.SparkConf

object SimpleApp {
    def main(args: Array[String]) {
        val logFile = "file:///usr/local/spark/README.md" // Should be some file on your system
        val conf = new SparkConf().setAppName("Simple Application")
        val sc = new SparkContext(conf)
        val logData = sc.textFile(logFile, 2).cache()
        val numAs = logData.filter(line => line.contains("a")).count()
        val numBs = logData.filter(line => line.contains("b")).count()
        println("Lines with a: %s, Lines with b: %s".format(numAs, numBs))
    }
}

sparkapp目录下新建simple.sbt

name := "Simple Project"
version := "1.0"
scalaVersion := "2.11.8"
libraryDependencies += "org.apache.spark" %% "spark-core" % "2.1.3"

使用sbt编译打包:

sbt package

首次使用要从网络上下载依赖包,可能会比较久。

将生成的jar包通过spark-submit提交到Spark中运行:

spark-submit --class "SimpleApp" target/scala-2.11/simple-project_2.11-1.0.jar 2>&1 | grep "Lines with a:"

HDFS文件存储架构

在开始分布式程序设计之前,用一个实例来认识一下分布式环境中数据的分布。

配置三个slave服务器(即3个datanode),dfs.replication为2,block size为128M的条件下,假设我们有一个490M的文件,则在HDFS中会被切分成4个block(0, 1, 2, 3),每个block复制2份,在50070可以查看block id,从而在slave的dfs.datanode.data.dir目录下可以看到具体的区块分布情况。比如在我的测试中,slave1上有上述文件的block 1, 2, 3,slave2上有block 0,slave3上有block 0, 1, 2, 3。

因此数据的不完整导致了集中式算法不能得到正确的结果,需要设计并行算法。当然实际上并不关心数据的具体分布情况,这里只是给出一个直观的感受。

启动Spark集群

在master和slave服务器上修改spark-env.sh

export SPARK_DIST_CLASSPATH=$(/usr/local/hadoop/bin/hadoop classpath)
export HADOOP_CONF_DIR=/usr/local/hadoop/etc/hadoop
export SPARK_MASTER_IP=172.17.0.5

启动Hadoop集群:start-all.sh

启动Spark集群:

cd /usr/local/spark/sbin
./start-master.sh
./start-slaves.sh

使用jps可以看到master上多了一个Master进程,slave上多了一个Worker进程。也可以通过http://master:8080查看。

Spark RDD

Resilient Distributed Dataset(弹性分布式数据集)是Spark的核心,属于分布式的内存系统的数据集应用,可以与外部存储系统的数据集兼容,如HDFS、HBase或其他Hadoop数据源。

RDD之上有三种基本运算:

  1. 转换:会产生新的RDD,但这类运算不会立刻执行,而是等到执行动作运算时一起执行
  2. 动作:不产生新的RDD,而是产生数值、数组或写入文件系统
  3. 持久化:将重复使用的RDD持久化在内存中

RDD特性:

  1. immutable:不可变
  2. lineage:记录每个RDD与其父代RDD之间的关联,通过什么操作得到该RDD

因此Spark具备容错特性,某节点机器故障,RDD损毁,会重新执行一连串转换命令,产生新的输出数据。

Scala集合操作

  1. 遍历
  2. map,flatmap
  3. filter
  4. reduce
  5. fold

原文地址:https://www.cnblogs.com/humz/p/10935903.html

时间: 2024-10-06 20:07:59

Spark编程基础的相关文章

Spark 编程基础

1. 初始化Spark import org.apache.spark.{SparkContext, SparkConf} val conf=new SparkConf().setAppName("RDD1").setMaster("local") val sc=new SparkContext(conf) 2. 创建RDD的方法 内存:Parallelize 或者 makeRDD 外部文件:textFile //1. both Parallelize and ma

Spark入门实战系列--3.Spark编程模型(上)--概念及SparkShell实战

[注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送–Spark入门实战系列>获取 1 Spark编程模型 1.1 术语定义 应用程序(Application): 基于Spark的用户程序,包含了一个Driver Program 和集群中多个的Executor: 驱动程序(Driver Program):运行Application的main()函数并且创建SparkContext,通常用SparkContext代表Driver Program: 执行单元(Executor): 是为某

Spark入门实战系列--3.Spark编程模型(下)--IDEA搭建及实战

[注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送–Spark入门实战系列>获取 1 安装IntelliJ IDEA IDEA 全称 IntelliJ IDEA,是java语言开发的集成环境,IntelliJ在业界被公认为最好的java开发工具之一,尤其在智能代码助手.代码自动提示.重构.J2EE支持.Ant.JUnit.CVS整合.代码审查. 创新的GUI设计等方面的功能可以说是超常的.IDEA是JetBrains公司的产品,这家公司总部位于捷克共和国的首都布拉格,开发人员以严谨

学大数据需要什么编程基础?大数据学习步骤是什么?

学大数据需要什么编程基础?大数据学习步骤是什么? 大数据是什么? 有很多朋友问过我,大数据到底是什么?一句话来- 学大数据需要什么编程基础?大数据学习步骤是什么?大数据是什么? 有很多朋友问过我,大数据到底是什么?一句话来概括 针对非软件行业的朋友 根据你平时在超市,加油站,饭店等地方的一些消费行为,通过大数据这个技术,我们可以知道你现在的年龄范围,是否婚配,是否有孩子,孩子大致是几岁,是否有固定住宅,车大致是什么价位的等信息. 针对软件行业的朋友 平时我们写的程序都是在一台机器上运行,处理能力

1.5编程基础之循环控制_29:数字反转

/* 1.5编程基础之循环控制 29:数字反转 总时间限制: 1000ms 内存限制: 65536kB 描述 给定一个整数,请将该数各个位上数字反转得到一个新数. 新数也应满足整数的常见形式,即除非给定的原数为零, 否则反转后得到的新数的最高位数字不应为零(参见样例2). 输入 输入共 1 行,一个整数N. -1,000,000,000 ≤ N≤ 1,000,000,000. 输出 输出共 1 行,一个整数,表示反转后的新数. 样例输入 样例 #1: 123 样例 #2: -380 样例输出 样

网络编程基础

网络编程基础 1.套接字概念 Linux环境下使用套接字进行进程之间的通信.用过套接字的接口,其他进程的位置对于应用程序来讲是透明的.相互通信双方端点都有一个套接字,双方如果要进行通信,通过套接字建立桥梁,双方就可以通信了. 类似文件一样,套接字也有一个套接字描述符,应用程序可以像操作文件一样操作套接字.在进行网络通信的过程中,用户感觉就是在操作文件一样,这是Linux将外部设备抽象为一个文件的好处. 2.字节序 不同主机的体系结构不同,所采用的数据存储方式不同.网络中,进程之间的通信是跨主机的

多线程编程基础知识

多线程编程基础知识 http://www.cnblogs.com/cy163/archive/2006/11/02/547428.html 当前流行的Windows操作系统能同时运行几个程序(独立运行的程序又称之为进程),对于同一个程序,它又可以分成若干个独立的执行流,我们称之为线程,线程提供了多任务处理的能力.用进程和线程的观点来研究软件是当今普遍采用的方法,进程和线程的概念的出现,对提高软件的并行性有着重要的意义.现在的大型应用软件无一不是多线程多任务处理,单线程的软件是不可想象的.因此掌握

shell 脚本编程基础

一.编程基础 程序:指令+数据 程序编程风格: 过程式:以指令为中心,数据服务于指令 对象式:以数据为中心,指令服务于数据 shell程序:提供了编程能力,解释执行 1.程序的执行方式 计算机:运行二进制指令: 编程语言: 低级:汇编 高级: 编译:高级语言–>编译器–>目标代码 java,C# 解释:高级语言–>解释器–>机器代码 shell, perl, python 2.编程基本概念 编程逻辑处理方式: 顺序执行 循环执行 选择执行 shell编程:过程式.解释执行 编程语言

DAY9:bash脚本编程基础(1)

内容主要为: 一.编程基础 二.shell脚本及其基本格式 三.变量 四.运算 五.条件测试 六.流程控制 一.编程基础 1)程序 程序:指令+数据 程序编程风格: 过程式:以指令为中心,数据服务于指令(C,bash) 对象式:以数据为中心,指令服务于数据 (java,C++,Python) shell程序:提供了编程能力,解释执行 2)程序的执行方式 计算机:运行二进制指令: 编程语言: 低级:汇编 高级: 编译:高级语言-->编译器-->目标代码 java,C# 解释:高级语言-->