Spark Core——day1

一笑奈何 提交于 2020-01-28 08:14:18

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应用到集群执行
  • 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
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!