Hadoop+Hive+Spark的Windows配置
Hadoop+Hive+Spark的Windows配置
本文的Hadoop版本之后为了兼容问题换成了Hadoop-3.3.5,请读者注意,另外本文所有软件都可通过百度网盘下载,通过网盘分享的文件:Hadoop+Hive+Spark配置.zip
链接: https://pan.baidu.com/s/1hBZWlLH1ajqBbWedgvcfUg?pwd=esci 提取码: esci
致谢
https://blog.csdn.net/JasonXu94/article/details/143726390
https://blog.csdn.net/m0_68497327/article/details/126769042
恩师hw
https://blog.csdn.net/sinat_16255267/article/details/142648972
https://blog.csdn.net/weixin_44698389/article/details/105363480
https://blog.csdn.net/weixin_39991710/article/details/141327865
https://blog.csdn.net/weixin_44424296/article/details/113915551
https://blog.csdn.net/wxplol/article/details/116141911
https://blog.csdn.net/tttzzzqqq2018/article/details/132001921
https://blog.csdn.net/itorac/article/details/134301889
https://blog.csdn.net/cloud315/article/details/134031924
https://blog.csdn.net/qq_44766883/article/details/108582781
1. Java的安装
安装网址:https://pan.baidu.com/s/1Zu0ajbp2dY_NiPP_d3Y3nA
一定要安装Java-8, 下载下来,直接exe一直next, 下载目录选择一个路径没有中文,没有空格的目录,比如我选的是D:\Java\jdk1.8.0_202
然后接着配置环境变量,
(1)找到系统变量,新建一个。变量名JAVA_HOME(代表你的JDK安装路径),值对应的是你的JDK的安装路径。

(2)继续在系统变量里面新建一个CLASSPATH变量,其变量值如下图所示(此处需要注意:最前面有一个英文状态下的小圆点):
.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar

(3)在你的系统变量里面找一个变量名是PATH的变量,需要在它的值域里面追加一段如下的代码:
%JAVA_HOME%\bin
%JAVA_HOME%\jre\bin;

最后点击三次确定,此时JDK的环境变量配置就完成了。
检验一下是否配置成功,windows+R,输入cmd打开终端,输入
java -version
javac -version

2. 安装Hadoop-3.2.4
安装网址:https://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/hadoop-3.2.4/hadoop-3.2.4.tar.gz
- 解压到到D盘,目录为:D:\hadoop-3.2.4
打开hadoop-3.2.4文件夹,如下所示
bin目录里是可执行程序
sbin目录里是可执行脚本
etc/hadoop目录里是配置文件
lib目录里是一些开发hadoop程序的库

