0%

从零部署 Spark 集群

准备工作

服务器相关设置

三台服务器节点,采用一主二从的模式,需要修改主机名并建立服务器间的 ssh 通信便于各服务器间免密访问以及 scp 命令分发文件。

host相关设置

执行vi /etc/hostname修改主机名,主节点命名为master,从节点命名为slave01和slave02,执行reboot重启服务器生效。

三台服务器都修改/etc/hosts文件,IP地址为内网IP。

1
2
3
192.168.10.6 master
192.168.10.7 slave01
192.168.10.8 slave02

配置ssh免密通信

普通用户登录后,执行sudo passwd root修改root密码,su root切换为root用户。

修改 ssh 配置文件 /etc/ssh/sshd_config,允许root登录。

1
2
3
PermitRootLogin yes
RSAAuthentication yes
PubkeyAuthentication yes

/root目录下执行如下命令,生成.ssh文件夹和公钥私钥。

1
ssh-keygen -t rsa

将三台服务器以及客户端主机的公钥复制到三台服务器的/root/.ssh/authorized_keys文件中。并重启ssh服务。

1
service sshd restart

现在已完成了服务器间 ssh 免密通信的功能,可以通过 scp 命令将文件从客户端主机分发到各个服务器,以及从主节点服务器分发到从节点服务器。scp 命令使用格式如下:

1
scp ~/Downloads/jdk-8u144-linux-x64.tar.gz root@master:/opt

接下来按照步骤依次安装 JDK、Hadoop和Spark。均安装在 /opt 目录下,并分别命名为 jdk8、hadoop、spark。

安装软件包

将下载好的 JDK、Hadoop和Spark 的软件安装包分发到主节点的/opt路径下,解压并改名。

1
2
3
tar -xzvf jdk-8u144-linux-x64.tar.gz
mv jdk1.8.0_144/ jdk8
mv jdk-8u144-linux-x64.tar.gz /tmp

同理,解压hadoop和spark压缩包至 /opt 路径下,改名为hadoop和spark,然后将整个 /opt 文件夹从主节点分发给从节点。

配置环境变量

修改服务器环境变量配置文件 /etc/profile

1
2
3
4
5
6
export JAVA_HOME=/opt/jdk8
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export HADOOP_HOME=/opt/hadoop
export SPARK_HOME=/opt/spark
export PATH=${JAVA_HOME}/bin:$HADOOP_HOME/sbin:$HADOOP_HOME/bin:$SPARK_HOME/bin:$SPARK_HOME/sbin:$PATH

可以直接将修改后的配置文件分发给从节点。

1
2
scp /etc/profile root@slave01:/etc/profile
scp /etc/profile root@slave02:/etc/profile

三台服务器都需执行 source /etc/profile 命令,使配置文件生效。

配置Hadoop

Hadoop支持为所有主从节点采用同一套配置文件,除非新机器的硬件规格与现有机器不同时,需要一套新的配置文件以充分利用新硬件的额外资源。官网配置文档

  • HDFS(Hadoop分布式文件系统):启动HDFS时主节点启动NameNode,负责管理namespace、控制客户端访问。从节点启动DataNode,提供存储和客户端读写操作。
  • Hadoop YARN(资源管理系统):用于改善MapReduce的实现,启动Yarn时主节点启动ResourceManager,用于调度、分发资源。从节点启动NodeManager,用于启动、监控运行应用程序的容器。

cd /opt/hadoop/etc/hadoop,前往hadoop配置文件目录。

vi hadoop-env.sh,修改运行hadoop时的环境变量。

1
2
3
export JAVA_HOME=/opt/jdk8
export HADOOP_HEAPSIZE=8000
export HADOOP_LOG_DIR=/var/log/hadoop

vi core-site.xml,该属性描述了HDFS文件系统的URI,默认端口是8020。

1
2
3
4
5
6
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value>
</property>
</configuration>

vi hdfs-site.xml,Hadoop守护进程配置,包括Namenode、辅助NameNode和DataNode等。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<configuration>
<property>
<name>dfs.namenode.name.dir</name>
<value>/root/hdfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/root/hdfs/data</value>
</property>
<property>
<name>dfs.namenode.checkpoint.dir</name>
<value>/root/hdfs/namesecondary</value>
</property>
</configuration>

分别配置了namenode存储永久性文件系统元数据的目录、datanode存储数据块目录、辅助namenode存储文件系统的检查点目录。均可冗余备份,逗号隔开。

vi yarn-site.xml,Yarn守护进程的配置项,包括资源管理器、web应用代理服务器和节点管理器。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<configuration>
<!-Site specific YARN configuration properties -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>master</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>master:10000</value>
</property>
<property>
<name>yarn.nodemanager.local-dirs</name>
<value>/root/nm-local-dir</value>
</property>
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>8192</value>
</property>
<property>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>4</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce.shuffle</value>
</property>
</configuration>

vi slaves,在该文件中列出所有从节点的主机名或IP。

1
2
slave01
slave02

配置Spark

Apache Spark是专为大规模数据处理而设计的快速通用的计算引擎。它并没有以MapReduce作为执行引擎,而是使用的自己的分布式运行环境在集群上执行工作。Spark与Hadoop紧密集成,可以在Yarn上运行并支持HDFS。

cd /opt/spark/conf前往Spark配置文件目录。

拷贝模版文件。

1
2
cp spark-env.sh.template spark-env.sh
cp slaves.template slaves

vi slaves添加从节点。

1
2
slave01
slave02

vi spark-env.sh,配置spark启动环境脚本。

1
2
3
4
5
6
export JAVA_HOME=/opt/jdk8
export HADOOP_CONF_DIR=/opt/hadoop/etc/hadoop
export SPARK_MASTER_HOST=master
export SPARK_MASTER_PORT=7077
export SPARK_WORKER_CORES=1
export SPARK_WORKER_MEMORY=1g

vi spark-defaults.conf

1
2
spark.master                     spark://master:7077
spark.driver.memory 8g

启动和测试

以下操作均在主节点下完成,主节点会启动从节点的相关程序。

/root目录下新建存储文件夹,目录结构如下。

1
2
3
4
5
6
7
.
├── hdfs
│   ├── data
│   ├── name
│   └── namesecondary
└── nm-local-dir

分发给从节点。

1
2
3
4
scp -r hdfs/ root@slave01:/root/
scp -r hdfs/ root@slave02:/root/
scp -r nm-local-dir/ root@slave01:/root/
scp -r nm-local-dir/ root@slave02:/root/

现在JDK、Hadoop和Spark均已安装配置完成,将/opt文件夹分发给从节点。

1
2
scp -r /opt root@slave01:/
scp -r /opt root@slave02:/

启动hadoop

执行ufw disable关闭防火墙。

初始化文件系统

1
hdfs namenode -format

启动Hadoop集群(该命令其实是包含了start-dfs.shstart-yarn.sh两个命令)。

1
start-all.sh

在各节点上执行jps查看启动情况,日志文件在/opt/hadoop/logs目录下。

在本地浏览器上访问{IP}:/50070查看hdfs的WebUI(50070为默认端口);访问{IP}:/10000查看ResourceManager的WebUI。

启动Spark

启动Spark集群。

1
/opt/spark/sbin/start-all.sh

各节点执行jps可以看到主节点启动了Master程序,从节点启动了Worker程序。

可以在本地浏览器上访问{IP}:8080验证Spark已启动