ubantu18.04(Hadoop3.1.3)之Spark安装和编程实践

说明:本文图片较多,耐心等待加载。(建议用电脑)

注意所有打开的文件都要记得保存。

 第一步:准备工作

本文是在之前Hadoop搭建完集群环境后继续进行的,因此需要读者完成我之前教程的所有操作。

以下所有操作均在Master主机进行。

 第二步:安装 Spark2.4.0

1.首先需要下载Spark安装文件,在虚拟机打开浏览器粘贴下面的地址

Index of /dist/spark

 2.找到2.4.0,点击

3.点击 spark-2.4.0-bin-without-hadoop.tgz

 第三步:安装Spark(Local模式)

1.打开终端输入粘贴以下命令:(注意最后一句是你的用户名

sudo tar -zxf ~/下载/spark-2.4.0-bin-without-hadoop.tgz -C /usr/local/
cd /usr/local
sudo mv ./spark-2.4.0-bin-without-hadoop/ ./spark
sudo chown -R hadoop:hadoop ./spark          # 此处的 hadoop 为你的用户名

 2.继续在终端输入以下命令:

cd /usr/local/spark
cp ./conf/spark-env.sh.template ./conf/spark-env.sh

3.继续在终端入:

vim ./conf/spark-env.sh

在第一行添加以下配置信息:

export SPARK_DIST_CLASSPATH=$(/usr/local/hadoop/bin/hadoop classpath)

 记得保存退出。

4.验证Spark是否安装成功。出现如下界面即成功

cd /usr/local/spark
bin/run-example SparkPi 2>&1 | grep "Pi is"

第四步:使用 Spark Shell 编写代码

 1.启动Spark Shell

在终端继续输入:

cd /usr/local/spark
bin/spark-shell

 

2.加载text文件

 在终端继续输入:

val textFile = sc.textFile("file:///usr/local/spark/README.md")

3.简单RDD操作

终端可以输入:

//获取RDD文件textFile的第一行内容
textFile.first()
//获取RDD文件textFile所有项的计数
textFile.count()
//抽取含有“Spark”的行,返回一个新的RDD
val lineWithSpark = textFile.filter(line => line.contains("Spark"))
//统计新的RDD的行数
lineWithSpark.count()
//找出文本中每行的最多单词数
textFile.map(line => line.split(" ").size).reduce((a, b) => if (a > b) a else b)

 4.退出Spark Shell

输入:

:quit

 第五步:独立应用程序编程

(一)使用sbt对Scala独立应用程序进行编译打包

1. 安装sbt

说明一下,因为这个地址下载之前版本的时候,是从github拉取得,我这里在虚拟机下载很慢,就直接在主机进行下载(魔法),然后放到共享文件夹,然后拖到下载目录。

在虚拟机的浏览器复制下面地址

Download | sbt

 找到sbt-1.3.8.tgz。

我这里在共享文件夹,(不知道在哪里的翻前面的教程第一章) 

 然后拖到下载里

在终端中执行如下命令: (注意下面的hadoop,是你自己的用户名

sudo mkdir /usr/local/sbt 
cd ~/下载
sudo tar -zxvf ./sbt-1.3.8.tgz -C /usr/local
cd /usr/local/sbt
sudo chown -R hadoop /usr/local/sbt
cp ./bin/sbt-launch.jar ./ 

 

使用下面命令创建一个Shell脚本文件 

vim /usr/local/sbt/sbt

添加以下内容到文件 

#!/bin/bash

SBT_OPTS="-Xms512M -Xmx1536M -Xss1M -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=256M"

java $SBT_OPTS -jar `dirname $0`/sbt-launch.jar "$@"

 保存后,还需要为该Shell脚本文件增加可执行权限:继续执行以下命令

chmod u+x /usr/local/sbt/sbt

最后,可以使用如下命令查看sbt版本信息: 

注意出现以下界面极为成功,但是需等待时间很长,取决于你的网速,博主这里网速较慢就去刷了10分钟抖音,大家也可以去了。记的回来哈!

有想提速解决这个问题的的,可以去看看教程里给的博客,我这里就“苦等”了。(刷dy)

./sbt sbtVersion

 

Scala应用程序代码

 在终端中执行如下命令创建一个文件夹 sparkapp 作为应用程序根目录:

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

继续输入

vim ./sparkapp/src/main/scala/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))
    }
}

保存退出。 继续输入下面的命令:

cd ~/sparkapp
vim simple.sbt

在文本添加以下内容

name := "Simple Project"

version := "1.0"

scalaVersion := "2.11.12"

libraryDependencies += "org.apache.spark" %% "spark-core" % "2.4.0"

保存退出,继续输入以下: 

cd ~/sparkapp
find .

 出现以上界面成功。

使用 sbt 打包 Scala 程序

