可能是坑最少的Spark环境搭建教程(二)

环境介绍

  • CentOS 7.3 - 1611 Minimal
  • JDK 1.8
  • Hadoop 2.7.4
  • HBase 1.2.6
  • Scala 2.11.8
  • Spark 2.1.1
  • Zookeeper 3.4.8

我直接用的是 root 账户,虽然这样不太好,但是可以简单粗暴的避免一些权限问题

所有的安装包置于 /opt 目录下

1
cd /opt

所需安装包列表

2 安装配置

首先安装 CentOS-7-x86_64-Minimal-1611.iso,安装完成后进行如下配置

2.1 IP 地址

配置过程略,可以 Google 一下网上有很多的教程

本教程的 IP 地址为 10.109.246.66

2.2 关闭并禁用防火墙
1
2
systemctl stop firewalld.service
systemctl disable firewalld.service
2.3 hostname

修改主机名

1
hostname data

修改 hosts,增加以下两行

1
vim /etc/hosts
1
2
127.0.0.1 localhost
10.109.246.66 data

2.4 SSH

修改 enforcingdisabled

1
vim /etc/sysconfig/selinux

修改完成后重启 Linux

1
reboot

启动完成后,继续执行下面的命令,并一路回车,这样就会生成 ssh key

1
ssh-keygen -t rsa

接下来配置 SSH 免密码登录,为了保险起见,这里同时配置 localhost、data(hostname) 和 10.109.246.66(IP 地址) 共三个地址

执行命令的过程中会输入 yes 和服务器密码

1
2
3
ssh-copy-id localhost
ssh-copy-id data
ssh-copy-id 10.109.246.66

ssh-copy-id 是什么?

免密登录的原理是将客户端的 SSH 公钥 id_rsa.pub 加到服务器的 known_hosts,这样以后再登录的时候服务器检查自己的 known 文件,就直接允许登录。我们可以手动把客户端的公钥追加到服务器的 known 文件,但是这样比较繁琐,ssh-copy-id 是用来简化这个操作的一条命令。这条命令在客户端执行,参数为服务器的地址,这里由于我们是本机免密码,所以后面三个标识本质上都是本机地址

2.5 JDK 1.8

CentOS 7 以 Minimal 形式安装后系统比较干净,JDK 可以直接安装,系统不会自带 JAVA 相关的组件

RPM 版的安装方式

1
rpm -ivh jdk-8u144-linux-x64.rpm

安装完成后修改系统环境变量,这里一次性配齐了

1
vim /etc/profile
1
2
3
4
5
6
7
8
9
10
# 将下面这些配置在profile文件的末尾
export HBASE_HOME=/root
export HIVE_HOME=
export HADOOP_HOME=
export ZOOKEEPER_HOME=
export SCALA_HOME=
export SPARK_HOME=
export JAVA_HOME=/usr/java/jdk1.8.0_144
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$HIVE_HOME/bin:$ZOOKEEPER_HOME/bin:$SCALA_HOME/bin:$SPARK_HOME/bin:$HBASE_HOME/bin

修改完成后保存退出,并执行下面的命令生效

1
source /etc/profile

测试 jdk 是否安装成功

1
java -version

出现下图表示没有问题

2.7 Hadoop

解压 hadoop 安装包

1
2
cd /opt
tar -zxvf hadoop-2.7.4.tar.gz -C /root/

进入 hadoop 目录,新建 3 个文件夹

1
2
cd /root/hadoop-2.7.4
mkdir data name tmp

进入配置文件目录,开始配置

1
cd etc/hadoop

hadoop-env.sh

1
vim hadoop-env.sh

core-site.xml

1
vim core-site.xml
1
2
3
4
5
6
7
8
9
<property>
<name>fs.defaultFS</name>
<value>hdfs://data:9000</value>
</property>

<property>
<name>hadoop.tmp.dir</name>
<value>file:/root/hadoop-2.7.4/etc/hadoop/tmp</value>
</property>

hdfs-site.xml

1
vim hdfs-site.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/root/hadoop-2.7.4/name</value>
</property>

<property>
<name>dfs.datanode.data.dir</name>
<value>file:/root/hadoop-2.7.4/data</value>
</property>

<property>
<name>dfs.replication</name>
<value>1</value>
</property>

yarn-site.xml

1
vim yarn-site.xml
1
2
3
4
5
6
7
8
<property>
<name>yarn.resourcemanager.hostname</name>
<value>data</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>

mapred-site.xml

1
2
cp mapred-site.xml.template mapred-site.xml
vim mapred-site.xml
1
2
3
4
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>

slaves

1
vim slaves

将里面唯一的一行 localhost 替换成 data,因为是单节点,所以它既是 NameNode 也是 DataNode

到这里配置完成,接下来启动 hadoop

环境变量已经配置好,可以直接使用命令。首次启动 HDFS 需要格式化

1
hadoop namenode -format

看到下图出现 hostname / IP 表明成功格式化

启动 HDFS,启动好后可以通过 web 的 50070 端口查看

1
start-dfs.sh

