人工智能图像辨认Spark Core
Spark Core一.spark运行架构
1.运行架构
Spark 框架的核心是一个盘算引擎,整体来说,它接纳了标准 master-slave 的结构。
如下图所示,它展示了一个 Spark 执行时的基本结构。图形中的 Driver 表示 master,负责管理整个集群中的作业任务调度。图形中的 Executor 则是 slave,负责实际执行任务。
https://i-blog.csdnimg.cn/direct/3d2ba68f578e4bf790fdb2390620c9c5.png
2.核心组件
由上图可以看出,对于 Spark 框架有两个核心组件:
Driver
Spark 驱动器节点,用于执行 Spark 任务中的 main 方法,负责实际代码的执行工作。
Driver 在 Spark 作业执行时主要负责:
将用户程序转化为作业(job)
在 Executor 之间调度任务(task)
跟踪 Executor 的执行情况
通过 UI 展示查询运行情况
实际上,我们无法准确地描述 Driver 的定义,由于在整个的编程过程中没有看到任何有关Driver 的字眼。所以简单理解,所谓的 Driver 就是驱使整个应用运行起来的程序,也称之为Driver 类。
Executor
Spark Executor 是集群中工作节点(Worker)中的一个 JVM 进程,负责在 Spark 作业中运行具体任务(Task),任务彼此之间相互独立。Spark 应用启动时,Executor 节点被同时启动,并且始终伴随着整个 Spark 应用的生命周期而存在。假如有 Executor 节点发生了故障或崩溃,Spark 应用也可以继续执行,会将堕落节点上的任务调度到其他 Executor 节点上继续运行。
Executor 有两个核心功能:
负责运行组成 Spark 应用的任务,并将结果返回给驱动器进程
它们通过自身的块管理器(Block Manager)为用户程序中要求缓存的 RDD 提供内存式存储。RDD 是直接缓存在 Executor 进程内的,因此任务可以在运行时充实利用缓存数据加速运算。
Master & Worker
Spark 集群的独立部署环境中,不需要依靠其他的资源调度框架,自身就实现了资源调度的功能,所以环境中还有其他两个核心组件:Master 和 Worker,这里的 Master 是一个进程,主要负责资源的调度和分配,并进行集群的监控等职责,雷同于 Yarn 环境中的 RM, 而Worker 呢,也是进程,一个 Worker 运行在集群中的一台服务器上,由 Master 分配资源对数据进行并行的处理和盘算,雷同于 Yarn 环境中 NM。
ApplicationMaster
Hadoop 用户向 YARN 集群提交应用程序时,提交程序中应该包罗 ApplicationMaster,用于向资源调度器申请执行任务的资源容器 Container,运行用户本身的程序任务 job,监控整个任务的执行,跟踪整个任务的状态,处理任务失败等异常情况。
说的简单点就是,ResourceManager(资源)和 Driver(盘算)之间的解耦合靠的就是ApplicationMaster。
3.核心概念
Executor 与 Core
Spark Executor 是集群中运行在工作节点(Worker)中的一个 JVM 进程,是整个集群中的专门用于盘算的节点。在提交应用中,可以提供参数指定盘算节点的个数,以及对应的资源。这里的资源一般指的是工作节点 Executor 的内存巨细和使用的虚拟 CPU 核(Core)数量。
应用程序相关启动参数如下:
https://i-blog.csdnimg.cn/direct/2c2f7dcc24c9431a9368e297f60d9e39.png
并行度(Parallelism)
在分布式盘算框架中一般都是多个任务同时执行,由于任务分布在差别的盘算节点进行盘算,所以能够真正地实现多任务并行执行,记着,这里是并行,而不是并发。这里我们将整个集群并行执行任务的数量称之为并行度。那么一个作业到底并行度是多少呢?这个取决于框架的默认设置。应用程序也可以在运行过程中动态修改。
有向无环图(DAG):
https://i-blog.csdnimg.cn/direct/f412ab3dee4443768a3c7be5590b8bb4.png
大数据盘算引擎框架我们根据使用方式的差别一般会分为四类,其中第一类就是Hadoop 所承载的 MapReduce,它将盘算分为两个阶段,分别为 Map 阶段 和 Reduce 阶段。
对于上层应用来说,就不得不费经心机去拆分算法,以致于不得不在上层应用实现多个 Job 的串联,以完成一个完备的算法,例如迭代盘算。 由于如许的弊端,催生了支持 DAG 框架的产生。因此,支持 DAG 的框架被划分为第二代盘算引擎。如 Tez 以及更上层的Oozie。这里我们不去细究各种 DAG 实现之间的区别,不过对于其时的 Tez 和 Oozie 来说,大多还是批处理的任务。接下来就是以 Spark 为代表的第三代的盘算引擎。第三代盘算引擎的特点主要是 Job 内部的 DAG 支持(不超过 Job),以及实时盘算。
这里所谓的有向无环图,并不是真正意义的图形,而是由 Spark 程序直接映射成的数据流的高级抽象模型。简单理解就是将整个程序盘算的执行过程用图形表示出来,如许更直观,更便于理解,可以用于表示程序的拓扑结构。
DAG(Directed Acyclic Graph)有向无环图是由点和线组成的拓扑图形,该图形具有方向,不会闭环。
4.提互换程
所谓的提互换程,其实就是开辟人员根据需求写的应用程序通过 Spark 客户端提交给 Spark 运行环境执行盘算的流程。在差别的部署环境中,这个提交过程基本雷同,但是又有渺小的区别,这里不进行详细的比较,但是由于国内工作中,将 Spark 引用部署到Yarn 环境中会更多一些,所以这里提到的提互换程是基于 Yarn 环境的。
https://i-blog.csdnimg.cn/direct/0e547bc463614ec3939962297581355b.png
Spark 应用程序提交到 Yarn 环境中执行的时候,一般会有两种部署执行的方式:Client和 Cluster。两种模式主要区别在于:Driver 程序的运行节点位置。
Yarn Client 模式
Client 模式将用于监控和调度的 Driver 模块在客户端执行,而不是在 Yarn 中,所以一般用于测试。
Driver 在任务提交的本地机器上运行
Driver 启动后会和 ResourceManager 通讯申请启动 ApplicationMaster
ResourceManager 分配container,在符合的 NodeManager 上启动 ApplicationMaster,负责向 ResourceManager 申请 Executor 内存
ResourceManager 接到 ApplicationMaster 的资源申请后会分配 container,然后ApplicationMaster 在资源分配指定的 NodeManager 上启动 Executor 进程
Executor 进程启动后会向 Driver 反向注册,Executor 全部注册完成后 Driver 开始执行main 函数
之后执行到 Action 算子时,触发一个 Job,并根据宽依靠开始划分 stage,每个 stage 天生对应的 TaskSet,之后将 task 分发到各个 Executor 上执行。
Yarn Cluster 模式
Cluster 模式将用于监控和调度的 Driver 模块启动在 Yarn 集群资源中执行。一般应用于实际生产环境。
在 YARN Cluster 模式下,任务提交后会和 ResourceManager 通讯申请启动ApplicationMaster。
随后 ResourceManager 分配 container,在符合的 NodeManager 上启动 ApplicationMaster,此时的 ApplicationMaster 就是 Driver。
Driver 启动后向 ResourceManager 申请 Executor 内存,ResourceManager 接到ApplicationMaster 的资源申请后会分配 container,然后在符合的 NodeManager 上启动Executor 进程。
Executor 进程启动后会向 Driver 反向注册,Executor 全部注册完成后 Driver 开始执行main 函数。
之后执行到 Action 算子时,触发一个 Job,并根据宽依靠开始划分 stage,每个 stage 天生对应的 TaskSet,之后将 task 分发到各个 Executor 上执行。
二.RDD相关概念
Spark 盘算框架为了能够进行高并发和高吞吐的数据处理,封装了三大数据结构,用于处理差别的应用场景。三大数据结构分别是:
RDD : 弹性分布式数据集
累加器:分布式共享只写变量
广播变量:分布式共享只读变量
1.RDD
什么是 RDD
RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是 Spark 中最基本的数据处理模型。代码中是一个抽象类,它代表一个弹性的、不可变、可分区、内里的元素可并行盘算的集合。
弹性
存储的弹性:内存与磁盘的自动切换;
容错的弹性:数据丢失可以自动规复;
盘算的弹性:盘算堕落重试机制;
分片的弹性:可根据需要重新分片。
分布式:数据存储在大数据集群差别节点上
数据集:RDD 封装了盘算逻辑,并不保存数据
数据抽象:RDD 是一个抽象类,需要子类具体实现
不可变:RDD 封装了盘算逻辑,是不可以改变的,想要改变,只能产生新的 RDD,在新的 RDD 内里封装盘算逻辑
可分区、并行盘算
2.核心属性
分区列表
RDD 数据结构中存在分区列表,用于执行任务时并行盘算,是实现分布式盘算的重要属性。
https://i-blog.csdnimg.cn/direct/26553e22c8924d1984a34ce042dacf81.png
分区盘算函数
Spark 在盘算时,是使用分区函数对每一个分区进行盘算。
https://i-blog.csdnimg.cn/direct/9ebfcbc363524bb0bb3da5bf87655125.png
RDD 之间的依靠关系
RDD 是盘算模型的封装,当需求中需要将多个盘算模型进行组合时,就需要将多个 RDD 建立依靠关系。
https://i-blog.csdnimg.cn/direct/9b8c81c6e5814a6cb3b911078dfa8e94.png
分区器(可选)
当数据为 K-V 类型数据时,可以通过设定分区器自定义数据的分区。
https://i-blog.csdnimg.cn/direct/f11192163df54be392c0ffbe728175e9.png
首选位置(可选)
盘算数据时,可以根据盘算节点的状态选择差别的节点位置进行盘算。
https://i-blog.csdnimg.cn/direct/26df46d880b447c1920e65f6df809c5d.png
3.执行原理
从盘算的角度来讲,数据处理过程中需要盘算资源(内存 & CPU)和盘算模型(逻辑)。执行时,需要将盘算资源和盘算模型进行协调和整合。
Spark 框架在执行时,先申请资源,然后将应用程序的数据处理逻辑分解成一个一个的盘算任务。然后将任务发到已经分配资源的盘算节点上, 按照指定的盘算模型进行数据盘算。最后得到盘算结果。
RDD 是 Spark 框架中用于数据处理的核心模型,接下来我们看看,在 Yarn 环境中,RDD的工作原理:
1)启动 Yarn 集群环境
https://i-blog.csdnimg.cn/direct/8568da06b88d4b22a47e790e3e19db3e.png
2)Spark 通过申请资源创建调度节点和盘算节点
https://i-blog.csdnimg.cn/direct/5ee22fd1b9f54d9d81e9bb0ec48e811f.png
3)Spark 框架根据需求将盘算逻辑根据分区划分成差别的任务
https://i-blog.csdnimg.cn/direct/303b85d646c543838544f03990e4de28.png
4)调度节点将任务根据盘算节点状态发送到对应的盘算节点进行盘算
https://i-blog.csdnimg.cn/direct/b1909a1742b7498d996081171df5931a.png
从以上流程可以看出 RDD 在整个流程中主要用于将逻辑进行封装,并天生 Task 发送给Executor 节点执行盘算。
4.RDD序列化
1) 闭包检查
从盘算的角度, 算子以外的代码都是在 Driver 端执行, 算子内里的代码都是在 Executor端执行。那么在 scala 的函数式编程中,就会导致算子内经常会用到算子外的数据,如许就形成了闭包的结果,假如使用的算子外的数据无法序列化,就意味着无法传值给 Executor端执行,就会发生错误,所以需要在执行任务盘算前,检测闭包内的对象是否可以进行序列化,这个操作我们称之为闭包检测。Scala2.12 版本后闭包编译方式发生了改变
2) 序列化方法和属性
从盘算的角度, 算子以外的代码都是在 Driver 端执行, 算子内里的代码都是在 Executor端执行
3) Kryo 序列化框架
Java 的序列化能够序列化任何的类。但是比较重(字节多),序列化后,对象的提交也比较大。Spark 出于性能的思量,Spark2.0 开始支持另外一种 Kryo 序列化机制。Kryo 速率是 Serializable 的 10 倍。当 RDD 在 Shuffle 数据的时候,简单数据类型、数组和字符串类型已经在 Spark 内部使用 Kryo 来序列化。
注意:纵然使用 Kryo 序列化,也要继续 Serializable 接口。
5.RDD依靠关系
1) RDD 血缘关系
RDD 只支持粗粒度转换,即在大量纪录上执行的单个操作。将创建 RDD 的一系列 Lineage(血统)纪录下来,以便规复丢失的分区。RDD 的 Lineage 会纪录 RDD 的元数据信息和转换行为,当该 RDD 的部分分区数据丢失时,它可以根据这些信息来重新运算和规复丢失的数据分区。
2) RDD 依靠关系
这里所谓的依靠关系,其实就是两个相邻 RDD 之间的关系。包括打印依靠、shuffle依靠等。
3) RDD 窄依靠
窄依靠表示每一个父(上游)RDD 的 Partition 最多被子(下游)RDD 的一个 Partition 使用,窄依靠我们形象的比喻为独生子女。
4) RDD 宽依靠
宽依靠表示同一个父(上游)RDD 的 Partition 被多个子(下游)RDD 的 Partition 依靠,会引起 Shuffle,总结:宽依靠我们形象的比喻为多生。
5) RDD 阶段划分
DAG(Directed Acyclic Graph)有向无环图是由点和线组成的拓扑图形,该图形具有方向,不会闭环。例如,DAG 纪录了 RDD 的转换过程和任务的阶段。
https://i-blog.csdnimg.cn/direct/a421db75c12f497b8fd7e8dce2f548d7.png
6) RDD 任务划分
RDD 任务切分中间分为:Application、Job、Stage 和 Task
Application:初始化一个 SparkContext 即天生一个 Application;
Job:一个 Action 算子就会天生一个 Job;
Stage:Stage 等于宽依靠(ShuffleDependency)的个数加 1;
Task:一个 Stage 阶段中,最后一个 RDD 的分区个数就是 Task 的个数。
注意:Application->Job->Stage->Task 每一层都是 1 对 n 的关系。
https://i-blog.csdnimg.cn/direct/c983fb9953b043278d59aaec4b3f7d5d.png
6.RDD持久化
1) RDD Cache 缓存
RDD 通过 Cache 或者 Persist 方法将前面的盘算结果缓存,默认情况下会把数据以缓存在 JVM 的堆内存中。但是并不是这两个方法被调用时立刻缓存,而是触发背面的 action 算子时,该 RDD 将会被缓存在盘算节点的内存中,并供背面重用。
https://i-blog.csdnimg.cn/direct/dccf7fc7073c4a21875fe1f1cd6fbd1f.png
缓存有可能丢失,或者存储于内存的数据由于内存不敷而被删除,RDD 的缓存容错机制保证了纵然缓存丢失也能保证盘算的准确执行。通过基于 RDD 的一系列转换,丢失的数据会被重算,由于 RDD 的各个 Partition 是相对独立的,因此只需要盘算丢失的部分即可,并不需要重算全部 Partition。
Spark 会自动对一些 Shuffle 操作的中间数据做持久化操作(好比:reduceByKey)。如许做的目标是为了当一个节点 Shuffle 失败了避免重新盘算整个输入。但是,在实际使用的时候,假如想重用数据,仍然发起调用 persist 或 cache。
2) RDD CheckPoint 检查点
所谓的检查点其实就是通过将 RDD 中间结果写入磁盘由于血缘依靠过长会造成容错本钱过高,如许就不如在中间阶段做检查点容错,假如检查点之后有节点出现问题,可以从检查点开始重做血缘,减少了开销。
对 RDD 进行 checkpoint 操作并不会马上被执行,必须执行 Action 操作才华触发。
3) 缓存和检查点区别
·1)Cache 缓存只是将数据保存起来,不切断血缘依靠。Checkpoint 检查点切断血缘依靠。
·2)Cache 缓存的数据通常存储在磁盘、内存等地方,可靠性低。Checkpoint 的数据通常存储在 HDFS 等容错、高可用的文件体系,可靠性高。
·3)发起对 checkpoint()的 RDD 使用 Cache 缓存,如许 checkpoint 的 job 只需从 Cache 缓存中读取数据即可,否则需要再重新盘算一次 RDD。
7.RDD分区器
Spark 现在支持 Hash 分区和 Range 分区,和用户自定义分区。Hash 分区为当前的默认分区。分区器直接决定了 RDD 中分区的个数、RDD 中每条数据经过 Shuffle 后进入哪个分区,进而决定了 Reduce 的个数。
只有 Key-Value 类型的 RDD 才有分区器,非 Key-Value 类型的 RDD 分区的值是 None
每个 RDD 的分区 ID 范围:0 ~ (numPartitions - 1),决定这个值是属于谁人分区的。
1)Hash 分区:对于给定的 key,盘算其 hashCode,并除以分区个数取余。
2)Range 分区:将肯定范围内的数据映射到一个分区中,只管保证每个分区数据均匀,而且分区间有序
8.RDD文件读取与保存
Spark 的数据读取及数据保存可以从两个维度来作区分:文件格式以及文件体系。
文件格式分为:text 文件、csv 文件、sequence 文件以及 Object 文件;
文件体系分为:本地文件体系、HDFS、HBASE 以及数据库。
text 文件
https://i-blog.csdnimg.cn/direct/957e7d2e313b4df09afae8453b53daaa.png
sequence 文件
SequenceFile 文件是 Hadoop 用来存储二进制形式的 key-value 对而设计的一种平面文件(Flat File)。在 SparkContext 中,可以调用 sequenceFile(path)。
https://i-blog.csdnimg.cn/direct/6b44f8e20b4e4f52b18e1dbfca913a50.png
object 对象文件
对象文件是将对象序列化后保存的文件,接纳 Java 的序列化机制。可以通过 objectFile(path)函数吸收一个路径,读取对象文件,返回对应的 RDD,也可以通过调用saveAsObjectFile()实现对对象文件的输出。由于是序列化所以要指定类型。
https://i-blog.csdnimg.cn/direct/b3cedb0db3844f94a61e6b4d0c06179c.png
三. Spark-Core编程(一)
环境准备
1.Jdk1.8版本
2.Scala2.12版本
3.Idea集成开辟环境中需要安装scala插件
环境设置
添加Scala插件
Spark 由 Scala 语言开辟的,所以接下来的开辟所使用的语言也为 Scala,当前使用的 Spark 版本为 3.0.0,默认接纳的 Scala 编译版本为 2.12,所以后续开辟时,我们依然接纳2.12的scala版本。开辟前请保证 IDEA 开辟工具中含有 Scala 开辟插件
File—Settings—plugins
https://i-blog.csdnimg.cn/direct/02ea8035bd0243e0983d6b625cd28c05.png
创建spark实现的WordCount程序
1.创建Maven项目
https://i-blog.csdnimg.cn/direct/56ea163f2dbf4225a110b2563d22aefb.png
https://i-blog.csdnimg.cn/direct/6353510af73c478aba94b28d28dd6b73.png
https://i-blog.csdnimg.cn/direct/929396dc906e4db58fb22048b00a887f.png
2.在pom.xml中添加依靠
<dependencies>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.12</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.1.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<!-- 该插件用于将 Scala 代码编译成 class 文件 -->
<plugin>
<groupId>net.alchim31.maven</groupId>
<artifactId>scala-maven-plugin</artifactId>
<version>3.2.2</version>
<executions>
<execution>
<!-- 声明绑定到 maven 的 compile 阶段 -->
<goals>
<goal>testCompile</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
保存之后重新加载。
3.创建Spark-core子模块
https://i-blog.csdnimg.cn/direct/e05c5fc29e6346ccadb9127c0de2d076.png
https://i-blog.csdnimg.cn/direct/0358bce7c3f0422a9cf6fba61f554e8d.png
4.将spark-core当中的java文件夹重命名为scala。
https://i-blog.csdnimg.cn/direct/dfe5b6acac2543aa872c7bca894c80e6.png
5.在scala文件夹中创建Scala的object程序。
https://i-blog.csdnimg.cn/direct/1dd8451f76444a1cbd9c976e66872d72.png
https://i-blog.csdnimg.cn/direct/9cae4eeba2084242b0c1e9c3a5033979.png
6.编写wordCount的spark程序
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}
object WordCount {
def main(args: Array): Unit = {
// 创建 Spark 运行设置对象
val sparkConf = new SparkConf().setMaster("local
[*]").setAppName("WordCount")
// 创建 Spark 上下文环境对象(连接对象)
val sc : SparkContext = new SparkContext(sparkConf)
// 读取文件数据
val fileRDD: RDD = sc.
textFile("Spark-core/input/word.txt")
// 将文件中的数据进行分词
val wordRDD: RDD = fileRDD.flatMap( _.split(" ") )
// 转换数据结构 word => (word, 1)
val word2OneRDD: RDD[(String, Int)] = wordRDD.map((_,1))
// 将转换结构后的数据按照雷同的单词进行分组聚合
val word2CountRDD: RDD[(String, Int)] = word2OneRDD.reduceByKey(_+_)
// 将数据聚合结果采集到内存中
val word2Count: Array[(String, Int)] = word2CountRDD.collect()
// 打印结果
word2Count.foreach(println)
//关闭 Spark 连接
sc.stop()
}
}
7.在Spark-core中创建名为input的文件夹,在此文件夹中创建word.txt文件,并在文件中添加需要进行统计的语句。
https://i-blog.csdnimg.cn/direct/d9fa77c3460b4bc6be48655991d6b2b4.png
测试文本:
Spark is a unified analytics engine for large-scale data processing
It provides high-level APIs in Scala Java Python and R and an optimized engine that
supports general computation graphs for data analysis
It also supports a rich set of higher-level tools including Spark SQL for SQL and DataFrames
MLlib for machine learning GraphX for graph processing and Structured Streaming for stream processing
8.运行编写好的WordCount程序
https://i-blog.csdnimg.cn/direct/a2c0d1aec3ee49fb9a1dbe7fd033a7e6.png
https://i-blog.csdnimg.cn/direct/9a97e3defe004896bed92fa64fa356fb.png
https://i-blog.csdnimg.cn/direct/7db51447f93f40698f74cd62124773e5.png
https://i-blog.csdnimg.cn/direct/e79d8d07d0234678961f2d37f3179608.png
9.设置日记文件
执行过程中,会产生大量的执行日记,假如为了能够更好的查看程序的执行结果,可以在项
目标 resources 目录中创建 log4j.properties 文件,并添加日记设置信息:
https://i-blog.csdnimg.cn/direct/0b20d3a3f649490fa805361417c80571.png
log4j.rootCategory=ERROR, console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.target=System.err
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yy/MM/ddHH:mm:ss} %p %c{1}: %m%n
# Set the default spark-shell log level to ERROR. When running the spark-shell,the
# log level for this class is used to overwrite the root logger's log level, so that
# the user can have different defaults for the shell and regular Spark apps.
log4j.logger.org.apache.spark.repl.Main=ERROR
# Settings to quiet third party logs that are too verbose
log4j.logger.org.spark_project.jetty=ERROR
log4j.logger.org.spark_project.jetty.util.component.AbstractLifeCycle=ERROR
log4j.logger.org.apache.spark.repl.SparkIMain$exprTyper=ERROR
log4j.logger.org.apache.spark.repl.SparkILoop$SparkILoopInterpreter=ERROR
log4j.logger.org.apache.parquet=ERROR
log4j.logger.parquet=ERROR
# SPARK-9183: Settings to avoid annoying messages when looking up nonexistent UDFs in SparkSQL with Hive support
log4j.logger.org.apache.hadoop.hive.metastore.RetryingHMSHandler=FATAL
log4j.logger.org.apache.hadoop.hive.ql.exec.FunctionRegistry=ERROR
10.设置完成后重新执行代码
https://i-blog.csdnimg.cn/direct/e384afa0c3784df9b7a273ab8a875130.png
https://i-blog.csdnimg.cn/direct/b0e9f58b322d4e79b9ae6681902ac7c1.png
11.常见问题办理
假如本机操作体系是 Windows,在程序中使用了 Hadoop 相关的东西,好比写入文件到 HDFS,则会遇到如下异常:
https://i-blog.csdnimg.cn/direct/fd69ca6027174afc966abb962e112871.png
出现这个问题的原因,并不是程序的错误,而是 windows 体系用到了 hadoop 相关的服 务,办理办法是通过设置关联到 windows 的体系依靠就可以了
首先确保在本地磁盘中有hadoop的相关内容且设置了环境变量
https://i-blog.csdnimg.cn/direct/25ed6bcb960f4e70b558a3b983b0d294.png
https://i-blog.csdnimg.cn/direct/cfb65d46bf004b33877463516376ea0a.png
然后在Idea中设置 Run Configuration,添加 HADOOP_HOME 变量
https://i-blog.csdnimg.cn/direct/99ee50083dd6424694c07b7e9d9c2d4b.png
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]