spark特点
- 分布式(分开存储)
- 主要基于内存(少数情况基于磁盘)(存储位置)
- 迭代式计算(可以分为多个阶段,而MapReduce只有map和reduce两个阶段,所有计算操作是针对多个节点上的数据进行并行操作的)
RDD
- RDD,即弹性分布式数据集,是Spark提供的核心抽象。
- 是一种元素集合。被分为多个分区,每个分区分布在集群中的不同节点上,从而RDD中数据可以被并行操作。
- 通常通过HDFS或Hive表进行创建,也可用程序中的集合进行创建。
- 最重要特性:容错性,可以自动从节点失败中恢复。即若某节点上的RDD partition(分区)因为节点故障导致数据丢失,则RDD会通过自己的数据重新计算该partition。该过程对使用者透明。
- 数据默认放在内存中,当内存不足则写入磁盘
Spark 开发
- 核心开发:离线批处理/延迟性的交互式数据处理
- 数据
- 计算
- 循环
- 保存
- SQL查询(底层是RDD和计算)
- 实时计算(底层是RDD和计算)
wordcount程序
- java
- 配置maven环境
- pom.xml 中添加依赖和插件
- 如何本地测试
-
public class WordCountLocal{ public static void main(String[] args){ // 第一步,创建SparkConf对象,设置Spark应用的配置信息 // 使用setMaster()可以设置Spark应用程序要连接Spark集群的master节点的url // 设置为local表示本地运行 SparkConf conf = new SparkConf() .setAppName("WordCountLocal“) .setMaster("local"); // 第二步,创建JavaSparkContext对象 // 在Spark中,SparkContext是Spark所有功能的一个入口 // 主要作用,初始化核心组件,包括调度器,注册等 // 编写不同类型的Spark应用,使用的SparkContext是不同的 // 使用scala使用的是原生的SparkContext对象 // 使用Java,使用的是JavaSparkContext对象 // 开发Spark sql,使用SQLContext、HiveContext // 开发Spark Streaming程序,是它独有的SparkContext JavaSparkContext sc = new JavaSparkContext(conf); // 第三步:针对输入源,创建一个初始的RDD // 输入源中的数据会打散,分配到RDD的每个分区中,形参初始分布式数据集 // SparkContext中,用于根据文件类型的输入源创建RDD的方法是textFile() // java中创建的普通RDD,都叫JavaRDD // 创建的RDD中的每个元素相当于文件中的一行 JavaRDD<String> lines = sc.textFile("file path"); // 第四步:对初始RDD进行转换(计算)操作 // 通常操作会通过创建function,并配合RDD的map、flagMap等算子来执行 // 如果function比较简单,则创建其指定匿名内部类 // 否则单独创建一个类,作为实现这个function接口的类 // 先将每一行拆分成单个单词 // FlatMapFunction有两个泛型参数,分别表示了输入和输出类型 // flatMap算子的作用是将一个元素拆分成一个或多个元素 JavaRDD<String> words = lines.flatMap(new FlatMap(new FlatMapFunction<String,String>(){ private stacic final long serialVersionUID = 1L; @Override public Iterable<String> call(String line) throws Exception{ return Arrays.asList(line.split(" ")); } })); // 接着,需要将每一个单词映射为(单词,1)形式 // 只有这样才能以单词为key,进行单词出现次数的累加 // mapToPair将每个元素映射为(v1,v2)这样的Tuple2类型的元素 // 要求与PairFunction配合使用,第一个泛型参数代表了输入类型 // 第二个和第三个泛型参数,代表输出Tuple2的第一个值和第二个值的类型 // JavaPairRDD 也表示Tuple2的第一个值和第二个值的类型 JavaPairRDD<String, Integer> pairs = words.mapToPair(new Function<String, String, Integer>(){ private static final long serialVersionUID = 1L; @Override public Tuple2<String, Integer> call(String word) throws Exception{ return null; } }); // 单词作为key,统计出现次数 // 使用reduceByKey算子,对每个key对应的value都进行reduce操作 // 将相同的key变为一个,值进行累加 JavaPairRDD<String,Integer> wordCounts = pairs.reduceByKey( new Function2<Integer, Integer, Integer>(){ private static final long serialVersionUID = 1L; @Override public Integer call(Integer v1, Integer v2) throws Exception{ return v1 + v2; } } ); // 最后使用action操作才会执行,比如foreach wordCounts.foreach(new VoidFunction<Tuple2<String, Integer>>(){ @Override public void call(Tuple2<String, Integer> wordCount) throws Exception{ System.out.println(wordCount._1 + " appeared " + wordCount._2 + " times."); } } ); sc.close(); } }
-
- 如何使用spark-submit提交到集群中执行
- 去除setMaster
- 文件改为连接地址
- 执行步骤
- 首先将文件上传到hdfs
- 使用maven插件对spark工程进行打包
- 将jar包上传
- 编写spark-submit脚本
- 执行脚本,提交Spark应用到集群执行
- 配置maven环境
- scala
-
object c{ def main(args: Array[String]){ val conf = new SparkConf)_ .setAppName("WordCount") val sc = new SparkContext(conf) var lines = sc.textFile("..."); val words = lines.flatMap{line => line.split{" "}} var pairs = words.map{ word => {word,1}} var wordCounts = pairs.reduceByKey { _ + _ } wordCounts.foreach{wordCount => println(wordCount._1 + " appeared " + wordCount._2 + " times.")} } }
-
- 访问启动日志下的地址及端口,查看任务
- master默认为本地,连接集群必须指定master
来源:CSDN
作者:fan2312
链接:https://blog.csdn.net/fan2312/article/details/103787671