使用浏览器访问服务器的 50070 端口

我们在自己的电脑上可以配置 host,使得 data 指向服务器的 IP 地址,以后访问的时候就直接用 data 就可以,类似于域名的那种,而不用每次都敲 IP 地址

Windows 和 macOS 修改 host 的方法不同,如果是 mac 的小伙伴推荐使用一个工具叫做 SwitchHost

如何验证自己的电脑 host 有没有配置好呢?在本机使用如下命令,实际上它会在 host 中找到对应的 IP 地址,如果和服务器一致就表明没有问题

1
ping data

在服务器上,使用 jps 命令看一下当前运行的 java 进程

可以看到出现了 NameNode、DataNode 以及 SecondaryNameNode,表明 HDFS 在正常工作

下面我们简单测试一下 HDFS,需要先准备一个测试文件 hello.txt,里面自己随便写一些内容

这时候也可以通过 web 的 50070 端口查看 HDFS 上的文件列表,上面已经出现了刚刚上传的 hello.txt 文件,可以下载下来比对一下内容和刚开始自己写入的内容是否一致


接下来按下面的命令启动 YARN,启动好后可以通过 8088 端口查看

1
start-yarn.sh

在 web 界面里面可以查看 YARN 的详细信息,例如资源情况,任务详情等

到这里再次执行 jps 命令,查看启动的进程

1
jps

相比之前,多了 ResourceManager 和 NodeManager,这正是 YARN 的资源管理组件

这里也简单测试一下 YARN,跑一个 Hadoop 自带的 example 中的任意一个 MapReduce 作业,我们以 pi 为例

1
2
cd /root/hadoop-2.7.4/share/hadoop/mapreduce
hadoop jar hadoop-mapreduce-examples-2.7.4.jar pi 6 6

第二条命令运行完以后会出现如下结果,简单解释一下:example 那个 jar 包里面有很多的官方自带的例子,其中 pi 是其中一个,它用来计算圆周率的值,最后的两个 6 是两个参数,理论上值越大最后求出的 pi 的精度越高,读者可以修改最后的两个值改的大一些,看看结果有什么不同

另外在任务运行的过程中可以通过 8088 端口查看 YARN 的监控数据,其中会显示当前执行的任务的详情

在任务的执行过程中不断使用 jps 命令查看进程情况

首先是出现了 RunJar

然后出现了 MRAppMaster

最后出现了多个 YarnChild

任务结束后在 web 上可以看到这个任务的详情

Scala

下面我们安装 Scala,它是一种运行在 JVM 上的编程语言,Spark 就是用 scala 开发的

1
2
cd /opt
tar -zxvf scala-2.11.8.tgz -C /root/

修改配置文件

1
vim /etc/profile
1
export SCALA_HOME=/root/scala-2.11.8

修改完成后 source 一下使之生效

1
source /etc/profile

测试一下,出现 scala 的版本证明安装完成

Spark

解压安装包

1
2
cd /opt
tar -zxvf spark-2.1.1-bin-hadoop2.7.tgz -C /root/

配置环境变量

1
vim /etc/profile

生效

1
source /etc/profile

进入 Spark 配置目录

1
cd /root/spark-2.1.1-bin-hadoop2.7/conf

spark-env.sh

1
2
cp spark-env.sh.template spark-env.sh
vim spark-env.sh
1
2
3
4
5
6
7
8
# 最后增加
export JAVA_HOME=/usr/java/jdk1.8.0_144
export HADOOP_HOME=/root/hadoop-2.7.4
export HADOOP_CONF_DIR=/root/hadoop-2.7.4/etc/hadoop
export SCALA_HOME=/root/scala-2.11.8
SPARK_MASTER_IP=data
SPARK_LOCAL_DIRS=/root/spark-2.1.1-bin-hadoop2.7
SPARK_DRIVER_MEMORY=2G

slaves:将原来的内容删掉,增加一行 data

1
2
cp slaves.template slaves
vim slaves

启动 Spark

Spark 目录下的 sbin 目录是启动和停止 spark 相关组件的命令,但是它和 Hadoop 的 sbin 目录下的脚本在命名上有些是一致的(比如 start-all.sh),所以没有把 Spark 的 sbin 目录加入的系统的环境变量中

1
2
cd /root/spark-2.1.1-bin-hadoop2.7/sbin
./start-all.sh

这时候使用 jps 命令查看进程,可以发现多了 WorkerMaster

测试:由于测试的命令比较长,新建一个脚本文件

1
vim test_spark.sh
1
2
3
4
5
6
7
8
# 增加如下内容
spark-submit \
--class org.apache.spark.examples.SparkPi \
--num-executors 1 \
--driver-memory 1G \
--executor-memory 1G \
--executor-cores 1 \
/root/spark-2.1.1-bin-hadoop2.7/examples/jars/spark-examples_2.11-2.1.1.jar

添加执行权限

1
chmod 777 test_spark.sh

执行

1
./test_spark.sh

在众多的控制台日志中找到 Pi is rough 3.141xxxx 说明一切是 OK 的