justtreee / blog

31 stars 8 forks source link

【Spark学习笔记】Hadoop+Scala+Spark 分布式集群环境搭建 #6

Open justtreee opened 6 years ago

justtreee commented 6 years ago

硬件环境:3台搭载 Ubuntu14.04 的计算机。 一台Ubuntu主机系统作Master,一台Ubuntu主机系统做slave01,一台Ubuntu主机系统做slave02。三台主机机器处于同一局域网下。 所有环境配置与权限设置都是在各台Ubuntu下的pc用户下完成的,也可以专门为三台电脑创建一个用户(如hadoop)进行管理。

一、Hadoop 2.7 分布式环境搭建

在配置Spark之前,需要先配置Hadoop。

0. 初始设置

本小节的内容可以根据需要自己设定

本节内容:修改配置三台电脑的host。

为了更好的在Shell中区分三台主机,修改其显示的主机名,执行如下命令:

sudo vim /etc/hostname

在你想要当作主机(master)的电脑的/etc/hostname修改为如下内容:

master

同理,配置两台slave(此处只写了slave01):

slave01

重启之后,在终端shell中就会看到变化,说明配置成功。

之后在每台电脑上输入:

ifconfig

可以获得当前电脑的局域网地址。尝试一下这三台电脑之间能不能 ping 通。

ping 192.168.1.1

不一定是192的本地地址,如果ip显示的是公网ip,那在之后的配置中要使用公网ip。

修改三台机器的/etc/hosts文件,添加三台电脑的host配置:

sudo vim /etc/hosts

配置类似如下:

127.0.0.1 localhost
192.168.1.1 master
192.168.1.2 slave01
192.168.1.3 slave02

1. 配置ssh无密码登录本机和访问集群机器

什么是SSH? 简单说,SSH是一种网络协议,用于计算机之间的加密登录。 如果一个用户从本地计算机,使用SSH协议登录另一台远程计算机,我们就可以认为,这种登录是安全的,即使被中途截获,密码也不会泄露。 最早的时候,互联网通信都是明文通信,一旦被截获,内容就暴露无疑。1995年,芬兰学者Tatu Ylonen设计了SSH协议,将登录信息全部加密,成为互联网安全的一个基本解决方案,迅速在全世界获得推广,目前已经成为Linux系统的标准配置。

三台主机电脑分别运行如下命令,测试能否连接到本地localhost

ssh localhost

登录成功会显示如下结果:

Last login: Mon Nov 17 18:29:55 2017 from ::1

如果不能登录本地,请运行如下命令,安装openssh-server,并生成ssh公钥。

sudo apt-get openssh-serverssh-keygen -t rsa -P ""cat $HOME/.ssh/id_rsa.pub >> $HOME/.ssh/authorized_keys

在保证了三台主机电脑都能连接到本地localhost后,还需要让master主机免密码登录slave01和slave02主机。在master执行如下命令,将master的id_rsa.pub传送给两台slave主机。(下文的pc可以被替换为自定义的用户名)

scp ~/.ssh/id_rsa.pub pc@slave01:/home/pc/
scp ~/.ssh/id_rsa.pub pc@slave02:/home/pc/

在slave01,slave02主机上分别运行 ls 命令,可以看到他们分别接收到了 id_rsa.pub 文件。 接着在slave01、slave02主机上将master的公钥加入各自的节点上,在slave01和slave02执行如下命令:

cat ~/id_rsa.pub >> ~/.ssh/authorized_keysrm ~/id_rsa.pub
rm ~/id_rsa.pub

如果master主机和slave01、slave02主机的用户名一样,那么在master主机上直接执行如下测试命令,即可让master主机免密码登录slave01、slave02主机。

ssh slave01

这样我们可以在master这台电脑上对两台slave进行操作,就不用跑来跑去啦。 2017-11-17 17_14_26

2. JDK和Hadoop的安装配置

分别在master主机和slave01、slave02主机上安装JDK和Hadoop,并加入环境变量。

安装 JDK

JDK可以直接使用一行命令 sudo apt-get install default-jdk 就能获取,但是使用这种方法会在之后的Hadoop启动过程中因无法找到一些Java方法而报错(至少我在报错上是这么看到的)。之后我换用 JDK 8【链接】才成功。这里给上安装配置方法。

分别在master主机和slave01,slave02主机上执行安装JDK的操作:

下载完成后:

sudo tar -zxf ~/下载/jdk-8u151-linux-x64.tar.gz -C /usr/local/
cd /usr/local
sudo mv ./jdk-8u151-linux-x64.tar.gz/ ./java
sudo chown -R pc ./java

编辑~/.bashrc文件:

vim ~/.bashrc

添加如下内容:

export JAVA_HOME=/usr/local/java/jdk1.8.0_151

