1⃣️版本兼容问题
由于Hadoop生态是开源的,所以难免会出现版本兼容问题。为了保证Hadoop、spark、jdk、python之间可以兼容,建议使用我分享的版本。当然读者也可自己选择兼容的其他版本
2⃣️路径名中文问题
不论是在配置环境变量还是在文件中写路径时,最好路径不要出现中文,因为有可能由于编码的原因造成中文不识别,从而产生很多不必要的麻烦
首先要保证电脑上安装了jdk,这里下载jdk1.8,可以去官网下载,也可以使用我分享的文件
链接:https://pan.baidu.com/s/1MErkVhORho7tp3Eg97a9Aw
提取码:1234
下载后完成后全部无脑下一步就行,不用修改安装路径,占不了多少c盘空间。
从1.8版本开始会默认在path中添加环境变量
在cmd中输入以下命令
可以正常显示版本就没有问题
这里可以在配置一个JAVA_HOME
环境变量配置的具体步骤如下
我的电脑 - 属性 - 高级系统设置 - 环境变量
点击下面的新建,创建JAVA_HOME,jdk安装路径不知道的可以去Path环境变量中查看一下。
可以去官网下载,也可以使用我的分享
链接:https://pan.baidu.com/s/1npJeWvcIzhh0lip5dOcshA
提取码:1234
下载完成后解压到一个目录下就行,建议专门找一个盘或者一个目录,用来存放Hadoop以及接下来要安装的两个包
使用我的分享
链接:https://pan.baidu.com/s/1BNya_X5gT3IIU0qMpFC5tw
提取码:1234
下载完成后找到相应的Hadoop版本,这里我们安装的是2.7.1
进入该目录,将bin目录下的所有内容复制,粘贴到Hadoop安装目录的bin目录下,添加或替换一些文件
同jdk环境变量的配置相同
首先配置HADOOP_HOME
然后配置Path,点击新建,浏览Hadoop目录
打开Hadoop安装目录,我的是G:\hadoop-2.7.1\etc\hadoop
找到hadoop.env.cmd文件,用记事本打开,修改下面的内容,可以使用相对路径,也可以使用绝对路径,这里使用绝对路径。
由于默认的jdk目录Program Files 有空格,所以修改为以上内容,点击保存。
由于版本问题,使用Hadoop2.7和spark2.4版本只能使用python3.6,所以需要安装python3.6
建议使用anaconda来下载python。anaconda的下载和安装网上教程很多,这里不再赘述。
首先打开Anaconda Navigator
点击environments
点击create,创建相应的python环境
这里可以看到我有两个环境,一个是base,一个是python36,这两个环境是独立的,互不干扰。在使用某一个环境时,只需要切换到对应的环境即可。
可以使用我的分享
链接:https://pan.baidu.com/s/1Rk02jTByyYRuudLqzbbeGw
提取码:1234
下载完并解压,同理,最好跟Hadoop2.7和winutils放在同一个盘或者目录下,方便以后的管理。
进入spark安装目录,我的是G:\spark-2.4.3-bin-hadoop2.7\python
将pyspark复制到Anaconda下的python36目录,我的是F:\AnacondaData\envs\python36\Lib\site-packages
在cmd进入scripts目录,我的是F:\AnacondaData\envs\python36\Scripts,安装py4j
打开cmd,输入spark-shell,出现以下内容说明配置成功。
或者打开pyspark
这里注意,由于我的电脑安装了多个python版本,一个3.6,一个3.8,而运行pyspark需要3,6版本,因此首先要进行版本切换,即切换到之前提到过的python36环境
输入activate 环境名 ,可以看到左边有个括号,里面显示python36,这就表明进入了3.6的环境
查看一下python版本,果然是3.6
因此,我们可以放心大胆地使用pyspark了,直接输入pyspark
PyCharm的配置很简单,首先新建一个项目
起好名字之后,选择interpreter,这里选择Existing interpreter
找到python36中的python.exe
这样一个项目就创建好了。
新建一个word.txt文件,里面随便写几个单词,用空格分隔
from pyspark import SparkConf, SparkContext
conf = SparkConf().setAppName("WordCount").setMaster("local")
sc = SparkContext(conf=conf)
inputFile = "word.txt"
textFile = sc.textFile(inputFile)
wordCount = textFile.flatMap(lambda line: line.split(" ")).map(lambda word: (word, 1)).reduceByKey(lambda a, b: a + b)
wordCount.foreach(print)