接着,我们就可以通过如下命令将整个应用程序打包成 JAR(首次运行同样需要下载依赖包 ):

/usr/local/sbt/sbt package

  出现以上界面成功。

通过 spark-submit 运行程序,终端输入以下命令:

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

  出现以上界面成功。 

(二)使用Maven对Java独立应用程序进行编译打包

1. 安装Maven

在虚拟机浏览器粘贴一下地址

Index of /dist/maven/maven-3

找到 3.6.3

继续 

 继续

在终端继续输入下面的命令: (注意最后一句是你的用户名

sudo unzip ~/下载/apache-maven-3.6.3-bin.zip -d /usr/local
cd /usr/local
sudo mv apache-maven-3.6.3/ ./maven
sudo chown -R hadoop-202202810203- ./maven

 

2. Java应用程序代码 

cd ~
mkdir -p ./sparkapp2/src/main/java
vim ./sparkapp2/src/main/java/SimpleApp.java

在文件里添加以下内容:

/*** SimpleApp.java ***/
import org.apache.spark.api.java.*;
import org.apache.spark.api.java.function.Function;
import org.apache.spark.SparkConf;

public class SimpleApp {
    public static void main(String[] args) {
        String logFile = "file:///usr/local/spark/README.md"; // Should be some file on your system
        SparkConf conf = new SparkConf().setMaster("local").setAppName("SimpleApp");
        JavaSparkContext sc = new JavaSparkContext(conf);
        JavaRDD<String> logData = sc.textFile(logFile).cache(); 
        long numAs = logData.filter(new Function<String, Boolean>() {
            public Boolean call(String s) { return s.contains("a"); }
        }).count(); 
        long numBs = logData.filter(new Function<String, Boolean>() {
            public Boolean call(String s) { return s.contains("b"); }
        }).count(); 
        System.out.println("Lines with a: " + numAs + ", lines with b: " + numBs);
    }
}

 继续在终端输入:

cd ~/sparkapp2
vim pom.xml

在文件里添加在下面的内容

<project>

    <groupId>cn.edu.xmu</groupId>

    <artifactId>simple-project</artifactId>

    <modelVersion>4.0.0</modelVersion>

    <name>Simple Project</name>

    <packaging>jar</packaging>

    <version>1.0</version>

    <repositories>

        <repository>

            <id>jboss</id>

            <name>JBoss Repository</name>

            <url>http://repository.jboss.com/maven2/</url>

        </repository>

    </repositories>

    <dependencies>

        <dependency> <!-- Spark dependency -->

            <groupId>org.apache.spark</groupId>

            <artifactId>spark-core_2.11</artifactId>

            <version>2.4.0</version>

        </dependency>

    </dependencies>

</project>  

 为了保证maven能够正常运行,先执行如下命令检查整个应用程序的文件结构:

保存退出,继续在终端输入以下命令

find .

 ​​​出现下面的结构

继续输入 下面的命令

大家可以去刷15分钟抖音了,这里也很慢哈。

/usr/local/maven/bin/mvn package

 出现下面的界面极为成功。

通过spark-submit 运行程序 ,继续在终端输入

/usr/local/spark/bin/spark-submit --class "SimpleApp" ~/sparkapp2/target/simple-project-1.0.jar 2>&1 | grep "Lines with a"

  出现下面的界面极为成功。

 (三)使用Maven对Scala独立应用程序进行编译打包

 Scala应用程序代码

在终端中执行如下命令创建一个文件夹 sparkapp3作为应用程序根目录:

cd ~           # 进入用户主文件夹
mkdir ./sparkapp3        # 创建应用程序根目录
mkdir -p ./sparkapp3/src/main/scala     # 创建所需的文件夹结构

继续输入:

vim ./sparkapp3/src/main/scala/SimpleApp.scala

在文件欸添加下面的内容

/* 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))
    }
}

使用Maven进行编译打包

在终端中执行如下命令

cd ~/sparkapp3
vim pom.xml

 在文件里添加下面的内容

<project>

    <groupId>cn.edu.xmu</groupId>

    <artifactId>simple-project</artifactId>

    <modelVersion>4.0.0</modelVersion>

    <name>Simple Project</name>

    <packaging>jar</packaging>

    <version>1.0</version>

    <repositories>

        <repository>

            <id>jboss</id>

            <name>JBoss Repository</name>

            <url>http://repository.jboss.com/maven2/</url>

        </repository>

    </repositories>

    <dependencies>

        <dependency> <!-- Spark dependency -->

            <groupId>org.apache.spark</groupId>

            <artifactId>spark-core_2.11</artifactId>

            <version>2.4.0</version>

        </dependency>

    </dependencies>

  <build>

    <sourceDirectory>src/main/scala</sourceDirectory>

    <plugins>

      <plugin>

        <groupId>org.scala-tools</groupId>

        <artifactId>maven-scala-plugin</artifactId>

        <executions>

          <execution>

            <goals>

              <goal>compile</goal>

            </goals>

          </execution>

        </executions>

        <configuration>

          <scalaVersion>2.11.12</scalaVersion>

          <args>

            <arg>-target:jvm-1.8</arg>

          </args>

        </configuration>

    </plugin>

    </plugins>

</build>

</project>

继续执行下面的内容

find  .

  出现上面的界面极为成功。

继续在终端输入:

大家可以去刷15分钟抖音了,这里也很慢哈。

/usr/local/maven/bin/mvn  package

出现上面的界面极为成功。 

通过 spark-submit 运行程序

继续在终端输入:

/usr/local/spark/bin/spark-submit --class "SimpleApp" ~/sparkapp3/target/simple-project-1.0.jar 2>&1 | grep "Lines with a:"

出现如上界面即为成功。 

结语:整体的操作步我都给大家写出来,并且截图了,大家只需要无脑粘贴就好了,具体的讲解可以看我的资料里的文档解释更加详细,这个实验就结束了。 

上面内容制作不易,喜欢的点个赞和收藏支持一下吧!!

后期会持续更新更多大数据内容,如果想共同学习,就点点关注把(

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/77297.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DCDC芯片,boost升压电路设计,MT3608 芯片深度解析:从架构到设计的全维度技术手册

一、硬件架构解析:电流模式升压 converter 的核心设计 (一)电路拓扑与核心组件 MT3608 采用恒定频率峰值电流模式升压(Boost)转换器架构,核心由以下模块构成: 集成功率 MOSFET 内置 80mΩ 导通电阻的 N 沟道 MOSFET,漏极(Drain)对应引脚 SW,源极(Source)内部接…

Java 日志:掌握本地与网络日志技术

日志记录是软件开发中不可或缺的一部分&#xff0c;它为开发者提供了洞察应用程序行为、诊断问题和监控性能的手段。在 Java 生态系统中&#xff0c;日志框架如 Java Util Logging (JUL)、Log4j 和 Simple Logging Facade for Java (SLF4J) 提供了丰富的功能。然而&#xff0c;…

上位机知识篇---时钟分频

文章目录 前言 前言 本文简单介绍了一下时钟分频。时钟分频&#xff08;Clock Division&#xff09;是数字电路设计中常见的技术&#xff0c;用于将高频时钟信号转换为较低频率的时钟信号&#xff0c;以满足不同模块的时序需求。它在处理器、FPGA、SoC&#xff08;片上系统&am…

推荐几个免费提取音视频文案的工具(SRT格式、通义千问、飞书妙记、VideoCaptioner、AsrTools)

文章目录 1. 前言2. SRT格式2.1 SRT 格式的特点2.2 SRT 文件的组成2.3 SRT 文件示例 3. 通义千问3.1 官网3.2 上传音视频文件3.3 导出文案 4. 飞书妙记4.1 官网4.2 上传音视频文件4.3 导出文案4.4 缺点 5. VideoCaptioner5.1 GitHub地址5.2 下载5.2.1 通过GitHub下载5.2.2 通过…

Linux深度探索:进程管理与系统架构

1.冯诺依曼体系结构 我们常见的计算机&#xff0c;如笔记本。我们不常见的计算机&#xff0c;如服务器&#xff0c;大部分都遵守冯诺依曼体系。 截至目前&#xff0c;我们所认识的计算机&#xff0c;都是由⼀个个的硬件组件组成。 输入设备&#xff1a;键盘&#xff0c;鼠标…

观察者模式 (Observer Pattern)

观察者模式(Observer Pattern)是一种行为型设计模式。它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当主题对象的状态发生变化时,会自动通知所有观察者对象,使它们能够自动更新自己的状态。 一、基础 1. 意图 核心目的:定义对象间的一种一对…

Network.framework 的引入,不是为了取代 URLSession

Network.framework 的引入&#xff0c;不是为了取代 URLSession 如果你感觉 Network.framework 的引入, 可能是为了取代 URLSession, 那你就大错特错了&#xff01;这里需要非常准确地区分一下&#xff1a; &#x1f535; Network.framework 不是为了取代 URLSession。 &…

Redis 数据分片三大方案深度解析与 Java 实战

Redis 数据分片是将数据分散存储在多个 Redis 实例上的技术&#xff0c;以解决单个 Redis 实例在存储容量、性能和可用性上的限制。常见的 Redis 数据分片方案包括客户端分片、代理分片和Redis Cluster&#xff08;集群分片&#xff09;&#xff0c;以下为你详细介绍&#xff1…

FreeBSD可以不经过windows服务器访问windows机器上的共享文件吗?

答案是&#xff1a;当然可以&#xff01; 使用sharity-light 软件 可以使用sharity-light 软件&#xff0c;直接不用安装samba等软件&#xff0c;直接访问windows机器上的共享文件。 但是可惜的是&#xff0c;sharity-light在FreeBSD的ports里弃用了。看来是从FreeBSD 8 就开…

主流 LLM 部署框架

主流 LLM 部署框架 框架主要特点适用场景vLLM- 超快推理&#xff08;高吞吐&#xff09; - 动态批处理 - 支持 HuggingFace Transformer - 支持 PagedAttention高并发、低延迟在线推理TGI (Text Generation Inference)- Huggingface官方出品 - 多模型管理 - 支持动态量化 - 支持…

在 Vue 3 setup() 函数中使用 TypeScript 处理 null 和 undefined 的最佳实践

在 Vue 3 中使用 setup() 函数和 TypeScript 时&#xff0c;null 和 undefined 是两个需要特别关注的类型。虽然它们看起来都表示“没有值”&#xff0c;但它们在 JavaScript 和 TypeScript 中有着不同的含义和使用场景。如果不小心处理它们&#xff0c;可能会导致潜在的 bug 或…

在 UniApp 中获取当前页面地址

在 UniApp 中获取当前页面地址&#xff0c;可以通过以下步骤实现&#xff1a; 方法说明&#xff1a; 获取当前页面实例&#xff1a;使用 getCurrentPages() 获取页面栈数组&#xff0c;最后一个元素即为当前页面实例。 提取页面路径和参数&#xff1a;从页面实例的 route 属性…

【华为】防火墙双击热备-之-主备模式-单外网线路-分享

FW1和FW2的业务接口都工作在三层&#xff0c;上行连接二层交换机。上行交换机连接运营商的接入点&#xff0c;运营商为企业分配的IP地址为100.100.100.2。现在希望FW1和FW2以主备备份方式工作。正常情况下&#xff0c;流量通过FW1转发&#xff1b;当FW1出现故障时&#xff0c;流…

crossOriginLoading使用说明

1. 说明 此配置用于控制 Webpack 动态加载的代码块&#xff08;chunk&#xff09;&#xff08;例如代码分割或懒加载的模块&#xff09;在跨域&#xff08;不同域名&#xff09;加载时的行为。它通过为动态生成的 <script>标签添加 crossorigin 属性&#xff0c;确保符合…

windows中安装VMware Workstation Pro虚拟机和ubuntu

目录 一、安装 VMware Workstation Pro 虚拟机 1、官网下载VMware Workstation Pro 1.1 选中 "VMware Workstation Pro for PC" 的 "DOWNLOAD NOW" 1.2 跳转到broadcom登录页面 1.3 注册账号 1.4 输入给邮箱收到的验证码信息&#xff0c;然后点击”Verify…

如何快速轻松地恢复未保存的 Word 文档:简短指南

文字处理器已经存在了几十年&#xff0c;其中许多已经变得非常擅长防止问题。丢失未保存的数据是一个常见问题&#xff0c;因此办公软件通常带有恢复文件的方法。在本文中&#xff0c;我们将介绍如何恢复 Word 文档&#xff0c;即使您尚未保存它。 确保数据安全的最佳方法是保…

JavaScript原生实现简单虚拟列表(列表不定高)

本文首发在我的个人博客上&#xff1a;JavaScript原生实现简单虚拟列表(列表不定高)https://www.brandhuang.com/article/1745637125513 前言 之前实现了一个定高版本的虚拟列表&#xff0c;今天在定高版本的基础上稍作调整&#xff0c;来实现不定高版本&#xff0c;之前的版本…

redis数据类型-位域bitfield

redis数据类型-位域bitfield 文档 redis单机安装redis常用的五种数据类型redis数据类型-位图bitmapredis数据类型-基数统计HyperLogLogredis数据类型-地理空间GEOredis数据类型-流Stream 官方文档 官网操作命令指南页面&#xff1a;https://redis.io/docs/latest/commands/…

pandas读取MySQL中的数据

使用pandas读取MySQL中的数据 1、导入库 pip install pandas pip install sqlalchemy2、示例代码 # -*- coding: utf-8 -*-import pandas as pd import re from sqlalchemy import create_engine# 清洗文本 def clean_text(text):text

MyBatis缓存配置的完整示例,包含一级缓存、二级缓存、自定义缓存策略等核心场景,并附详细注释和总结表格

以下是MyBatis缓存配置的完整示例&#xff0c;包含一级缓存、二级缓存、自定义缓存策略等核心场景&#xff0c;并附详细注释和总结表格&#xff1a; 1. 一级缓存&#xff08;默认开启&#xff09; // 使用同一SqlSession执行两次查询&#xff0c;自动命中一级缓存 try (SqlSe…