- 配置JAVA_HOME环境变量
打开hadoop-3.2.4/etc/hadoop/hadoop-env.cmd
使用VSCode或者记事本打开hadoop-env.cmd文件,找到第54行,54行已经设置好,但是环境变量里的JAVA_HOME不能带空格,比如C:\Program Files\Java\jre1.8.0_202\, 这里Program 和Files中间就有一个空格,把Java移动到不带空格的文件夹下就行了,并且修改好环境变量JAVA_HOME, hadoop-env.cmd不需要进行修改。
直接复制粘贴Java文件夹到没有空格目录的时候,如果出现cmd报错:Error: could not open `C:\Program Files\Java\jre1.8.0_121\lib\amd64\jvm.cfg',查看这个网址解决:https://blog.csdn.net/weixin_40575457/article/details/81625169
如果你的用户名带空格,之后Hadoop验证时会报错,例如“错误: 找不到或无法加载主类 pig”,解决方案查看这个网址:https://blog.csdn.net/qq_39540537/article/details/107488036

- Hadoop 验证
进入hadoop-3.2.4目录
进入bin目录
打开终端输入 hadoop version,显示如下图所示
表明安装hadoop成功!但是安装成功不表示集群运行。

4.加入环境变量
为了方便使用hadoop,将hadoop的可执行命令,可执行的脚本,加入到windows环境变量中。
(1)在用户变量里可以类似JAVA_HOME新建一个HADOOP_HOME, 该变量值为hadoop的主路径,如果直接放到D盘的话,应该是D:\hadoop-3.2.4

(2)接着双击用户变量Path, 添加两条新的环境变量
%HADOOP_HOME%\bin
%HADOOP_HOME%\sbin

(3)设置好,点击三次确定,然后windows+R, 输入cmd,打开终端,验证一下,如下界面就是成功了。

- 配置伪分布式
Hadoop运行的三种模式:
-
Local (Standalone) Mode 单机模式
-
Pseudo-Distributed Mode 伪分布式
-
Fully-Distributed Mode 完全分布式
咱们直接Pseudo-Distributed Mode 伪分布式
一、首先创建namenode、datanode与tmp文件夹
在D:\hadoop-3.2.4下面创建一个data的文件夹,然后在data下面创建三个文件夹datanode、namenode和tmp


二、接着我们需要在etc/hadoop下面配置4个文件
- core-site.xml文件
打开hadoop3.2.4目录下的:etc/hadoop/core-site.xml 文件修改<configuration>元素为, 注意这里的hadoop.proxyuser.lenovo.hosts, lenovo写自己的windows用户名,就是开机输入密码那里显示的用户名, 可以通过打开终端,输入如下命令获取用户名echo %username%
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>%HADOOP_HOME%/tmp</value>
</property>
<property>
<name>hadoop.proxyuser.lenovo.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.lenovo.groups</name>
<value>*</value>
</property>

- hdfs-site.xml文件
接着打开打开hadoop3.2.4目录下的:etc/hadoop/hdfs-site.xml 文件修改<configuration>元素为:
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>D:\hadoop-3.3.5\data\namenode</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>D:\hadoop-3.3.5\data\datanode</value>
</property>
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
<property>
<name>dfs.safemode.threshold.pct</name>
<value>0</value>
</property>
</configuration>


- mapred-site.xml文件
接着打开打开hadoop3.2.4目录下的:etc/hadoop/mapred-site.xml 文件修改<configuration>元素为:
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapred.job.tracker</name>
<value>hdfs://localhost:9001</value>
</property>
</configuration>

- yarn-site.xml文件
接着打开打开hadoop3.2.4目录下的:etc/hadoop/yarn-site.xml 文件修改<configuration>元素为:
<configuration>
<!-- Site specific YARN configuration properties -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
</configuration>

验证环节
打开终端,输入hdfs namenode -format格式化HDFS,出现Successfully则成功了
hdfs namenode -format
如果出现如下界面,就失败了

需要下载wintuils.exe
下载网址:https://github.com/cdarlint/winutils
由于3.2.4没有对应的winutils, 直接用3.2.2的应该可以,下载的压缩包,不需要解压,直接打开把如下两个文件复制到上面报错的文档路径下,比如这里是D:\hadoop-3.2.4\bin
注意,把hadoop.dll也复制过去吧,要不然datanode也启动不起来。


复制好之后,再次运行hdfs namenode -format,出现如下界面就表示成功了。

最后就可以启动datanode和namenode了,终端输入如下命令
start-dfs
启动成功之后,会有两个黑框打开,一个代表namenode,一个代表datanode

最终验证启动成功
(1)用jps命令,如果出现datanode和namenode即成功,如下图所示。

(2)浏览器打开 http://127.0.0.1:9870/ ,显示如下界面,进入到导航条的最后一个Utilities,选择Browse the file system,进入文件上传界面,上传一个本地的txt文件,如果上传成功,就配置成功了。





(3)如果想令yarn和mapreduce都起作用,必须执行如下命令:
start-all
会出现四个窗口,记住必须要是在管理员模式下进行运行。

Hadoop的配置就到此为止,接下来进行Hive的配置。
3. Hive的配置
一、首先在Hadoop中创建Hive需要的文件夹
打开命令窗口执行分别执行以下命令创建hive数仓路径:
hdfs dfs -mkdir -p /user/hive/warehouse
hdfs dfs -chmod -R 777 /user/hive/warehouse
hdfs dfs -mkdir /tmp
hdfs dfs -chmod -R 777 /tmp
利用以上四个命令创建好后,浏览器前端的文件系统,也就是hadoop的文件系统里就会有我们通过hdfs命令创建的文件夹,如下图所示。

二、下载和配置Mysql
下载网址:https://dev.mysql.com/downloads/mysql/
(1)选择适合Windows系统的即可,记得无登录下载即可。

(2)同样解压到D盘目录下:D:\mysql-8.4.3-winx64

(3)接着配置环境变量
在用户Path下添加D:\mysql-8.4.3-winx64\bin, 如果你之前有mysql, 你一定要把该环境变量移动到之前的那个mysql版本之前,如下下张图所示。


终端输入如下命令可以验证是否成功。
mysql -V
如果显示ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost:3308' (10061),说明成功了,你的端口号是3306,因为咱们还没有配置服务,连接mysql。所以接着下一步,但是如果你显示出了具体的mysql版本,那么你的环境变量无疑是设置失败了,没有将新的mysql环境变量移动到最前面。

(4)配置文件my.ini
在mysql-8.4.3-winx64目录下新建一个配置文件my.ini:

将如下内容复制到my.ini中。
这里要注意的是,因为已经本人有了一个mysql服务,所以将端口设置为3308(只要没被占用就行。)
如果本机电脑没有安装过mysql,直接用3306端口就行。
[mysqld]
# 这里设置3308端口
port=3308
# 设置mysql的安装目录
basedir=D:\mysql-8.4.3-winx64
# 设置mysql数据库的数据的存放目录
datadir=D:\mysql-8.4.3-winx64\data
# 允许最大连接数
max_connections=200
# 允许连接失败的次数。这是为了防止有人从该主机试图攻击数据库系统
max_connect_errors=10
# 服务端使用的字符集默认为UTF8
character-set-server=utf8
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
# 支持使用“mysql_native_password”插件认证
mysql_native_password=ON
[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8
[client]
# 设置mysql客户端连接服务端时默认使用的端口
port=3308
default-character-set=utf8
(5)安装及初始化mysql服务
cmd,管理员身身份运行:

1)安装mysql服务
——这里服务命名为mysql84,以便区分。
!!!!!! 一定要按照之前步骤先把环境变量移动到最前面,再去使用mysqld命令,要不然mysqld会把服务依然安装在之前那个mysql版本的数据库上
mysqld install mysql84

2)mysql初始化
mysql初始化时,一定保证D:\mysql-8.4.3-winx63文件夹下没有data文件夹,不要手动改创建或者清空,如果你一次执行下面命令没成功的话,要及时把data删掉,不影响下一次,如果手动创建就会出现之后服务启动失败。
懂了一些注意点之后,在终端输入如下命令,进行mysql初始化。
mysqld --initialize --console
执行完成以后,输出内容中会有mysql初始默认密码,复制保存,后面会用到。
我的密码: lS;tlg/ti3Ce

然后就可以启动mysql84服务了。
可以通过命令或者任务管理器启动。
net start mysql84

服务启动成功之后,用命令mysql -V验证一下, 8.4.3版本的mysql就连接成功了。

如果你没有成功,显示如下界面,大概率是mysql的版本问题,就比如我这里是用5.7版本的mysql创建了这个服务,但是初始化的是初始化8.4.3版本的mysql, 肯定服务无法启动,所以一定要保证创建服务和初始化服务都是一个版本, mysqld install mysql84 用的是环境变量里的mysql版本,所以你只需要在环境变量Path里,把新安装的版本的环境变量移动到所有mysql版本的环境变量的最前面。

如果运行net start mysql84命令时,出现发生系统错误2。系统找不到指定的文件错误时,参看这篇博客:https://blog.csdn.net/njzgIdba/article/details/123564176
之后开始登录mysql,使用如下命令。
mysql -u root -p
输入上面的初始密码,便可以进入mysql。

使用如下命令修改密码,终端显示OK便是成功了。
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密码';
注意,如果这个命令出现如下错误,“RROR 1524 (HY000): Plugin 'mysql_native_password' is not loaded”,则使用如下命令更改密码
ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';

修改密码成功之后,我们试着利用navicat连接一下我们设置的mysql
在mysql界面输入如下命令
show global variables like 'port';
就会显示当前mysql使用的端口号,和我们之前my.ini设置的是一样的。
mysql> show global variables like 'port';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| port | 3308 |
+---------------+-------+
1 row in set, 1 warning (0.00 sec)
我们这里使用navicat16 进行连接,Navicat16软件点击连接MySQL出现突然关闭、闪退情况,在使用电脑的时候,如果我们在屏幕上对一些字词进行选取操作,也就是所谓的屏幕划词,会导致Navicat闪退。检查是否打开了有道词典以及其他翻译软件,豆包以及一些AI软件,关闭即可!如何退出呢,就是点击电脑右下角的隐藏向上箭头,右击豆包等软件,选择退出即可。

点击左上角连接,选择第一个mysql,填写上刚获得的连接名、端口和密码,然后点击测试连接,即出现连接成功。

到这里mysql的安装已经成功,mysql作为数据仓库的元数据库,我们需要在mysql客户端管理工具中新建hive数据库,也可以在刚才进入的命令行,命令行指定字符集合排序规则比较麻烦,选用数据库客户端管理工具很方便,这里我们使用navicat16 Premium, 如下图所示,连接上mysql84, 然后右击选择新建数据库hive。

三、Hive和Spark的正式安装
- 下面正式进入Hive和Spark的安装
Hive下载网址:https://archive.apache.org/dist/hive/hive-3.1.3/
Spark下载网址:https://archive.apache.org/dist/spark/spark-3.5.1/
注意Spark选择如下图片的版本。

- 下载解压到D盘即可,依然需要设置环境变量, 首先新建HIVE_HOME和SPARK_HOME为我们解压的绝对路径,这里分别为:
D:\apache-hive-3.1.3-bin
D:\spark-3.5.1-bin-without-hadoop
然后再Path里加入我们Hive和Spark的可执行目录环境变量,新增两条环境变量分别为:
%HIVE_HOME%\bin
%SPARK_HOME%\bin



- 复制apache-hive-3.1.3-bin\conf下的四个文件,重命名
hive-default.xml.template -----> hive-site.xml
hive-env.sh.template -----> hive-env.sh
hive-exec-log4j.properties.template -----> hive-exec-log4j2.properties
hive-log4j.properties.template -----> hive-log4j2.properties - 在apache-hive-3.1.2-bin创建my_hive文件夹,把mysql-connector放到lib下面
mysql-connector-j下载网址:https://mvnrepository.com/artifact/com.mysql/mysql-connector-j/8.4.0

- 修改配置文件(hive-site.xml 和hive-env.sh)
编辑D:\apache-hive-3.1.3-bin\conf\hive-site.xml 文件
修改这几项,注意是修改,注释的就是和源文件一样的,不需要修改,其他的都需要通过查找进行修改,如过不想修改就把这段复制到开头,通过查找把对应name里的property注释掉。
确保配置里的hive数据库之前已经创建过了。

<!--hive的临时数据目录,指定的位置在hdfs上的目录-->
<!-- <property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
<description>location of default database for the warehouse</description>
</property> -->
<!--hive的临时数据目录,指定的位置在hdfs上的目录-->
<!-- <property>
<name>hive.exec.scratchdir</name>
<value>/tmp/hive</value>
<description>HDFS root scratch dir for Hive jobs which gets created with write all (733) permission. For each connecting user, an HDFS scratch dir: ${hive.exec.scratchdir}/username is created, with ${hive.scratch.dir.permission}.</description>
</property> -->
<!-- scratchdir 本地目录 -->
<property>
<name>hive.exec.local.scratchdir</name>
<value>D:/apache-hive-3.1.3-bin/my_hive/scratch_dir</value>
<description>Local scratch space for Hive jobs</description>
</property>
<!-- resources_dir 本地目录 -->
<property>
<name>hive.downloaded.resources.dir</name>
<value>D:/apache-hive-3.1.3-bin/my_hive/resources_dir/${hive.session.id}_resources</value>
<description>Temporary local directory for added resources in the remote file system.</description>
</property>
<!-- querylog 本地目录 -->
<property>
<name>hive.querylog.location</name>
<value>D:/apache-hive-3.1.3-bin/my_hive/querylog_dir</value>
<description>Location of Hive run time structured log file</description>
</property>
<!-- operation_logs 本地目录 -->
<property>
<name>hive.server2.logging.operation.log.location</name>
<value>D:/apache-hive-3.1.3-bin/my_hive/operation_logs_dir</value>
<description>Top level directory where operation logs are stored if logging functionality is enabled</description>
</property>
<!-- 数据库驱动配置 -->
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.cj.jdbc.Driver</value> ##这是mysql8.0的驱动,mysql5的驱动为com.mysql.jdbc.Driver
<description>Driver class name for a JDBC metastore</description>
</property>
<!-- 数据库用户名 这是你创建的MySQL账户-->
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
<description>Username to use against metastore database</description>
</property>
<!-- 数据库连接地址配置 写入本地的ip-->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost:3308/hive?createDatabaseIfNotExist=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8</value>
<description>
JDBC connect string for a JDBC metastore.
To use SSL to encrypt/authenticate the connection, provide database-specific SSL flag in the connection URL.
For example, jdbc:postgresql://myhost/db?ssl=true for postgres database.
</description>
</property>
<!-- 数据库访问密码 这是你的MySQL密码,别输入错了-->
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>hblgzsx</value>
<description>password to use against metastore database</description>
</property>
<!-- 解决 Caused by: MetaException(message:Version information not found in metastore. ) -->
<property>
<name>hive.metastore.schema.verification</name>
<value>false</value>
<description>
Enforce metastore schema version consistency.
True: Verify that version information stored in is compatible with one from Hive jars. Also disable automatic
schema migration attempt. Users are required to manually migrate schema after Hive upgrade which ensures
proper metastore schema migration. (Default)
False: Warn if the version information stored in metastore doesn't match with one from in Hive jars.
</description>
</property>
<!-- 自动创建全部 -->
<!-- hive Required table missing : "DBS" in Catalog""Schema" 错误 -->
<property>
<name>datanucleus.schema.autoCreateAll</name>
<value>true</value>
<description>Auto creates necessary schema on a startup if one doesn't exist. Set this to false, after creating it once.To enable auto create also set hive.metastore.schema.verification=false. Auto creation is not recommended for production use cases, run schematool command instead.</description>
</property>
编辑(D:\apache-hive-3.1.3-bin\conf\hive-env.sh 文件)
直接在文件后添加三句设置
export HADOOP_HOME=D:\hadoop-3.2.4
# Hive Configuration Directory can be controlled by:
export HIVE_CONF_DIR=D:\apache-hive-3.1.3-bin\conf
# Folder containing extra libraries required for hive compilation/execution can be controlled by:
export HIVE_AUX_JARS_PATH=D:\apache-hive-3.1.3-bin\lib

由于apache-hive-3.1.3的bin不存在windows的可执行文件,需要从之前的老版本复制过来,老版本下载网址: https://archive.apache.org/dist/hive/hive-2.1.0/ ,直接将2.1.0的bin目录直接替换apache-hive-3.1.3的bin目录。
Hive安装和hive数据库创建完毕,打开命令窗口执行以下命令进行元数据库初始化,成功界面如下所示:
hive --service schematool -dbType mysql -initSchema

如果失败了,以下常见错误解答
(1)解决“Class path contains multiple SLF4J bindings.”的问题

产生原因
报错:类路径包含了多个SLF4J的绑定。
这个报错是因为hive里面的slf4j的包跟hadoop里面的包冲突了。
解决方案
把hive里面的这个包删掉即可。
即删除hive安装目录lib下的log4j-slf4j-impl-x.x.x.jar这个jar包。
(2)如下图片非法字符影响,本人删除了hive-site.xml文件中所有的< & &g;这三种字符,注意分号也是,然后又把hive-site.xml中的javax.jdo.option.ConnectionURL值中的&复原了,我觉得网址(url)或者说前端中用这种转义字符是正确的,尤其是&表示&, 而且我分析去掉其他的&号都是description标签里的,应该不会影响xml的依赖起作用, 然后再次在管理员模式下进行元数据库初始化,就成功了。
<!-- 数据库连接地址配置 写入本地的ip-->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost:3308/hive?createDatabaseIfNotExist=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8</value>
<description>
JDBC connect string for a JDBC metastore.
To use SSL to encrypt/authenticate the connection, provide database-specific SSL flag in the connection URL.
For example, jdbc:postgresql://myhost/db?ssl=true for postgres database.
</description>
</property>

- 删除了hive-site.xml文件中所有的
< & &g;这三种字符,出现如下界面。

- 把hive-site.xml中的javax.jdo.option.ConnectionURL值中的
&复原后成功初始化的界面

最终验证,打开hadoop后,也就是执行完start-all命令后,在终端输入hive,会出现最终的界面,中间可能会出一些Method not supported的错误,应该是hive-2.2.0的bin直接复制到hive-3.1.3的版本不匹配,但是不影响最终hive的使用。

执行show databases命令,显示如下界面也表示成功,只有一个默认的default数据库

没有解决的难题(方法1和方法2都失败了,直接方法3吧)
再次执行一个命令create database student;
因为上面显示的info没有用的东西太多,让一些没有用的信息减少出现。
方法1:我们配置一下hive-site.xml,让hive不显示info信息,在hive-site.xml加入如下配置,并删除原来的配置:
<property>
<name>hive.server2.logging.operation.enabled</name>
<value>false</value>
</property>
或者直接在xml文件中Ctrl+F查询hive.server2.logging.operation.enabled, 把value值改为false。

方法1似乎没有什么作用,我们再来试试第二种
方法2:进入hive的安装目录下, 在conf/ 创建log4j.properties日志的配置文件, 然后写入以下信息:
log4j.rootLogger=WARN, CA
log4j.appender.CA=org.apache.log4j.ConsoleAppender
log4j.appender.CA.layout=org.apache.log4j.PatternLayout
log4j.appender.CA.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n

好像也没有什么用处。本人通过方法3成功把INFO信息屏蔽掉。
方法3,解决方法,将%SPARK_HOME%\conf下的log4j2.properties文件下的rootLogger.lever取消注释,并把该值改为error.

没有冗余的信息,就是爽。

4.Spark的安装
1. 安装
(1) Scala安装:
Scala安装网址:https://www.scala-lang.org/download/2.12.8.html
下载下来,放到D:\scala-2.12.8的位置,然后设置环境变量,如下图所示。

设置好之后,打开终端,利用scala -version查看是否成功。

(2)Spark配置
接着找到SPARK_HOME目录下的conf/spark-env.sh.template,将该文件改名为spark-env.cmd(注意不是改名为spark-env.sh,因为window不认sh文件),编辑spark-env.cmd文件,将#全部替换为rem,windows环境下注释用@rem
在spark-env.cmd文件最后添加如下内容
set SPARK_MASTER_HOST=localhost
set SPARK_MASTER_PORT=7077
set SPARK_DIST_CLASSPATH="%HADOOP_HOME%/etc/hadoop/*;%HADOOP_HOME%/share/hadoop/common/lib/*;%HADOOP_HOME%/share/hadoop/common/*;%HADOOP_HOME%/share/hadoop/hdfs/*;%HADOOP_HOME%/share/hadoop/hdfs/lib/*;%HADOOP_HOME%/share/hadoop/hdfs/*;%HADOOP_HOME%/share/hadoop/yarn/lib/*;%HADOOP_HOME%/share/hadoop/yarn/*;%HADOOP_HOME%/share/hadoop/mapreduce/lib/*;%HADOOP_HOME%/share/hadoop/mapreduce/*;%HADOOP_HOME%/share/hadoop/tools/lib/*"
注意以下报错,这是因为without-hadoop版本没有直接包含依赖的hadoop的jar,所以需要在配置文件里指定hadoop的jar位置。

应该要具体指明依赖的哪些hadoop下的lib文件,解决方案是在$SPARK_HOME/conf/spark-env.cmd 最后添加如下内容
set SPARK_DIST_CLASSPATH="%HADOOP_HOME%/etc/hadoop/*;%HADOOP_HOME%/share/hadoop/common/lib/*;%HADOOP_HOME%/share/hadoop/common/*;%HADOOP_HOME%/share/hadoop/hdfs/*;%HADOOP_HOME%/share/hadoop/hdfs/lib/*;%HADOOP_HOME%/share/hadoop/hdfs/*;%HADOOP_HOME%/share/hadoop/yarn/lib/*;%HADOOP_HOME%/share/hadoop/yarn/*;%HADOOP_HOME%/share/hadoop/mapreduce/lib/*;%HADOOP_HOME%/share/hadoop/mapreduce/*;%HADOOP_HOME%/share/hadoop/tools/lib/*"
除此之外需要注意的是
- windows下环境变量的读取用%HADOOP_HOME%,Linux下用${HADOOP_HOME},不要用错了;
- windows下环境变量的分隔符是分号’;‘,而Linux下环境变量的分割符是冒号’:',也不要用错了;
- windows下环境变量set和Linux下环境变量export是等同的。
以上spark的配置都来源这位博主huanan315,感谢大佬的精彩解决方案。

2. 需要额外配置的地方
1. MySQL 驱动是否存在
Spark JDBC 写入 MySQL 时,需要 MySQL 的 JDBC 驱动包。
解决方法: 确保 mysql-connector-java 已添加到 Spark classpath。例如,将 mysql-connector-java-8.x.x.jar 放入 $SPARK_HOME/jars/ 目录。
2. 在提交 Spark 作业时添加 Hive 相关依赖
- 如果你使用的是本地运行,需明确指定 Hive 和 JDBC 相关 jar 包:
- 将 Hive 的依赖 jar 放入 Spark 的
jars目录或运行时指定。 - 必须包含:
hive-exec-x.x.x.jarmysql-connector-java-x.x.x.jar(用于 MySQL 连接)hadoop-common-x.x.x.jar等。
- 将 Hive 的依赖 jar 放入 Spark 的
3. 可能出现的错误
错误1:java.lang.NOSuchMethodError: com.google.common.base.Preconditions.checkArgument
错误信息

解决方案
NoSuchMethodError,其实这类错误一般两种思考思路:
- 系统找不到相关jar包
- 同一类型的 jar 包有不同版本存在,系统无法决定使用哪一个
由百度可知,com.google.common.base.Preconditions.checkArgument类位于我们的guava.jar包, 所以需要把%HADOOP_HOME%/share/hadoop/common/lib/文件夹下的guava-27.0-jre.jar复制到%HIVE_HOME%/lib文件夹下,并删除guava-19.0.jar


错误2 java.lang.IllegalArgumentException: Error while instantiating 'org.apache.spark.sql.hive.HiveSessionStateBuilder':
错误信息
Traceback (most recent call last):
File "D:\Desktop\毕业设计-hadoop\茶叶数据\基于大数据茶叶数据分析系统\spark\sparkFirst_tea.py", line 29, in <module>
df = spark.read.format("csv"). \
File "D:\ProgramData\Python 3.9.7(64bit)\lib\site-packages\pyspark\sql\session.py", line 1706, in read
return DataFrameReader(self)
File "D:\ProgramData\Python 3.9.7(64bit)\lib\site-packages\pyspark\sql\readwriter.py", line 70, in __init__
self._jreader = spark._jsparkSession.read()
File "D:\ProgramData\Python 3.9.7(64bit)\lib\site-packages\py4j\java_gateway.py", line 1322, in __call__
return_value = get_return_value(
File "D:\ProgramData\Python 3.9.7(64bit)\lib\site-packages\pyspark\errors\exceptions\captured.py", line 185, in deco
raise converted from None
pyspark.errors.exceptions.captured.IllegalArgumentException: Error while instantiating 'org.apache.spark.sql.hive.HiveSessionStateBuilder':
JVM stacktrace:
java.lang.IllegalArgumentException: Error while instantiating 'org.apache.spark.sql.hive.HiveSessionStateBuilder':
at org.apache.spark.sql.SparkSession$.org$apache$spark$sql$SparkSession$$instantiateSessionState(SparkSession.scala:1322)
at org.apache.spark.sql.SparkSession.$anonfun$sessionState$2(SparkSession.scala:162)
at scala.Option.getOrElse(Option.scala:189)
at org.apache.spark.sql.SparkSession.sessionState$lzycompute(SparkSession.scala:160)
at org.apache.spark.sql.SparkSession.sessionState(SparkSession.scala:157)
at org.apache.spark.sql.DataFrameReader.<init>(DataFrameReader.scala:699)
at org.apache.spark.sql.SparkSession.read(SparkSession.scala:783)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:244)
at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:374)
at py4j.Gateway.invoke(Gateway.java:282)
at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132)
at py4j.commands.CallCommand.execute(CallCommand.java:79)
at py4j.ClientServerConnection.waitForCommands(ClientServerConnection.java:182)
at py4j.ClientServerConnection.run(ClientServerConnection.java:106)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.ClassNotFoundException: org.apache.spark.sql.hive.HiveSessionStateBuilder
at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:348)
at org.apache.spark.util.SparkClassUtils.classForName(SparkClassUtils.scala:41)
at org.apache.spark.util.SparkClassUtils.classForName$(SparkClassUtils.scala:36)
at org.apache.spark.util.Utils$.classForName(Utils.scala:94)
at org.apache.spark.sql.SparkSession$.org$apache$spark$sql$SparkSession$$instantiateSessionState(SparkSession.scala:1317)
... 18 more
解决方案:下载spark-hive_x.x.x-x.x.x.jar(spark-hive-2.12)
下载网址:https://mvnrepository.com/artifact/org.apache.spark/spark-hive
错误3 py4j.protocol.Py4JJavaError: An error occurred while calling o31.read.: java.lang.NoClassDefFoundError: scala/collection/IterableOnce
错误信息
py4j.protocol.Py4JJavaError: An error occurred while calling o31.read.
: java.lang.NoClassDefFoundError: scala/collection/IterableOnce
at org.apache.spark.sql.hive.HiveSessionStateBuilder.planner(HiveSessionStateBuilder.scala:125)
at org.apache.spark.sql.internal.BaseSessionStateBuilder.build(BaseSessionStateBuilder.scala:377)
at org.apache.spark.sql.SparkSession$.org$apache$spark$sql$SparkSession$$instantiateSessionState(SparkSession.scala:1319)
at org.apache.spark.sql.SparkSession.$anonfun$sessionState$2(SparkSession.scala:162)
at scala.Option.getOrElse(Option.scala:189)
at org.apache.spark.sql.SparkSession.sessionState$lzycompute(SparkSession.scala:160)
at org.apache.spark.sql.SparkSession.sessionState(SparkSession.scala:157)
at org.apache.spark.sql.DataFrameReader.<init>(DataFrameReader.scala:699)
at org.apache.spark.sql.SparkSession.read(SparkSession.scala:783)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:244)
at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:374)
at py4j.Gateway.invoke(Gateway.java:282)
at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132)
at py4j.commands.CallCommand.execute(CallCommand.java:79)
at py4j.ClientServerConnection.waitForCommands(ClientServerConnection.java:182)
at py4j.ClientServerConnection.run(ClientServerConnection.java:106)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.ClassNotFoundException: scala.collection.IterableOnce
at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 21 more
解决方案
解决方案:下载scala-library-x.x.x.jar(scala-library-2.12)
下载网址:https://mvnrepository.com/artifact/org.scala-lang/scala-library
错误4 : java.lang.NoSuchMethodError: org.apache.spark.sql.hive.HiveSessionStateBuilder.customResolutionRules()Lscala/collection/immutable/Seq
错误信息
py4j.protocol.Py4JJavaError: An error occurred while calling o45.load.
: java.lang.NoSuchMethodError: org.apache.spark.sql.hive.HiveSessionStateBuilder.customResolutionRules()Lscala/collection/immutable/Seq;
at org.apache.spark.sql.hive.HiveSessionStateBuilder$$anon$1.<init>(HiveSessionStateBuilder.scala:96)
at org.apache.spark.sql.hive.HiveSessionStateBuilder.analyzer(HiveSessionStateBuilder.scala:85)
at org.apache.spark.sql.internal.BaseSessionStateBuilder.$anonfun$build$2(BaseSessionStateBuilder.scala:375)
at org.apache.spark.sql.internal.SessionState.analyzer$lzycompute(SessionState.scala:92)
at org.apache.spark.sql.internal.SessionState.analyzer(SessionState.scala:92)
at org.apache.spark.sql.execution.QueryExecution.$anonfun$analyzed$1(QueryExecution.scala:77)
at org.apache.spark.sql.catalyst.QueryPlanningTracker.measurePhase(QueryPlanningTracker.scala:138)
at org.apache.spark.sql.execution.QueryExecution.$anonfun$executePhase$2(QueryExecution.scala:219)
at org.apache.spark.sql.execution.QueryExecution$.withInternalError(QueryExecution.scala:546)
at org.apache.spark.sql.execution.QueryExecution.$anonfun$executePhase$1(QueryExecution.scala:219)
at org.apache.spark.sql.SparkSession.withActive(SparkSession.scala:900)
at org.apache.spark.sql.execution.QueryExecution.executePhase(QueryExecution.scala:218)
at org.apache.spark.sql.execution.QueryExecution.analyzed$lzycompute(QueryExecution.scala:77)
at org.apache.spark.sql.execution.QueryExecution.analyzed(QueryExecution.scala:74)
at org.apache.spark.sql.execution.QueryExecution.assertAnalyzed(QueryExecution.scala:66)
at org.apache.spark.sql.Dataset$.$anonfun$ofRows$1(Dataset.scala:91)
at org.apache.spark.sql.SparkSession.withActive(SparkSession.scala:900)
at org.apache.spark.sql.Dataset$.ofRows(Dataset.scala:89)
at org.apache.spark.sql.SparkSession.baseRelationToDataFrame(SparkSession.scala:446)
at org.apache.spark.sql.DataFrameReader.loadV1Source(DataFrameReader.scala:229)
at org.apache.spark.sql.DataFrameReader.$anonfun$load$2(DataFrameReader.scala:211)
at scala.Option.getOrElse(Option.scala:189)
at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:211)
at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:186)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:244)
at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:374)
at py4j.Gateway.invoke(Gateway.java:282)
at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132)
at py4j.commands.CallCommand.execute(CallCommand.java:79)
at py4j.ClientServerConnection.waitForCommands(ClientServerConnection.java:182)
at py4j.ClientServerConnection.run(ClientServerConnection.java:106)
at java.lang.Thread.run(Thread.java:748)
解决方案
解决方案:下载scala-library-x.x.x.jar(scala-library-2.12)
下载网址:https://mvnrepository.com/artifact/org.scala-lang/scala-library
错误5 java.lang.NoClassDefFoundError: org/apache/calcite/plan/RelOptRule
错误信息
py4j.protocol.Py4JJavaError: An error occurred while calling o67.saveAsTable.
: java.lang.NoClassDefFoundError: org/apache/calcite/plan/RelOptRule
at org.apache.spark.sql.hive.client.HiveClientImpl$.getHive(HiveClientImpl.scala:1350)
at org.apache.spark.sql.hive.client.HiveClientImpl.client(HiveClientImpl.scala:267)
at org.apache.spark.sql.hive.client.HiveClientImpl.$anonfun$withHiveState$1(HiveClientImpl.scala:292)
at org.apache.spark.sql.hive.client.HiveClientImpl.liftedTree1$1(HiveClientImpl.scala:234)
at org.apache.spark.sql.hive.client.HiveClientImpl.retryLocked(HiveClientImpl.scala:233)
at org.apache.spark.sql.hive.client.HiveClientImpl.withHiveState(HiveClientImpl.scala:283)
at org.apache.spark.sql.hive.client.HiveClientImpl.databaseExists(HiveClientImpl.scala:406)
at org.apache.spark.sql.hive.HiveExternalCatalog.$anonfun$databaseExists$1(HiveExternalCatalog.scala:224)
at scala.runtime.java8.JFunction0$mcZ$sp.apply(JFunction0$mcZ$sp.java:23)
at org.apache.spark.sql.hive.HiveExternalCatalog.withClient(HiveExternalCatalog.scala:99)
at org.apache.spark.sql.hive.HiveExternalCatalog.databaseExists(HiveExternalCatalog.scala:224)
at org.apache.spark.sql.internal.SharedState.externalCatalog$lzycompute(SharedState.scala:146)
at org.apache.spark.sql.internal.SharedState.externalCatalog(SharedState.scala:140)
at org.apache.spark.sql.hive.HiveSessionStateBuilder.externalCatalog(HiveSessionStateBuilder.scala:54)
at org.apache.spark.sql.hive.HiveSessionStateBuilder.$anonfun$catalog$1(HiveSessionStateBuilder.scala:69)
at org.apache.spark.sql.catalyst.catalog.SessionCatalog.externalCatalog$lzycompute(SessionCatalog.scala:122)
at org.apache.spark.sql.catalyst.catalog.SessionCatalog.externalCatalog(SessionCatalog.scala:122)
at org.apache.spark.sql.catalyst.catalog.SessionCatalog.tableExists(SessionCatalog.scala:514)
at org.apache.spark.sql.DataFrameWriter.saveAsTable(DataFrameWriter.scala:641)
at org.apache.spark.sql.DataFrameWriter.saveAsTable(DataFrameWriter.scala:571)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:244)
at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:374)
at py4j.Gateway.invoke(Gateway.java:282)
at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132)
at py4j.commands.CallCommand.execute(CallCommand.java:79)
at py4j.ClientServerConnection.waitForCommands(ClientServerConnection.java:182)
at py4j.ClientServerConnection.run(ClientServerConnection.java:106)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.ClassNotFoundException: org.apache.calcite.plan.RelOptRule
at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 32 more
解决方案
解决方案:下载calcite-core-1.32.0.jar
下载网址:https://mvnrepository.com/artifact/org.apache.calcite/calcite-core
错误6:java.lang.NoClassDefFoundError: com/facebook/fb303/FacebookService$Iface
错误信息
py4j.protocol.Py4JJavaError: An error occurred while calling o67.saveAsTable.
: java.lang.NoClassDefFoundError: com/facebook/fb303/FacebookService$Iface
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:468)
at java.net.URLClassLoader.access$100(URLClassLoader.java:74)
at java.net.URLClassLoader$1.run(URLClassLoader.java:369)
at java.net.URLClassLoader$1.run(URLClassLoader.java:363)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:362)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:348)
at org.apache.hadoop.hive.metastore.utils.JavaUtils.getClass(JavaUtils.java:52)
at org.apache.hadoop.hive.metastore.RetryingMetaStoreClient.getProxy(RetryingMetaStoreClient.java:146)
at org.apache.hadoop.hive.metastore.RetryingMetaStoreClient.getProxy(RetryingMetaStoreClient.java:119)
at org.apache.hadoop.hive.ql.metadata.Hive.createMetaStoreClient(Hive.java:4306)
at org.apache.hadoop.hive.ql.metadata.Hive.getMSC(Hive.java:4374)
at org.apache.hadoop.hive.ql.metadata.Hive.getMSC(Hive.java:4354)
at org.apache.hadoop.hive.ql.metadata.Hive.getDatabase(Hive.java:1662)
at org.apache.hadoop.hive.ql.metadata.Hive.databaseExists(Hive.java:1651)
at org.apache.spark.sql.hive.client.Shim_v0_12.databaseExists(HiveShim.scala:609)
at org.apache.spark.sql.hive.client.HiveClientImpl.$anonfun$databaseExists$1(HiveClientImpl.scala:406)
at scala.runtime.java8.JFunction0$mcZ$sp.apply(JFunction0$mcZ$sp.java:23)
at org.apache.spark.sql.hive.client.HiveClientImpl.$anonfun$withHiveState$1(HiveClientImpl.scala:303)
at org.apache.spark.sql.hive.client.HiveClientImpl.liftedTree1$1(HiveClientImpl.scala:234)
at org.apache.spark.sql.hive.client.HiveClientImpl.retryLocked(HiveClientImpl.scala:233)
at org.apache.spark.sql.hive.client.HiveClientImpl.withHiveState(HiveClientImpl.scala:283)
at org.apache.spark.sql.hive.client.HiveClientImpl.databaseExists(HiveClientImpl.scala:406)
at org.apache.spark.sql.hive.HiveExternalCatalog.$anonfun$databaseExists$1(HiveExternalCatalog.scala:224)
at scala.runtime.java8.JFunction0$mcZ$sp.apply(JFunction0$mcZ$sp.java:23)
at org.apache.spark.sql.hive.HiveExternalCatalog.withClient(HiveExternalCatalog.scala:99)
at org.apache.spark.sql.hive.HiveExternalCatalog.databaseExists(HiveExternalCatalog.scala:224)
at org.apache.spark.sql.internal.SharedState.externalCatalog$lzycompute(SharedState.scala:146)
at org.apache.spark.sql.internal.SharedState.externalCatalog(SharedState.scala:140)
at org.apache.spark.sql.hive.HiveSessionStateBuilder.externalCatalog(HiveSessionStateBuilder.scala:54)
at org.apache.spark.sql.hive.HiveSessionStateBuilder.$anonfun$catalog$1(HiveSessionStateBuilder.scala:69)
at org.apache.spark.sql.catalyst.catalog.SessionCatalog.externalCatalog$lzycompute(SessionCatalog.scala:122)
at org.apache.spark.sql.catalyst.catalog.SessionCatalog.externalCatalog(SessionCatalog.scala:122)
at org.apache.spark.sql.catalyst.catalog.SessionCatalog.tableExists(SessionCatalog.scala:514)
at org.apache.spark.sql.DataFrameWriter.saveAsTable(DataFrameWriter.scala:641)
at org.apache.spark.sql.DataFrameWriter.saveAsTable(DataFrameWriter.scala:571)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:244)
at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:374)
at py4j.Gateway.invoke(Gateway.java:282)
at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132)
at py4j.commands.CallCommand.execute(CallCommand.java:79)
at py4j.ClientServerConnection.waitForCommands(ClientServerConnection.java:182)
at py4j.ClientServerConnection.run(ClientServerConnection.java:106)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.ClassNotFoundException: com.facebook.fb303.FacebookService$Iface
at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 55 more
解决方案
解决方案:下载facebook-0.9.0.jar
下载网址:https://mvnrepository.com/artifact/com.facebook.fb303/facebook
5. 环境变量了解
系统变量
- 作用范围:针对所有用户起作用。
- 优先级:
- Path 变量:系统环境变量的 Path 优先级高于用户环境变量的 Path。Windows 系统在执行用户命令时,若用户未给出文件的绝对路径,会先在当前目录下寻找相应的可执行文件,然后在系统变量的 Path 路径中查找,如果找不到,再到用户变量的 Path 路径中查找。
- 其他普通变量:如果在用户变量和系统变量中创建同名变量,Windows 会将用户变量覆盖系统变量。
用户变量
- 作用范围:只对当前用户起作用。
- 优先级:
- Path 变量:用户环境变量的 Path 会添加到系统变量 Path 后面。Windows 在查找指令时,按 Path 中的路径从前往后找,直至在某个路径中找到了该指令。如果系统变量 Path 中有对应指令,Windows 不会再去用户变量 Path 中查找。
- 其他普通变量:对于普通变量,用户环境变量优先级高于系统环境变量。系统会先检查用户变量,之后再检查系统变量。
总结
- Path 变量:系统变量 > 用户变量(系统变量优先)
- 普通变量:用户变量 > 系统变量(用户变量优先)
设置环境变量四种方法
在 Windows 系统中,设置 SPARK_DIST_CLASSPATH 环境变量可以通过多种方式进行,以下是几种常见的方法:
这里我们着重使用方法1和方法4, 方法1就是我们之前了解的,方法4就是在Python代码里指定,之前配置%SPARK_DIST_CLASSPATH%可能会失败,所以直接从代码里设置也可以。
import os
os.environ['SPARK_DIST_CLASSPATH'] = r"D:\hadoop-3.2.4\etc\hadoop\*;D:\hadoop-3.2.4\share\hadoop/common/lib/*;D:\hadoop-3.2.4/share/hadoop/common/*;D:\hadoop-3.2.4/share/hadoop/hdfs/*;D:\hadoop-3.2.4/share/hadoop/hdfs/lib/*;D:\hadoop-3.2.4/share/hadoop/hdfs/*;D:\hadoop-3.2.4/share/hadoop/yarn/lib/*;D:\hadoop-3.2.4/share/hadoop/yarn/*;D:\hadoop-3.2.4/share/hadoop/mapreduce/lib/*;D:\hadoop-3.2.4/share/hadoop/mapreduce/*;D:\hadoop-3.2.4/share/hadoop/tools/lib/*;D:/apache-hive-3.1.3-bin/lib/*;D:/apache-hive-3.1.3-bin/conf/*;"
os.environ['SPARK_HOME'] = r'D:\spark-3.5.1-bin-without-hadoop'
os.environ['HADOOP_HOME'] = r'D:\hadoop-3.2.4'
方法一:通过系统属性设置
-
打开系统属性:
- 右键点击 "此电脑" 或 "计算机",选择 "属性"。
- 在打开的窗口中,点击 "高级系统设置"。
-
环境变量:
- 在 "系统属性" 窗口中,点击 "环境变量" 按钮。
- 在 "环境变量" 窗口中,你可以在 "系统变量" 或 "用户变量" 部分找到并编辑现有的环境变量,或者点击 "新建" 按钮来创建一个新的环境变量。
-
添加
SPARK_DIST_CLASSPATH:- 在 "新建系统变量" 或 "编辑系统变量" 窗口中,输入变量名为
SPARK_DIST_CLASSPATH,变量值为你需要的路径,例如:C:\path\to\jar1.jar;C:\path\to\jar2.jar。 - 点击 "确定" 保存设置。
- 在 "新建系统变量" 或 "编辑系统变量" 窗口中,输入变量名为
方法二:通过命令提示符(CMD)设置
-
打开命令提示符:
- 按
Win + R,输入cmd,然后按Enter。
- 按
-
设置环境变量:
- 在命令提示符中,输入以下命令来设置
SPARK_DIST_CLASSPATH环境变量:
setx SPARK_DIST_CLASSPATH="C:\path\to\jar1.jar;C:\path\to\jar2.jar"
- 按
Enter执行命令。这将把SPARK_DIST_CLASSPATH设置为系统环境变量,并在所有命令提示符窗口中生效。
方法三:通过批处理文件(.bat)设置
-
创建批处理文件:
- 在文本编辑器中创建一个新的文件,例如
set_spark_env.bat,并添加以下内容:
- 在文本编辑器中创建一个新的文件,例如
@echo off
setx SPARK_DIST_CLASSPATH="C:\path\to\jar1.jar;C:\path\to\jar2.jar"
-
运行批处理文件:
- 双击
set_spark_env.bat文件,或者在命令提示符中导航到文件所在目录并运行该文件。
- 双击
方法四:通过脚本或程序代码设置
如果你在编写一个脚本或程序,你也可以在代码中设置 SPARK_DIST_CLASSPATH 环境变量。例如,在 Python 中,你可以使用 os 模块来设置环境变量:
import os
os.environ['SPARK_DIST_CLASSPATH'] = 'C:\\path\\to\\jar1.jar;C:\\path\\to\\jar2.jar
6. 大数据分析系统还需额外配置
- 下载Navicat Premium16(可以通过微信软件管家进行下载安装),然后新建数据库,bigdata,采用如下编码,记住,mysql一定要连接之前配置的mysql服务。

- 也可以使用终端实现创建数据库, 首先登录mysql数据库终端,打开终端输入
mysql -u root -p, 输入密码,然后输入如下命令
create database bigdata default charset utf8mb4 collate utf8mb4_0900_ai_ci;
最后,如果要保证pyspark和pyhive能和本地连接,每次启动start-dfs后,需要执行如下两个命令
hive --service metastore &
hive --service hiveserver2 &

浙公网安备 33010602011771号