接着让环境变量生效,执行如下代码:

source ~/.bashrc

查看是否成功配置:

java -version

安装 Hadoop

先在master主机上做安装Hadoop(选择下载hadoop-2.7.4),暂时不需要在slave01,slave02主机上安装Hadoop.稍后会把master配置好的Hadoop发送给slave01,slave02. 在master主机执行如下操作:

sudo tar -zxf ~/下载/hadoop-2.7.4.tar.gz -C /usr/local    # 解压到/usr/local中
cd /usr/local/
sudo mv ./hadoop-2.7.4/ ./hadoop            # 将文件夹名改为hadoop
sudo chown -R pc ./hadoop       # 修改文件权限

编辑~/.bashrc文件:

vim ~/.bashrc

添加如下内容:

export HADOOP_HOME=/usr/local/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

接着让环境变量生效,执行如下代码:

source ~/.bashrc

3. Hadoop集群配置

修改master主机修改Hadoop如下配置文件,这些配置文件都位于 /usr/local/hadoop/etc/hadoop 目录下。

  1. slaves 这里把DataNode的主机名写入该文件,每行一个。这里让master节点主机仅作为NameNode使用。
    slave01
    slave02
  2. core-site.xml
    <configuration>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>file:/usr/local/hadoop/tmp</value><!-- <value>file:/usr/local/hadoop/tmp</value> -->
        <description>Abase for other temporary directories.</description>
    </property>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://master:9000</value>
    </property>
    </configuration>
  3. hdfs-site.xml
    <configuration>
    <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/name</value>
    </property>
    </configuration>
  4. mapred-site.xml(复制mapred-site.xml.template,再修改文件名)
    <configuration>
    <property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
    </property>
    </configuration>
  5. yarn-site.xml
    
    <configuration>
yarn.nodemanager.aux-services mapreduce_shuffle yarn.resourcemanager.hostname master


配置好后,将 master 上的 `/usr/local/hadoop` 文件夹复制到各个节点上。之前有跑过伪分布式模式,建议在切换到集群模式前先删除之前的临时文件。在 master 节点主机上执行:

cd /usr/local/ rm -rf ./hadoop/tmp # 删除临时文件 rm -rf ./hadoop/logs/* # 删除日志文件 tar -zcf ~/hadoop.master.tar.gz ./hadoop cd ~ scp ./hadoop.master.tar.gz slave01:/home/pc scp ./hadoop.master.tar.gz slave02:/home/pc


在slave01,slave02节点上执行:

sudo rm -rf /usr/local/hadoop/ sudo tar -zxf ~/hadoop.master.tar.gz -C /usr/local sudo chown -R pc /usr/local/hadoop


## 4. 启动Hadoop集群测试
在master主机上执行如下命令:

cd /usr/local/hadoop bin/hdfs namenode -format sbin/start-all.sh

运行后,在master,slave01,slave02运行jps命令,查看:

jps


