大数据实验1: Hadoop, Scala, Spark的安装

关于分治算法和Map Reduce的原理:算法实验2:分而治之——修身齐家编算法;

The full official tutorial of Spark programming could be found in https://spark.apache.org/docs/latest/rdd-programming-guide.html#resilient-distributed-datasets-rdds

安装Hadoop

参考:https://www.cnblogs.com/wuxun1997/p/6847950.html
Win环境下Hadoop的bin工具下载:https://github.com/Qinzixin/winutils
安装完成后,localhost:8080可见:
在这里插入图片描述
踩坑:jps找不到Data Node,打不开localhost:50070
出现如下报错:java.lang.UnsatisfiedLinkError…
问题原因:Java必须是64位的
解决方式:重新装Java环境,并修改hadoop_env.cmd中的JAVA_HOME路径。
重新安装之后:
在这里插入图片描述

安装Scala

安装scala插件:
https://www.jetbrains.com/help/idea/2017.1/creating-and-running-your-scala-application.html
https://www.jetbrains.com/help/idea/2017.1/enabling-and-disabling-plugins.html
直接在应用市场安装会network error,所以需要自行下载:
https://plugins.jetbrains.com/plugin/1347-scala/versions/stable
先打开IDEA的目的是获取匹配的scala版本号,之后根据这个教程手动导入即可:
https://www.cnblogs.com/zhaojinyan/p/9524296.html

安装Spark

必须按照Hadoop, Scala, Spark的顺序安装
必须使用64位的JDK
如果用IDEA,必须使用付费版(Ultimate)
安装教程参考:https://blog.csdn.net/haijiege/article/details/80775792
在Windows下单机模式跑,需要修改命令行参数源码中NativeIO类的定义

配置工程

在这里插入图片描述
直接导入spark的jar包;统一所有的JDK版本;如果org.apache.spark.examples找不到就复制到记事本再粘贴回去(编码错误)
在这里插入图片描述
修改log4j.properties文件,放到src目录下,消除INFO输出。

Why Spark?

Spark 是一种基于内存的快速、通用、可扩展的大数据分析计算引擎。

HadoopSpark
发源于YahooBerkley
语言JavaScala
组件MapReduce, Hbase, HDFSSpark Core, Spark SQL, Spark Stream
应用场景基于MapReduce,适用于循环迭代类型数据处理针对机器学习算法,进行针对性计算优化,单元缩小到RDD模型
多个作业之间的数据通信问题基于磁盘基于内存

在实际的生产环境中,由于内存的限制,可能会由于内存资源不够导致 Job 执行失败,此时,MapReduce 其实是一个更好的选择,所以Spark并不能完全替代 MapReduce

初始化Spark

Spark程序需要做的第一件事情,就是创建一个SparkContext对象,它将告诉spark如何访问一个集群。

而要创建一个SparkContext对象,你首先要创建一个SparkConf对象,该对象访问了你的应用程序的信息(配置)。
https://blog.csdn.net/tanggao1314/article/details/51570452/

package org.apache.spark.examples;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.sql.SparkSession;
import java.util.ArrayList;
import java.util.List;

public final class JavaSparkPi {
    public static void main(String[] args) {
        SparkConf conf=new SparkConf(); //创建spark配置
        conf.set("spark.testing.memory", "2147480000");     //因为jvm无法获得足够的资源,或者在VM编译选项中添加'-Xms256m -Xms1024m'
        JavaSparkContext sc = new JavaSparkContext("local", "First Spark App",conf); //在本机环境(context)下创建spark

        System.out.println(sc);
    }
}

Spark的核心:RDD (Resilient Distributed Datasets)

RDD:spark抽象的分布式数据集,分布在集群的节点上,key通过函数式的操作进行并行计算。

  • 只读,不可以修改,但是可以转换(transform)成另一个新的RDD
  • 分布式
  • 弹性:如果内存不够,会和磁盘进行数据交换

RDD的分类

  • 转换(transform):把一个数据集转成另外一个数据集

All transformations in Spark are lazy, in that they do not compute their results right away. Instead, they just remember the transformations applied to some base dataset (e.g. a file). The transformations are only computed when an action requires a result to be returned to the driver program. This design enables Spark to run more efficiently. For example, we can realize that a dataset created through map will be used in a reduce and return only the result of the reduce to the driver, rather than the larger mapped dataset.

