Open justtreee opened 6 years ago
硬件环境:3台搭载 Ubuntu14.04 的计算机。 一台Ubuntu主机系统作Master,一台Ubuntu主机系统做slave01,一台Ubuntu主机系统做slave02。三台主机机器处于同一局域网下。 所有环境配置与权限设置都是在各台Ubuntu下的pc用户下完成的,也可以专门为三台电脑创建一个用户(如hadoop)进行管理。
Master
slave01
slave02
pc
在配置Spark之前,需要先配置Hadoop。
本小节的内容可以根据需要自己设定。
本节内容:修改配置三台电脑的host。
为了更好的在Shell中区分三台主机,修改其显示的主机名,执行如下命令:
sudo vim /etc/hostname
在你想要当作主机(master)的电脑的/etc/hostname修改为如下内容:
/etc/hostname
master
同理,配置两台slave(此处只写了slave01):
重启之后,在终端shell中就会看到变化,说明配置成功。
之后在每台电脑上输入:
ifconfig
可以获得当前电脑的局域网地址。尝试一下这三台电脑之间能不能 ping 通。
ping
ping 192.168.1.1
不一定是192的本地地址,如果ip显示的是公网ip,那在之后的配置中要使用公网ip。
修改三台机器的/etc/hosts文件,添加三台电脑的host配置:
/etc/hosts
sudo vim /etc/hosts
配置类似如下:
127.0.0.1 localhost 192.168.1.1 master 192.168.1.2 slave01 192.168.1.3 slave02
什么是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执行如下命令:
ls
id_rsa.pub
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进行操作,就不用跑来跑去啦。
分别在master主机和slave01、slave02主机上安装JDK和Hadoop,并加入环境变量。
JDK可以直接使用一行命令 sudo apt-get install default-jdk 就能获取,但是使用这种方法会在之后的Hadoop启动过程中因无法找到一些Java方法而报错(至少我在报错上是这么看到的)。之后我换用 JDK 8【链接】才成功。这里给上安装配置方法。
sudo apt-get install default-jdk
分别在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
先在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 # 修改文件权限
export HADOOP_HOME=/usr/local/hadoop export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
修改master主机修改Hadoop如下配置文件,这些配置文件都位于 /usr/local/hadoop/etc/hadoop 目录下。
/usr/local/hadoop/etc/hadoop
slave01 slave02
<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>
<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>
<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration>
<configuration>
配置好后,将 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 # 修改文件权限
export SCALA_HOME=/usr/local/scala export PATH=$PATH:$SCALA_HOME/bin
检测安装是否成功
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
sudo tar -zxf ~/scala.master.tar.gz -C /usr/local sudo chown -R pc /usr/local/scala
最后记得在slave上**配置环境变量**,检查是否安装成功。
# 三、 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节点主机的终端中执行如下命令:
在`~/.bashrc`添加如下配置:
export SPARK_HOME=/usr/local/spark export PATH=$PATH:$SPARK_HOME/bin:$SPARK_HOME/sbin
记得生效:
## 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替换成如下内容:
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 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
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
一、Hadoop 2.7 分布式环境搭建
在配置Spark之前,需要先配置Hadoop。
0. 初始设置
本小节的内容可以根据需要自己设定。
为了更好的在Shell中区分三台主机,修改其显示的主机名,执行如下命令:
在你想要当作主机(master)的电脑的
/etc/hostname
修改为如下内容:同理,配置两台slave(此处只写了slave01):
重启之后,在终端shell中就会看到变化,说明配置成功。
之后在每台电脑上输入:
可以获得当前电脑的局域网地址。尝试一下这三台电脑之间能不能
ping
通。不一定是192的本地地址,如果ip显示的是公网ip,那在之后的配置中要使用公网ip。
修改三台机器的
/etc/hosts
文件,添加三台电脑的host配置:配置类似如下:
1. 配置ssh无密码登录本机和访问集群机器
三台主机电脑分别运行如下命令,测试能否连接到本地localhost
登录成功会显示如下结果:
如果不能登录本地,请运行如下命令,安装openssh-server,并生成ssh公钥。
在保证了三台主机电脑都能连接到本地localhost后,还需要让master主机免密码登录slave01和slave02主机。在master执行如下命令,将master的id_rsa.pub传送给两台slave主机。(下文的pc可以被替换为自定义的用户名)
在slave01,slave02主机上分别运行
ls
命令,可以看到他们分别接收到了id_rsa.pub
文件。 接着在slave01、slave02主机上将master的公钥加入各自的节点上,在slave01和slave02执行如下命令:如果master主机和slave01、slave02主机的用户名一样,那么在master主机上直接执行如下测试命令,即可让master主机免密码登录slave01、slave02主机。
这样我们可以在master这台电脑上对两台slave进行操作,就不用跑来跑去啦。
2. JDK和Hadoop的安装配置
分别在master主机和slave01、slave02主机上安装JDK和Hadoop,并加入环境变量。
安装 JDK
JDK可以直接使用一行命令
sudo apt-get install default-jdk
就能获取,但是使用这种方法会在之后的Hadoop启动过程中因无法找到一些Java方法而报错(至少我在报错上是这么看到的)。之后我换用 JDK 8【链接】才成功。这里给上安装配置方法。分别在master主机和slave01,slave02主机上执行安装JDK的操作:
下载完成后:
编辑~/.bashrc文件:
添加如下内容:
接着让环境变量生效,执行如下代码:
查看是否成功配置:
安装 Hadoop
先在master主机上做安装Hadoop(选择下载hadoop-2.7.4),暂时不需要在slave01,slave02主机上安装Hadoop.稍后会把master配置好的Hadoop发送给slave01,slave02. 在master主机执行如下操作:
编辑~/.bashrc文件:
添加如下内容:
接着让环境变量生效,执行如下代码:
3. Hadoop集群配置
修改master主机修改Hadoop如下配置文件,这些配置文件都位于
/usr/local/hadoop/etc/hadoop
目录下。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
sudo rm -rf /usr/local/hadoop/ sudo tar -zxf ~/hadoop.master.tar.gz -C /usr/local sudo chown -R pc /usr/local/hadoop
cd /usr/local/hadoop bin/hdfs namenode -format sbin/start-all.sh
jps
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 # 修改文件权限
vim ~/.bashrc
export SCALA_HOME=/usr/local/scala export PATH=$PATH:$SCALA_HOME/bin
source ~/.bashrc
scala -version
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
sudo tar -zxf ~/scala.master.tar.gz -C /usr/local sudo chown -R pc /usr/local/scala
scala -version
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
vim ~/.bashrc
export SPARK_HOME=/usr/local/spark export PATH=$PATH:$SPARK_HOME/bin:$SPARK_HOME/sbin
source ~/.bashrc
cd /usr/local/spark/ cp ./conf/slaves.template ./conf/slaves
slave01 slave02
cp ./conf/spark-env.sh.template ./conf/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
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
sudo rm -rf /usr/local/spark/ sudo tar -zxf ~/spark.master.tar.gz -C /usr/local sudo chown -R hadoop /usr/local/spark
cd /usr/local/hadoop/ sbin/start-all.sh
cd /usr/local/spark/ sbin/start-master.sh
cd /usr/local/spark/ sbin/start-slaves.sh
sbin/stop-master.sh
sbin/stop-slaves.sh
cd /usr/local/hadoop/ sbin/stop-all.sh