搭建Spark集群
创建hadoop用户
#添加用户hadoop
adduser hadoop
这个过程中需要输入密码两次
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
看到最后的字样就代表新建hadoop用户成功.
如果需要删除用户,使用下面的命令
userdel hadoop
把hadoop用户加入sudo用户组,编辑/etc/sudoers
文件
sudo vi /etc/sudoers
然后在
root ALL=(ALL) ALL
后面加入
hadoop ALL=(ALL) ALL
注: 两个用户创建命令之间的区别
adduser: 会自动为创建的用户指定主目录、系统shell版本,会在创建时输入用户密码。
useradd:需要使用参数选项指定上述基本设置,如果不使用任何参数,则创建的用户无密码、无主目录、没有指定shell版本。
下载所需要用到的工具包,并上传到hadoop用户目录
需要用到的工具包包括java
,hadoop
,scala
,spark
,.
这里我使用的各工具包的版本为
名称 | 版本号 |
---|---|
Java | jdk-8u161-linux-x64.tar.gz |
hadoop | hadoop-3.0.0.tar.gz |
scala | scala-2.11.8.tgz |
spark | spark-2.3.0-bin-hadoop2.7.tgz |
这里我们先在其中一台机器上安装所有的工具包,然后使用scp
命令将配置好的工具包同步到其余的服务器.
为了方便,我这里是先在windows机器上用FDM把所有的软件工具包下载好,然后使用ftp推送到服务器上的,由于是内网环境,所有上传带宽还不错,很快就上传完成了!
具体如下:
注解:类似的工具有rsync;scp消耗资源少,不会提高多少系统负荷,在这一点上,rsync就远远不及它了。rsync比scp会快一点,但当小文件多的情况下,rsync会导致硬盘I/O非常高,而scp基本不影响系统正常使用。
安装java
注:包括下面的
spark
,hadoop
和scala
我都放在/usr/local
目录,这是个人习惯问题,你也可以放在其他目录
解压并移动至/us/local
目录
tar -zxvf jdk-8u161-linux-x64.tar.gz
mv jdk1.8.0_161 /usr/local
设置环境变量
export JAVA_HOME=/usr/local/jdk1.8.0_161
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$JAVA_HOME/bin:$PATH
安装hadoop
解压并移动至/us/local
目录
tar -zxvf hadoop-3.0.0.tar.gz
mv hadoop-3.0.0 /usr/local
设置环境变量
export HADOOP_HOME=/usr/local/hadoop-3.0.0
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib/native"
export PATH=$HADOOP_HOME/bin:$PATH
export PATH=$HADOOP_HOME/sbin:$PATH
安装scala
解压并移动至/us/local
目录
tar -zxvf scala-2.11.8.tgz
mv scala-2.11.8 /usr/local
设置环境变量
export SCALA_HOME=/usr/local/scala-2.11.8
export PATH=$SCALA_HOME/bin:$PATH
安装spark
解压并移动至/us/local
目录
tar -zxvf spark-2.3.0-bin-hadoop2.7.tgz
mv spark-2.3.0-bin-hadoop2.7 /usr/local
设置环境变量
export SPARK_HOME=/usr/local/spark-2.3.0-bin-hadoop2.7
export PATH=$SPARK_HOME/bin:$PATH
复制所有的环境变量到~/.profile
export JAVA_HOME=/usr/local/jdk1.8.0_161
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$JAVA_HOME/bin:$PATH
export SCALA_HOME=/usr/local/scala-2.11.8
export PATH=$SCALA_HOME/bin:$PATH
export SPARK_HOME=/usr/local/spark-2.3.0-bin-hadoop2.7
export PATH=$SPARK_HOME/bin:$PATH
export HADOOP_HOME=/usr/local/hadoop-3.0.0
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib/native"
export PATH=$HADOOP_HOME/bin:$PATH
export PATH=$HADOOP_HOME/sbin:$PATH
然后执行
source ~/.profile
注:如果这里不配置的话,在hadoop3.0.0下面会出现以下的错误
虽然里面的
JAVA_HOME /usr/local/jdk-8u161-linux-x64
这个是因为我设错了,就因为这个我还排查了大半天,结果在这里还用上了,汗.....
报错:pc: ERROR: JAVA_HOME is not set and could not be found.
在hadoop-env.sh中,再显示地重新声明一遍JAVA_HOME,添加:
export JAVA_HOME=/usr/local/jdk1.8.0_161
配置集群服务器参数
我们这里用到的是三台服务器,一台master,两台slave.三台机器的名称和ip如下:
主机名称 | ip地址 |
---|---|
master | 10.141.211.80 |
slave01 | 10.141.211.81 |
slave02 | 10.141.211.82 |
三台电脑主机的用户名均为hadoop.
三台机器可以ping双方的ip来测试三台电脑的连通性。
在master节点主机上的Shell中运行如下命令,测试能否连接到slave01节点主机
# -c 后面接的参数代表ping操作执行的次数
ping 10.141.211.81 -c 3
如果出现如下图,说明连接成功
为了更好的在Shell中区分三台主机,修改其显示的主机名,执行如下命令
sudo vim /etc/hostname
master的/etc/hostname添加如下配置:
master
同样slave01的/etc/hostname添加如下配置:
slave01
同样slave02的/etc/hostname添加如下配置:
slave02
注:如果已经hostname文件中已经存在名称,则删除原有的名称
重启三台电脑,重启后在终端Shell中才会看到机器名的变化,如下图:
修改三台机器的/etc/hosts文件,添加同样的配置:
sudo vim /etc/hosts
配置如下:
127.0.0.1 localhost master
127.0.1.1 master #相应的改为slave01,或slave02
10.141.211.80 master
10.141.211.81 slave01
10.141.211.82 slave02
注:
127.0.0.1 localhost master
这里增加master
是为了这里是为了解决sudo: unable to resolve host slave01: Connection refused
配置ssh免密码登陆
先测试一下是否可以通过ssh登录本机
ssh localhsot
如果输入密码之后,登录成功,则代表可行,直接下一步配置免密码即可.否则,需要下载openssh-server
#通过apt下载ssh-verser
sudo apt install openssh-server -y
然后重复上面的验证过程.
接下来配置免密码登录
- 用
ssh-keygen
创建公钥
ssh-keygen -t rsa
输入后,会提示创建.ssh/id_rsa、id_rsa.pub的文件,其中第一个为密钥,第二个为公钥。过程中会要求输入密码,为了ssh访问过程无须密码,可以直接回车 。
- 复制公钥到authrized_keys文件中
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
在保证了三台主机电脑都能连接到本地localhost后,还需要让master主机免密码登录slave01和slave02主机。在master执行如下命令,将master的id_rsa.pub传送给两台slave主机。
scp ~/.ssh/id_rsa.pub hadoop@slave01:/home/hadoop/
scp ~/.ssh/id_rsa.pub hadoop@slave02:/home/hadoop/
在slave01,slave02主机上分别运行ls命令
ls ~
可以看到slave01、slave02主机分别接收到id_rsa.pub文件
接着在slave01、slave02主机上将master的公钥加入各自的节点上,在slave01和slave02执行如下命令:
cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
rm ~/id_rsa.pub
如果master主机和slave01、slave02主机的用户名一样,那么在master主机上直接执行如下测试命令,即可让master主机免密码登录slave01、slave02主机。
ssh slave01
如果master主机和slave01主机的用户名不一样,还需要在master修改~/.ssh/config文件,如果没有此文件,自己创建文件。
Host master
user Ruanrc
Host slave01
user hadoop
然后master主机再执行免密码登录:
ssh slave01
Hadoop集群配置
修改master主机修改Hadoop如下配置文件,这些配置文件都位于/usr/local/hadoop-3.0.0/etc/hadoop目录下。
workers(hadoop3.0.0中将slaves文件改为了workers文件)
这里把DataNode的主机名写入该文件,每行一个。这里让master节点主机仅作为NameNode使用。
slave01
slave02
注:这里需要删除workers文件中原来的
localhost
core-site.xml
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/usr/local/hadoop-3.0.0/tmp</value>
<description>Abase for other temporary directories.</description>
</property>
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value>
</property>
</configuration>
hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.name.dir</name>
<value>file:/home/hadoop/hadoop/namenode</value>
</property>
<property>
<name>dfs.data.dir</name>
<value>file:/home/hadoop/hadoop/datanode</value >
</property>
</configuration>
mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
yarn-site.xml
<configuration>
<!-- Site specific YARN configuration properties -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>master</value>
</property>
</configuration>
注:以上修改的文件需要在所有slave服务器上同步,使用前面的scp命令即可
同步配置文件
scp etc/hadoop/workers hadoop@slave01:/usr/local/hadoop-3.0.0/etc/hadoop
scp etc/hadoop/workers hadoop@slave02:/usr/local/hadoop-3.0.0/etc/hadoop
scp etc/hadoop/core-site.xml hadoop@slave01:/usr/local/hadoop-3.0.0/etc/hadoop
scp etc/hadoop/core-site.xml hadoop@slave02:/usr/local/hadoop-3.0.0/etc/hadoop
scp etc/hadoop/hdfs-site.xml hadoop@slave01:/usr/local/hadoop-3.0.0/etc/hadoop
scp etc/hadoop/hdfs-site.xml hadoop@slave02:/usr/local/hadoop-3.0.0/etc/hadoop
scp etc/hadoop/mapred-site.xml hadoop@slave01:/usr/local/hadoop-3.0.0/etc/hadoop
scp etc/hadoop/mapred-site.xml hadoop@slave02:/usr/local/hadoop-3.0.0/etc/hadoop
scp etc/hadoop/yarn-site.xml hadoop@slave01:/usr/local/hadoop-3.0.0/etc/hadoop
scp etc/hadoop/yarn-site.xml hadoop@slave02:/usr/local/hadoop-3.0.0/etc/hadoop
启动hadoop集群
启动hadoop集群
在master主机上执行如下命令:
cd /usr/local/hadoop-3.0.0
hdfs namenode -format
start-all.sh
运行后,在master,slave01,slave02运行jps命令,查看:
jps
master运行jps后,如下图:
slave01运行jps后,如下图:
slave02运行jps后,如下图:
从上面的截图不难看出,master节点正常启动了namenode,slave01和slave02节点正常启动了datanode
spark集群配置
把spark作为master节点,两个slave01,slave02作为worker节点
在master节点主机上进行如下操作:
- 编辑slaves
将slaves.template copy到slaves
cd $SPARK_HOME/conf
cp slaves.template slaves
slaves文件设置Worker节点。编辑slaves内容,把默认内容localhost替换成如下内容:
slave01
slave02
- 编辑spark-env.sh
将 spark-env.sh.template 拷贝到 spark-env.sh
cp spark-env.sh.template spark-env.sh
编辑spark-env.sh,添加以下内容
export SPARK_DIST_CLASSPATH=$(/usr/local/hadoop-3.0.0/bin/hadoop classpath)
export HADOOP_CONF_DIR=/usr/local/hadoop-3.0.0/etc/hadoop
export SPARK_MASTER_IP=10.141.211.80
#参考我的另一篇文章,缺少该配置,会找不到worker节点
export SPARK_MASTER_HOST=10.141.211.80
SPARK_MASTER_IP 指定 Spark 集群 master 节点的 IP 地址;
配置好后,将master主机上的/usr/local/spark文件夹复制到各个节点上。
scp大法好!!!
启动spark集群
启动spark集群前,要先启动Hadoop集群。在master节点主机上运行如下命令:
$HADOOP_HOME/sbin/start-all.sh
启动spark集群
- 启动master节点
在master节点主机上运行如下命令:
$SPARK_HOME/sbin/start-master.sh
- 启动所有slave节点
在master节点主机上运行如下命令:
$SPARK_HOME/sbin/start-slaves.sh
报错:Spark 启动时,提示 JAVA_HOME not set
在sbin目录下的spark-config.sh 中添加对应的jdk 路径
export JAVA_HOME=/usr/local/jdk1.8.0_161
分别slave01、slave02节点上运行jps命令,可以看到多了个Worker进程
输入http://10.141.211.80:7077/即可查看网页端
40)