master运行jps后,slave01、slave02运行jps,如下图:
![2017-11-30 15_04_34](https://user-images.githubusercontent.com/15559340/33426510-0d35bb04-d5fd-11e7-89a2-98afde06ed1c.png)

在这里,master一定要看到`NameNode`,slave要看到`DataNode`,不然不算成功。我在配置的时候遇见了这个问题,我是这么解决的:
[Hadoop启动不了Namenode进程](http://blog.csdn.net/haixzzy/article/details/17241381)
最终的**core-site.xml**和**hdfs-site.xml**配置内容就在上文。

# 二、 Scala 配置
我选择的是[scala-2.12.4](http://www.scala-lang.org/download/),我们把它安装在与Java和Hadoop相同的路径下。

首先在master主机下安装,之后ssh至两个分机。

sudo tar -zxf ~/下载/scala-2.12.4.tgz -C /usr/local # 解压到/usr/local中 cd /usr/local/ sudo mv ./scala-2.12.4/ ./scala # 将文件夹名改为scala sudo chown -R pc ./scala # 修改文件权限

编辑~/.bashrc文件:

vim ~/.bashrc

添加如下内容:

export SCALA_HOME=/usr/local/scala export PATH=$PATH:$SCALA_HOME/bin

接着让环境变量生效,执行如下代码:

source ~/.bashrc


检测安装是否成功

scala -version


将 master 上的 `/usr/local/scala` 文件夹复制到各个节点上。在 master 节点主机上执行:

cd /usr/local/ tar -zcf ~/hadoop.master.tar.gz ./scala cd ~ scp ./scala.master.tar.gz slave01:/home/pc scp ./scala.master.tar.gz slave02:/home/pc

在slave01,slave02节点上执行:

sudo tar -zxf ~/scala.master.tar.gz -C /usr/local sudo chown -R pc /usr/local/scala


最后记得在slave上**配置环境变量**,检查是否安装成功。

scala -version


# 三、 Spark 2.2 分布式环境搭建

## 1. 下载安装
在master节点上,[下载spark](http://spark.apache.org/downloads.html),如下图:
![1](https://user-images.githubusercontent.com/15559340/32947716-52ff4aea-cbd7-11e7-93fa-8970545b9e03.PNG)

下载完成后,执行如下命令:

sudo tar -zxf ~/下载/spark-2.2.0-bin-hadoop2.7.tgz -C /usr/local/ cd /usr/local sudo mv ./spark-2.2.0-bin-hadoop2.7.tgz/ ./spark sudo chown -R pc ./spark


## 2. 配置环境变量

在master节点主机的终端中执行如下命令:

vim ~/.bashrc

在`~/.bashrc`添加如下配置:

export SPARK_HOME=/usr/local/spark export PATH=$PATH:$SPARK_HOME/bin:$SPARK_HOME/sbin

记得生效:

source ~/.bashrc


## 3. Spark 配置

把master 作为 Master 节点,两个slave01、slave02作为Worker节点。
在master节点主机上进行如下操作:

1. slaves
将 slaves.template 拷贝到 slaves

cd /usr/local/spark/ cp ./conf/slaves.template ./conf/slaves

slaves文件设置Worker节点。编辑slaves内容,把默认内容localhost替换成如下内容:

slave01 slave02

2. spark-env.sh
将 spark-env.sh.template 拷贝到 spark-env.sh

cp ./conf/spark-env.sh.template ./conf/spark-env.sh


编辑spark-env.sh,添加如下内容:

export SPARK_DIST_CLASSPATH=$(/usr/local/hadoop/bin/hadoop classpath) export HADOOP_CONF_DIR=/usr/local/hadoop/etc/hadoop

export SPARK_MASTER_IP=master export SPARK_LOCAL_IP=172.16.121.12

export SPARK_MASTER_IP=172.16.121.12

export JAVA_HOME=/usr/local/java/jdk1.8.0_151 export JRE_HOME=${JAVA_HOME}/jre export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib export PATH=${JAVA_HOME}/bin:$PATH

export SCALA_HOME=/usr/local/scala


SPARK_MASTER_IP 指定 Spark 集群 master 节点的 IP 地址;

配置好后,将master主机上的/usr/local/spark文件夹复制到各个节点上。在master主机上执行如下命令:

cd /usr/local/ tar -zcf ~/spark.master.tar.gz ./spark cd ~ scp ./spark.master.tar.gz slave01:/home/pc scp ./spark.master.tar.gz slave02:/home/pc

在slave01,slave02节点上执行:

sudo rm -rf /usr/local/spark/ sudo tar -zxf ~/spark.master.tar.gz -C /usr/local sudo chown -R hadoop /usr/local/spark


## 4. 启动Spark集群

### 启动Hadoop集群
启动Spark集群前,要先启动Hadoop集群。在master节点主机上运行如下命令:

cd /usr/local/hadoop/ sbin/start-all.sh


### 启动Spark集群
1. 启动master节点
在master节点主机上运行如下命令:

cd /usr/local/spark/ sbin/start-master.sh

在master节点上运行`jps`命令,可以看到多了个Master进程:
![2017-11-30 15_00_43](https://user-images.githubusercontent.com/15559340/33426224-10a67702-d5fc-11e7-8051-d14e6adacac3.png)

2. 启动所有slave节点
在master节点主机上运行如下命令:

cd /usr/local/spark/ sbin/start-slaves.sh

分别slave01、slave02节点上运行`jps`命令,可以看到多了个Worker进程:

![2017-11-30 15_00_58](https://user-images.githubusercontent.com/15559340/33426233-157083e0-d5fc-11e7-8258-ac3ba58cc86a.png)

3. 在浏览器上查看独立集群管理器Spark集群信息
在master主机上打开浏览器,访问[http://master:8080](http://master:8080),如下图:
![2017-11-17 17_11_48](https://user-images.githubusercontent.com/15559340/33426238-1b132f64-d5fc-11e7-940f-81d3dfcb4aa3.png)

如果在浏览器下看不到worker,可以参考[这篇文章](http://www.xmanblog.net/2017/04/12/spark-worker-connot-connect/)
简单总结一下博客就是:删掉`hosts`里面的`127.0.0.1 localhost`。
其中的`spark-env.sh`已在上文给出。

之后在master的终端中输入`spark-shell`就可以进入,看到spark的字符画。

## 5. 关闭 Spark 集群
关闭master节点

sbin/stop-master.sh

关闭worker节点

sbin/stop-slaves.sh

关闭Hadoop集群

cd /usr/local/hadoop/ sbin/stop-all.sh