一、实验目的
(一)在单台电脑上按照“Hadoop(伪分布式)+Spark(Local模式)”方式完成Hadoop和Spark组合环境的搭建。
二、实验平台
Linux系统: Ubuntu 16.04
Hadoop: 2.7.1版本
JDK: 1.8以上版本
Spark: 2.4.0版本
三、实验内容和要求
(一)Hadoop、JDK、vim编辑器的安装
1、下载hadoop-2.7.1.tar、jdk-8u162-linux-x64.tar这两个软件。
2、创建hadoop用户
按“ctrl+alt+t”打开一个终端窗口,创建新用户:
$ sudo useradd -m hadoop -s /bin/bash
这条命令创建了可以登陆的hadoop用户,并使用/bin/bash作为shell。
接着设置密码:
$ sudo passwd hadoop
为hadoop用户增加管理员权限。
$ sudo adduser hadoop sudo

然后注销当前用户,返回登陆界面,选择hadoop用户登陆。
3、更新apt及安装vim编辑器
后续会使用apt安装软件,需要更新一下apt:
$ sudo apt-get update
后续需要更改一些配置文件,安装vim编辑器:
$ sudo apt-get install vim

4、安装SSH、配置SSH无密码登陆
单节点、集群模式都需要用到SSH登陆(类似于远程登陆,可以登陆某台Linux主机,并在上面运行命令),Ubuntu系统默认安装了SSH client,此外还需要安装SSH server:
$ sudo apt-get install openssh-server
安装后,可以使用如下命令登陆本机:
$ ssh localhost

但是这样登陆是需要输入密码的,要配置成SSH无密码登陆比较方便。退出刚才的ssh,回到原先的终端窗口,利用ssh-keygen生成密钥,并将密钥加入到授权中:
$ exit
$ cd ~/.ssh/
$ ssh-keygen -t rsa
$ cat ./id_rsa.pub >> ./authorized_keys

5、安装Java环境
在Windows系统中下载JDK1.8的安装包jdk-8u162-linux-x64.tar.gz,上传至Ubuntu系统的“/home/hadoop/下载/”目录下,在Linux命令行界面中,执行如下Shell命令:
$ cd /usr/lib
$ sudo mkdir jvm #创建/usr/lib/jvm目录用来存放JDK文件
$ cd ~ #进入hadoop用户的主目录
$ cd 下载 #进入/home/hadoop/下载/目录下
$ sudo tar -zxvf ./jdk-8u162-linux-x64.tar.gz -C /usr/lib/jvm #把JDK文件解压到/usr/lib/jvm目录下
设置环境变量:
$ cd ~
$ vim ~/.bashrc
在hadoop用户的环境变量配置文件中的开头位置,添加如下几行内容:
export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_162
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
保存。bashrc文件并推出vim编辑器,执行如下命令让配置立即生效:
$ source ~/.bashrc
$ java -version #查看是否安装成功

6、安装Hadoop
将hadoop-2.7.1.tar.gz文件上传至Ubuntu系统,将其安装至/usr/local/中:
$ sudo tar -zxf ~/下载/hadoop-2.7.1.tar.gz -C /usr/local #解压到/usr/local中
$ cd /usr/local/
$ sudo mv ./hadoop-2.7.1/ ./hadoop #将文件夹名改为hadoop
$ sudo chown -R hadoop ./hadoop #修改文件权限
$ cd /usr/local/hadoop
$ ./bin/hadoop version #显示Hadoop版本信息,检查其是否可用

(二)Hadoop伪分布式模式配置
Hadoop可以在单节点上以伪分布式的方式运行,Hadoop进程以分离的Java 进程来运行,节点既作为NameNode 也作为DataNode,同时,读取的是HDFS 中的文件。
Hadoop的配置文件位于/usr/local/hadoop/etc/hadoop/ 中,伪分布式需要修改2个配置文件core-site.xml和hdfs-site.xml。Hadoop的配置文件是xml 格式,每个配置以声明property的name和value的方式来实现。
修改配置文件core-site.xml:
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/usr/local/hadoop/tmp</value>
<description>Abase for other temporary directories.</description>
</property>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
修改配置文件hdfs-site.xml:
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/usr/local/hadoop/tmp/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/usr/local/hadoop/tmp/dfs/data</value>
</property>
</configuration>
配置完成后,执行NameNode格式化:
$ cd /usr/local/hadoop
$ ./bin/hdfs namenode -format
成功的话,会看到 “successfully formatted” 和 “Exitting with status 0” 的提示,若为 “Exitting with status 1” 则是出错。
接着开启 NameNode 和 DataNode 守护进程。若出现如下SSH提示,输入yes即可。
$ ./sbin/start-dfs.sh
启动完成后,通过命令 jps 来判断是否成功启动,若成功启动则会列出如下进程: “NameNode”、”DataNode” 和 “SecondaryNameNode”