By default, each transformed RDD may be recomputed each time you run an action on it. However, you may also persist an RDD in memory using the persist (or cache) method, in which case Spark will keep the elements around on the cluster for much faster access the next time you query it. There is also support for persisting RDDs on disk, or replicated across multiple nodes.

  • action:发出信号,让转换开始计算

基本操作

注:为了显示方便,我们用#来注释,粘贴时请改为//

并行化数组

List<Integer> data = Arrays.asList(1, 2, 3, 4, 5);
JavaRDD<Integer> distData = sc.parallelize(data,10); # on 10 CPUs

读入文件

JavaRDD<String> distFile = sc.textFile("data.txt"); # 支持通配符

简单的Map和reduce示例

Lambda

JavaRDD<String> lines = sc.textFile("data.txt");
JavaRDD<Integer> lineLengths = lines.map(s -> s.length()); # Map, which is Lazy, and will NOT be stored,and cannot be printed
lineLengths.persist(StorageLevel.MEMORY_ONLY()); # 持久化
int totalLength = lineLengths.reduce((a, b) -> a + b); # reduce

如果报错,说明编译的level不对,不支持lambda表达式:https://blog.csdn.net/HCZ_hhh/article/details/115536405

mapToPair

JavaRDD<String> lines = sc.textFile("data.txt");
JavaPairRDD<String, Integer> pairs = lines.mapToPair(s -> new Tuple2(s, 1));
JavaPairRDD<String, Integer> counts = pairs.reduceByKey((a, b) -> a + b);

去掉多余的输出信息

把修改后的log4j.properties文件放到src目录下面,之后把src在IDEA中设置为Mark as source root.

示例:文本统计

中文的还不行…

import javafx.util.Pair;
import org.apache.spark.api.java.*;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.function.Function;
import org.apache.spark.sql.sources.In;
import org.apache.spark.storage.StorageLevel;
import scala.Tuple2;

import java.util.Arrays;
import java.util.List;

public class Test {
    public static void main(String[] args) {
        SparkConf conf=new SparkConf(); //创建spark配置
        conf.set("spark.testing.memory", "2147480000");     //因为jvm无法获得足够的资源
        JavaSparkContext sc = new JavaSparkContext("local", "First Spark App",conf); //在本机环境(context)下创建spark
        JavaRDD<String> lines = sc.textFile("data.txt");
        JavaRDD<String> words = lines.flatMap(t -> Arrays.asList(t.split(" ")).iterator());
        JavaPairRDD<String, Integer> wordAndOne = words.mapToPair(word -> new Tuple2<>(word, 1));
        JavaPairRDD<String, Integer> result = wordAndOne.reduceByKey((a, b) -> a + b);
        JavaPairRDD<Integer, String> beforeSwap = result.mapToPair(tp -> tp.swap());
        JavaPairRDD<Integer, String> sorted = beforeSwap.sortByKey(false);
        JavaPairRDD<String, Integer> finalRes = sorted.mapToPair(tp -> tp.swap());

        List<Tuple2<String, Integer>> list = finalRes.collect();
        for(Tuple2<String,Integer> l:list)
            System.out.println(l);
    }
}

RDD 操作大全

Map

  • 拆分:flatMap(line -> Arrays.asList(line.split(","))).iterator()
  • 增加数值:map(x, x+y)
  • 增加属性:mapToPair(item -> new Tuple2<>(item_1,item._2))
    mapToPair也可以map到常数,然后根据数据的性质去做reduce.
  • 外部变量的广播:broadcast()

