Hadoop系列之Spark安装和使用
Posted 梦Dreamer
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hadoop系列之Spark安装和使用相关的知识,希望对你有一定的参考价值。
spark简介
Spark 的主要抽象是分布式的元素集合(distributed collection of items),称为RDD(Resilient Distributed Dataset,弹性分布式数据集),它可被分发到集群各个节点上,进行并行操作。RDDs 可以通过 Hadoop InputFormats 创建(如 HDFS),或者从其他 RDDs 转化而来。
Spark安装步骤
Spark官网下载地址:http://spark.apache.org/downloads.html
tar -zxf spark-3.0.0-preview-bin-hadoop3.2.tgz #解压
mv spark-3.0.0-preview-bin-hadoop3.2 spark #修改名称
chown -R hadoop:hadoop spark #授权
cp spark/conf/spark-env.sh.template spark/conf/spark-env.sh #复制一个配置文件
vim conf/spark-env.sh #编辑配置文件,加入spark的classpath,如下:
export SPARK_DIST_CLASSPATH=$(/usr/local/soft/hadoop/bin/hadoop classpath)
./bin/spark-shell #启动spark shell,如下是启动成功的样式
基本操作
val textFile = sc.textFile("file:///usr/local/soft/spark/README.md") #通过file:前缀指定读取本地文件,读取本地README文件加载到rdd中
textFile.count() #action API -count()统计该文本文件的行数
textFile.first() #RDD中的第一个item,对于文本文件,就是第一行内容
val linesWithSpark = textFile.filter(line => line.contains("Spark")) #transformation API - filter()筛选出包含Spark的行
linesWithSpark.count() #统计行数
textFile.filter(line => line.contains("Spark")).count() #可以在同一条代码中同时使用多个api,连续进行运算,不仅可以使spark代码更加简洁,也优化了计算过程。
RDDs 支持两种类型的操作
- actions: 在数据集上运行计算后返回值
- transformations: 转换, 从现有数据集创建一个新的数据集
Spark提供了非常丰富的API, 下面两表格列出了几个常用的动作、转换API,更详细的API及说明可查阅官方文档。
表1 常用的Action API
Action API | 说明 |
count() | 返回数据集中的元素个数 |
collect() | 以数组的形式返回数据集中的所有元素 |
first() | 返回数据集中的第一个元素 |
take(n) | 以数组的形式返回数据集中的前n个元素 |
reduce(func) | 通过函数func(输入两个参数并返回一个值)聚合数据集中的元素 |
foreach(func) | 将数据集中的每个元素传递到函数func中运行 |
表2 常用的Transformation API
Transformation API | 说明 |
filter(func) | 筛选出满足函数func的元素,并返回一个新的数据集 |
map(func) | 将每个元素传递到函数func中,并将结果返回为一个新的数据集 |
flatMap(func) | 与map()相似,但每个输入元素都可以映射到0或多个输出结果 |
groupByKey() | 应用于(K,V)键值对的数据集时,返回一个新的(K, Iterable<V>)形式的数据集 |
reduceByKey(func) | 应用于(K,V)键值对的数据集时,返回一个新的(K, V)形式的数据集,其中的每个 值是将每个key传递到函数func中进行聚合 |
Spark SQL和DataFrames
Spark SQL 是 Spark 内嵌的模块,用于结构化数据。在 Spark 程序中可以使用 SQL 查询语句或 DataFrame API。DataFrames 和 SQL 提供了通用的方式来连接多种数据源,支持 Hive、Avro、Parquet、ORC、JSON、和 JDBC,并且可以在多种数据源之间执行 join 操作。
val df = spark.sqlContext.read.json("file:///usr/local/soft/spark/examples/src/main/resources/people.json") #导入数据源
df.show() #输出数据源内容
df.select("name").show() #DataFrames处理结构化数据的操作,只显示name列
df.select(df("name"),df("age")+1).show() #将“age”加1
df.filter(df("age")>21).show() #过滤出年龄大于21岁的数据
使用sql语句进行操作
将DataFrame注册为临时表people
df.createOrReplaceTempView("people") #spark2.x以上写法
df.registerTempTable("people) #spark1.6以下版本写法
spark.sql("SELECT name, age FROM people WHERE age >= 13 AND age <= 19").show() #执行sql语句,并输入结果
问题和解决
1、启动spark shell的时候,报错:Exception in thread "main" java.lang.NoSuchMethodError: jline.console.completer.CandidateListCompletionHandler.setPrintSpaceAfterFullCompletion(Z)V
解决方法:下载的spark版本不正确,需要下载和hadoop对应的版本
例如,本环境使用的是hadoop-3.2.1版本,因此,需要下载的spark版本为
2、error: not found: value sqlContext(参考文章:https://blog.csdn.net/BigData_Mining/article/details/80104694)
解决方法:
spark2.x.x之前的版本,执行的命令如下:
val df = sqlContext.read.json("file:///usr/local/soft/spark/examples/src/main/resources/people.json")
spark2.x.x之后的版本,执行的命需要加上spark,若还用之前的语句,就会出现此错误:
val df = spark.sqlContext.read.json("file:///usr/local/soft/spark/examples/src/main/resources/people.json")
以上是关于Hadoop系列之Spark安装和使用的主要内容,如果未能解决你的问题,请参考以下文章
大数据学习系列之六 ----- Hadoop+Spark环境搭建
大数据学习系列之七 ----- Hadoop+Spark+Zookeeper+HBase+Hive集
大数据学习系列之七 ----- Hadoop+Spark+Zookeeper+HBase+Hive集群搭建 图文详解
Spark入门实战系列--2.Spark编译与部署(中)--Hadoop编译安装