成功启动后,可以在Ubuntu系统中访问Web界面http://localhost:50070查看NameNode和 Datanode信息,还可以在线查看 HDFS 中的文件。

(三)运行Hadoop伪分布式实例
伪分布式读取的则是HDFS上的数据,要使用HDFS,首先需要在HDFS中创建用户目录:
$ ./bin/hdfs dfs -mkdir -p /user/hadoop
接着将./etc/hadoop中的xml文件作为输入文件复制到分布式文件系统中,即将/usr/local/hadoop/etc/hadoop复制到分布式文件系统中的/user/hadoop/input中。我们使用的是hadoop用户,并且已创建相应的用户目录/user/hadoop,因此在命令中就可以使用相对路径如input,其对应的绝对路径就是/user/hadoop/input:
$ ./bin/hdfs dfs -mkdir input
$ ./bin/hdfs dfs -put ./etc/hadoop/*.xml input
复制完成后,可以通过如下命令查看文件列表:
$ ./bin/hdfs dfs -ls input
若要关闭Hadoop,则运行:
$ ./sbin/stop-dfs.sh

(四)安装Spark
1、下载spark-2.4.0-bin-without-hadoop.tgz并上传至Ubuntu系统的“/home/hadoop/下载”目录下。
2、对文件进行解压,存放在“/usr/local/”目录下:
$ 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用户中/usr/local/hadoop目录夹中权限赋予/usr/local/spark
3、配置相关文件
⑴修改spark-env.sh文件
$ cd /usr/local/spark
$ cp ./conf/spark-env.sh.template ./conf/spark-env.sh
使用vim编辑器编辑spark-env.sh文件,在该文件第一行添加以下配置信息:
export SPARK_DIST_CLASSPATH=$(/usr/local/hadoop/bin/hadoop classpath)
配置信息后,Spark可以把数据存储到HDFS中,也可从HDFS中读取数据。
⑵检查并修改.bashrc文件
$ vim ./bashrc
检查并修改为如下内容:
export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_162
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=$PATH:${JAVA_HOME}/bin:/usr/local/hbase/bin
export HADOOP_HOME=/usr/local/hadoop
export SPARK_HOME=/usr/local/spark
export PYTHONPATH=$SPARK_HOME/python:$SPARK_HOME/python/lib/py4j-0.10.7-src.zip:$PYTHONPATH
export PYSPARK_PYTHON=python3
export PATH=$HADOOP_HOME/bin:$SPARK_HOME/bin:$PATH
上述设置中,PYTHONPATH环境变量主要是为了在python3中引入pyspark库,PYSPARK_PYTHON变量主要用于设置pyspark运行的Python版本。需要注意的是,py4j-0.10.7-src.zip文件名必须与“/usr/local/spark/python/lib”目录下保持一致。
执行如下代码让环境变量生效:
$ source ~/.bashrc
4、验证Spark是否安装成功
$ cd /usr/local/spark
$ ./bin/run-example SparkPi 2>&1 | grep “Pi is roughly”

5、Spark和Hadoop的交互
完成以上步骤以后,就在单台机器上按照“Hadoop(伪分布式)+Spark(Local模式)”这种方式完成了Hadoop和Spark组合环境的搭建。Hadoop和Spark可以相互协作,由Hadoop的HDFS、HBase等组件负责数据的存储和管理,由Spark负责数据的计算。
为了能够让Spark操作HDFS中的数据,需要先启动HDFS;通过命令jps来判断是否成功启动,若成功启动,会列出如下进程:NameNode、DataNode、SecondaryNameNode,然后,Spark就可以对HDFS中的数据进行读取或写入操作;使用结束后关闭HDFS。

(五)在pyspark中运行代码
执行pyspark命令,可以启动进入Python版本的Spark交互式执行环境,不带任何参数时,默认使用Local模式。

(六)开发Spark独立应用程序
在Ubuntu系统中打开一个Linux终端,使用vim编辑器新建一个代码文件“/usr/local/spark/mycode/python/WordCount.py”,具体内容如下:
from pyspark import SparkConf,SparkContext
conf = SparkConf().setMaster(“local”).setAppName(“My App”)
sc = SparkContext(conf = conf)
logFile = “file:///usr/local/spark/README.md”
logData = sc.textFile(logFile,2).cache()
numAs = logData.filter(lambda line: ‘a’ in line).count()
numBs = logData.filter(lambda line: ‘b’ in line).count()
print(‘Lines with a: %s, Lines with b: %s’ % (numAs,numBs))
使用如下命令执行:
$ cd /usr/local/spark/mycode/python
$ python3 WordCount.py
也可以通过spark-submit提交到Spark中运行,命令如下:
$ /usr/local/spark/bin/spark-submit /usr/local/spark/mycode/python/WordCount.py


注意实践过程中需要注意所有符号应为英文标点符号。
行大运
2021-4-19 09:04