Reduce

  • 过滤:filter(num->num%2==0)
  • 对key进行分组:groupByKey(func)
  • 对key相同的进行操作:reduceByKey((a, b) -> a + b)
  • 收集全部:collect().forEach(System.out::println)
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 大数据开发工程师系列是指专门从事大数据开发的一类职业。HadoopSpark大数据领域中最受欢迎的两个开源框架。 Hadoop是一个分布式计算框架,用于处理大规模数据集的分布式存储和计算。Hadoop的核心是Hadoop分布式文件系统(HDFS)和MapReduce计算模型。HDFS将数据分布存储在集群的多个节点上,MapReduce可以并行处理这些分布式数据。Hadoop具有高可靠性、高扩展性和高容错性的特点,并且还提供了许多其他工具和库,如Hive、Pig和HBase等。 Spark是一个快速、通用的大数据处理引擎,可以在多种数据源上进行高效的分布式计算。相比于Hadoop的MapReduce,Spark具有更快的数据处理速度和更强的扩展性。Spark提供了一个称为弹性分布式数据集(RDD)的抽象,可以在内存中高效地处理大规模数据集。此外,Spark还提供了许多高级组件和库,如Spark SQL、Spark Streaming和MLlib等,用于处理结构化数据、流式数据和机器学习。 作为大数据开发工程师,掌握HadoopSpark是非常重要的。使用Hadoop可以处理海量数据,并且具有高可靠性和容错性。而Spark则能够快速高效地处理大规模数据,并提供了更多的数据处理和分析功能。 大数据开发工程师需要熟悉HadoopSpark的使用和调优技巧,以及相关的编程语言和工具,如Java、Scala和Python。他们需要了解数据处理的算法和模型,并能够设计和实现高效的分布式计算方案。此外,大数据开发工程师还需要具备良好的沟通能力和团队合作能力,能够与数据科学家和业务团队紧密合作,共同解决实际问题。 总之,大数据开发工程师系列是一个专门从事大数据开发的职业群体。而HadoopSpark则是这个职业群体中最重要的两个工具,他们分别用于大规模数据处理和分布式计算。掌握HadoopSpark的使用和优化技巧,是成为一名优秀的大数据开发工程师的关键能力。 ### 回答2: 大数据开发工程师系列主要涉及到两个重要的技术:HadoopSparkHadoop是一个开源的分布式计算框架,主要用于存储和处理大规模数据集。它通过将数据分散存储在集群中的多个节点上,并在节点之间进行数据通信和计算,实现了数据的并行处理和高可靠性。Hadoop的核心工具是HDFS(Hadoop分布式文件系统)和MapReduce(一种用于分布式计算的编程模型)。HDFS用于将数据分布式存储在集群中,而MapReduce则是用于分布式计算的框架,通过将计算任务分解成多个小任务并在各个节点上并行执行,大大提高了数据处理的效率和性能。 Spark是当前最受欢迎的大数据计算框架之一,也是一个开源项目。与Hadoop相比,Spark具有更快的数据处理速度和更强大的功能。Spark提供了一个可扩展的分布式数据处理框架,支持数据处理、机器学习、图计算等多种大数据应用场景。与传统的基于磁盘的计算框架相比,Spark利用内存计算的优势,可以快速地对大规模数据进行处理和分析。此外,Spark还提供了丰富的API和开发工具,使开发人员可以更轻松地构建和调试大数据应用程序。 作为大数据开发工程师,掌握HadoopSpark是必不可少的。熟悉Hadoop的使用和原理,能够有效地存储和处理大规模数据集。而对于Spark的掌握,则可以提高数据处理的速度和效率,使得大数据分析和挖掘更加容易实现。因此,大数据开发工程师需要具备对HadoopSpark的深入理解和熟练应用,同时还需要具备数据分析、算法和编程等多方面的技能,以应对复杂的大数据挑战。 ### 回答3: 大数据开发工程师是一个专注于处理大数据的职位,主要负责使用各种工具和技术来处理和分析大规模的数据集。 HadoopSpark是目前在大数据处理领域中非常流行的两个开源工具。Hadoop是一个分布式系统基础架构,可以在集群中存储和处理大规模数据。它的核心是Hadoop分布式文件系统(HDFS)和MapReduce计算模型。HDFS将数据分散存储在集群的不同节点上,而MapReduce模型则提供了一种并行处理数据的方式。大数据开发工程师需要熟悉Hadoop的架构和命令行工具,能够编写MapReduce程序来处理数据。 Spark是一个快速和通用的大数据处理引擎,可以在大规模集群上执行数据处理任务。它拥有比Hadoop更高的性能和更丰富的功能。Spark提供了强大的机器学习、图计算和流处理等功能。大数据开发工程师需要熟悉Spark的API和编程模型,能够使用Spark的各种组建和工具进行数据处理和分析。 作为大数据开发工程师,掌握HadoopSpark是非常重要的。使用HadoopSpark可以有效地处理大规模数据,提取有价值的信息。大数据开发工程师通过编写和优化MapReduce程序来实现数据处理的需求,同时也能利用Spark提供的机器学习和流处理等功能来进行更复杂的数据分析。通过合理地使用HadoopSpark大数据开发工程师可以减少数据处理的时间和成本,提高数据处理的效率和准确性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值