码迷,mamicode.com
首页 > 系统相关 > 详细

H01_Linux系统中搭建Hadoop和Spark集群

时间:2018-06-09 14:40:26      阅读:238      评论:0      收藏:0      [点我收藏+]

标签:client   dir   park   执行命令   org   避免   教程   本地   统一   

前言

  1.操作系统为Centos7

  2.所有操作都是使用root用户去操作。也可以使用其他用户,非root的话要注意操作的权限问题。

  3.安装的Hadoop版本是2.6.5,Spark版本是2.2.0,Scala的版本是2.11.8。因为我安装的Spark要同Hadoop搭配工作,所以需要注意他们之间的版本依赖关系。可以从spark官网上查询到spark运行需要的环境,如下:

技术分享图片

 

  4.需要的安装包:

技术分享图片

安装包下载地址:

  JDK: http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

  Hadoop2.6.5:http://archive.apache.org/dist/hadoop/common/hadoop-2.6.5/

  Scala2.11.8:https://www.scala-lang.org/download/all.html

  Spark2.2.0:http://archive.apache.org/dist/spark/spark-2.2.0/

 

1.集群基础环境配置

1.1集群规划:

 

IP

配置

Namenode

SecondaryNamenode

Datanode

ResourceManager

NodeManager

Master

Worker

Hadoop1

192.168.137.21

1G内存、1核

 

 

 

Hadoop2

192.168.137.22

1G内存、1核

 

 

 

 

Hadoop3

192.168.137.23

1G内存、1核

 

 

 

 

 

1.2增加ip和机器名称的映射关系(所有节点),且3个节点可以相互ping通。

技术分享图片

 

1.3所有节点关闭防火墙。

当然也可以不关闭防火墙,不过这样一来就得打开特定的端口了(比如50070/8088等)。不熟练的话建议还是先统一关闭防火墙。

查看防火墙状态命令:

systemctl status firewalld

关闭防火墙命令:

systemctl stop firewalld
systemctl disable firewalld

  

1.4 SSH免密登录设置(所有节点)

SSH免密登录设置参考:https://www.cnblogs.com/suhaha/p/9071216.html。通过配置,使得hadoop1、hadoop2、和hadoop3之间都可以相互免密登录(至少要使得hadoop1可以免密登录hadoop2和hadoop3)。

 

1.5配置NTP

这一步在测试环境中可有可无。生产环境的话,毕竟集群之间需要协同工作,几个节点之间的时间同步还是比较重要的。

集群中配置NTP可参考:http://www.cnblogs.com/suhaha/p/8552897.htm

 

1.6配置JDK(所有节点)

JDK的配置可参考博文:https://blog.csdn.net/qian_feifei/article/details/75195016

我安装的JDK1.8

技术分享图片

注:到这一步,基础环境算是配置好了,可以给各个节点做个快照,后面步骤出错了也可以快速恢复。

 

2.安装Hadoop

下面的2.1~2.2的步骤在所有节点上都要如此操作。我们先在hadoop1上做这些操作,然后在2.3步用scp命令将配置好的hadoop文件发送到hadoop2、hadoop3节点。

2.1解压安装包到/usr/local/目录下(hadoop1上操作)

命令:

tar -xvf hadoop-2.6.5.tar.gz -C /usr/local/

  技术分享图片

2.2进入到/usr/local/hadoop-2.6.5/etc/hadoop目录下,修改配置文件。(hadoop1上操作)

2.2.1修改hadoop-env.sh

在hadoop-env.sh中添加JAVA_HOME

如下:

技术分享图片

注:需根据实际java路径进行修改

 

2.2.2修改core-site.xml添加如下内容

<property>
    <name>fs.defaultFS</name>
    <value>hdfs://hadoop1:9000</value>
</property>

  技术分享图片

 

2.2.3修改hdfs-site.xml,添加如下内容

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

技术分享图片

注:该文件其实也可以保持默认,其他个性化操作比如有:

<property>
        <name>dfs.namenode.name.dir</name>
        <value> /bigdata/dfs/name</value>
        <description>需要创建相应的/bigdata/dfs/name目录</description>
</property>
<property>
        <name>dfs.datanode.data.dir</name>
        <value> /bigdata/dfs/data</value>
        <description>需要创建相应的/bigdata/data/name目录</description>
</property>
<property>
        <name>dfs.webhdfs.enabled</name>
        <value>true</value>
</property>

  

2.2.4修改yarn-site.xml,添加如下内容:

<property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
</property>
<property>
    <name>yarn.resourcemanager.address</name>
    <value>hadoop1:8032</value>
</property>
<property>
    <name>yarn.resourcemanager.scheduler.address</name>
    <value>hadoop1:8030</value>
</property>
<property>
    <name>yarn.resourcemanager.resource-tracker.address</name>
    <value>hadoop1:8031</value>
</property>
<property>
    <name>yarn.resourcemanager.admin.address</name>
    <value>hadoop1:8033</value>
</property>
<property>
    <name>yarn.resourcemanager.webapp.address</name>
    <value>hadoop1:8088</value>
</property>
<property>
    <name>yarn.nodemanager.pmem-check-enabled</name>
    <value>false</value>
</property>
<property>
    <name>yarn.nodemanager.vmem-check-enabled</name>
    <value>false</value>
</property>

  技术分享图片

注:

可以看到上面有许多端口的配置,网上很多文章的教程中是没有的,这是因为这些端口默认就是8032、8031这样,感觉没有必要显式地再次配置。

最开始我也没配,结果出错了,出错的情形表现为:通过主节点可以启动yarn集群,子节点上有NodeManager进程,但是,在http://192.168.137.22:8088/cluster/nodes页面却没有显示子节点的信息,同时在主节点上通过yarn node -list -all命令查看也没有子节点的信息。然后在nodemanager节点的相关日志日志文件里(/usr/local/hadoop-2.6.5/logs/yarn-root-nodemanager-hadoop2.log)有org.apache.hadoop.ipc.Client: Retrying connect to server: 0.0.0.0/0.0.0.0:8031异常,如下图一。我的理解是,因为没有在yarn-site.xml文件中没有显式地将这些端口配置出来的原因,导致子节点无法向主节点注册(Registered)——然后,从报错的信息看貌似是只要把8031端口配置上了就可以了,其实也不是so easy的……如果不配置其他端口,则提交yarn任务的时候依然会无限地卡在ACCEPTED状态上,卡在该状态上的日志我看不出问题来,但是确实把上面的端口都配置了之后就好了。

因此,最好是将这些端口都显式配置好!!!

图一:

技术分享图片

 

关于最后两项配置

yarn.nodemanager.pmem-check-enabled:是否启动一个线程检查每个任务正使用的物理内存量,如果任务超出分配值,则直接将其杀掉,默认是true

yarn.nodemanager.vmem-check-enabled:是否启动一个线程检查每个任务正使用的虚拟内存量,如果任务超出分配值,则直接将其杀掉,默认是true

因为我实验时给3台机器分配的资源都很少,所以必须得设置它们都为false,否则运行yarn程序的时候会报如下错误。

技术分享图片

报错是因为,执行程序时,yarn对于机器能分配的资源进行了检查,结果发现运行程序需要的资源超出了机器所能分配资源的上限,然后就粗错了。如果把上面两项设置为false,则运行程序时就不会去进行对应的资源检查了,此时虽然机器能分配的资源依然不足,但是yarn不会像之前那样立马把container干掉了,而是会花较长的时间才能把程序跑完。

 

2.2.5修改slaves,在slaves文件中写入如下内容:

hadoop2
hadoop3

技术分享图片

注:本次配置是hadoop1是管理节点,hadoop2和hadoop3是数据节点,如果如果想使得hadoop1既是管理节点又是数据节点,可以把hadoop1写到slaves文件中来。

 

2.3将hadoop1上配置好的hadoop文件分发到hadoop2和hadoop3节点上(hadoop1上操作)

命令:

scp -r /usr/local/hadoop-2.6.5 root@hadoop2:/usr/local/
scp -r /usr/local/hadoop-2.6.5 root@hadoop3:/usr/local/

  

2.4修改环境变量,在hadoop1上执行以下命令

命令:

vim /etc/profile

在文件中添加如下内容:

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

技术分享图片

 

用source /etc/profile命令使修改的环境变量生效,接着用which hdfs命令查看是否修改成功。

 技术分享图片

 

2.5配置完成,接着格式化hdfs

在主节点hadoop1上执行以下命令:

hdfs namenode -format

技术分享图片

技术分享图片

注:命令执行完之后从结果上很难看出是否格式化成功了,这时可以紧接着通过

echo $? 命令查看hdfs namenode -format命令是否执行成功。如下,如果输出0,则说明上一条执行成功。

 

2.6启动hdfs,在hadoop1上执行以下命令

cd /usr/local/hadoop-2.6.5/sbin
./start-dfs.sh

技术分享图片

 

2.7验证hdfs是否安装成功

方法一:

在主节点hadoop1上用jps命令可以看到SecondaryNameNode和NameNode进程:

技术分享图片

在任一子节点上用jps命令可以查看到DataNode进程

 技术分享图片

如此,可以认为,从主节点上可以成功启动hdfs集群了。

但是是否一定没有问题了呢?不一定。

我们知道,hadoop集群启动成功之后,子节点会定时向主节点发送心跳信息,主节点以此判断子节点的状态。所以,有时候即使我们通过主节点启动hadoop集群成功了,使用jps命令也能查询到相应的SecondaryNameNode、NameNode和DataNode进程——但如果由于某些原因,比如某个子节点的某个配置配错了,如我搭建时的情况是子节点的core-site.xml文件中fs.defaultFS项配置错了,或者是由于防火墙的原因,又或者是由于前面格式化次数太多了出问题导致子节点的cluster_id跟主节点的cluster_id不一致——导致子节点无法向主节点发送心跳信息,那么对主节点来说,该子节点就是dead的了。

于是,作为进一步验证的方法,是在主节点上使用hdfs dfsadmin -report来观察集群配置情况。如下:

技术分享图片

 

方法二:

通过本地浏览器查看192.168.137.21:50070,验证否部署成功

技术分享图片

注,一定要在页面看到所有子节点信息才算hdfs集群没有问题。

 

2.7启动yarnhadoop1上执行以下命令

cd  /usr/local/hadoop-2.6.5/sbin
./start-yarn.sh

技术分享图片

 

2.8验证yarn是否启动成功

方法一

用jps命令可以看到主节点上有ResourceManager进程

技术分享图片

在子节点上有NodeManager进程

技术分享图片

但是,同样还不能认为yarn集群就没有问题了,原因如2.2.4中所说的那样(即:可能由于某些原因,导致子节点在启动起来之后却无法向主节点注册)。因此,保险起见,应在主节点上再通过yarn node -list -all命令查看一下。如下:

技术分享图片

如上图,说明yarn启动成功。

如果像下图一那样,说明yarn集群是有问题的——这种时候如果提交了以yarn作为资源调度器的任务,则任务会永远卡在ACCEPTED状态(如下图二),这是因为此时yarn集群只剩下ResourceManager这个光杆司令了,没有资源可以给它调度,所以它会一直卡在分配资源的状态下,要命的是它会很顽强地一直不断地努力尝试分配资源,还不报错......

图一:

技术分享图片

图二:

技术分享图片

 

方法二:

通过本地浏览器访问192.168.137.21:8088,查看yarn是否正常工作

技术分享图片

如上图,在页面上能看到子节点的信息,说明yarn集群没有问题。如果像下图这样,说明你的yarn集群是有问题的。

 技术分享图片

 

 

3.安装Spark

Spark的安装跟hadoop(包括yarn)是相对独立的,即使是需要以Spark-on-yarn模式运行Spark程序。Spark和hadoop的关系,不像hadoop和jdk之间的关系,不是说要安装spark,就必须要先安装hadoop。Spark和hadoop的关系,更像是你和楼下饭店的关系,当你自己做饭吃的时候,楼下饭店存不存在是与你无关的;当你不自己做饭了,你才需要楼下有家饭店。拿Spark来说,即:如果只是需要以local或者standalone模式运行Spark程序,那么甚至可以不安装hadoop环境;只有当Spark程序需要以spark-on-yarn模式运行或者需要读取hdfs中的文件时,它才需要hadoop的存在。所以如果没有以spark-on-yarn模式运行spark程序的需求的话,可以不安装第2步中的hadoop环境,不过第1步的基础环境还是需要配置的。——这是我初学Spark时一直迷糊的一个点,希望这里说明清楚了。

 

3.1安装Scala

关于安装Spark之前要不要安装scala?其实我也不确定。有教程说不用安装,因为Spark安装包中自带scala了。也有的教程说需要先安装scala。

对于我来说,首先因为安装scala也没多难,而且后期我还要用scala来开发Spark程序,所以就安装了scala。

不管怎样,安装步骤如下。

 

3.1.1root用户解压scala安装包到/usr/local目录下hadoop1上操作

命令:

tar -xvf scala-2.11.8.tgz  -C  /usr/local/

 

3.1.2将解压后的scala目录拷贝到hadoop2hadoop3hadoop1上操作

scp -r /usr/local/scala-2.11.8 root@hadoop2:/usr/local/
scp -r /usr/local/scala-2.11.8 root@hadoop3:/usr/local/

  

3.1.3分别在三台虚拟机上修改环境变量:

命令:

vi /etc/profile

加入如下内容

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

技术分享图片

 

3.1.4用source  /etc/profile命令使修改的环境变量生效

接着用which scala命令查看scala的安装目录是不是我们想要的

技术分享图片

3.1.5测试是否安装成功

命令:

scala

或者

scala -version

技术分享图片

 

3.2安装Spark

3.2.1解压spark安装包到/usr/local/目录下hadoop1上操作

命令:

tar -xvf spark-2.2.0-bin-hadoop2.6.tgz -C /usr/local/

  

3.2.2配置slaves

命令:

cd  /usr/local/spark-2.2.0-bin-hadoop2.6/conf
cp slaves.template slaves
vim slaves

写入如下内容

hadoop2
hadoop3

技术分享图片

 

3.2.3配置spark-env.sh

命令:

cp spark-env.sh.template spark-env.sh
vi spark-env.sh

在文件中加入以下内容:

export JAVA_HOME=/usr/local/jdk
export HADOOP_HOME=/usr/local/hadoop-2.6.5
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export SPARK_MASTER_HOST=hadoop1
export SPARK_MASTER_PORT=7077

如下图所示

技术分享图片

注:

  1) JAVA_HOME是一定要配置的

  2) 配置HADOOP_HOME和HADOOP_CONF_DIR是因为,之后我需要以spark-on-yarn模式运行spark程序,配置HADOOP_CONF_DIR才能使得spark可以找到正确的hadoop环境,否则每次以spark-on-yarn模式运行spark程序时都需要手动export HADOOP_CONF_DIR=xxxxx才行。如果只想以local或standalone模式运行spark程序,则这两项可以不配置。

  3) 至于SPARK_MASTER_HOST和SPARK_MASTER_PORT,感觉没有必要显式地配置,因为人家使用默认值也是没有问题的,但是我还是配上了,不配置的话会不会有问题我就不知道了。

 

3.2.4将配置好的spark文件拷贝到hadoop2和hadoop3节点上

命令:

scp -r /usr/local/spark-2.2.0-bin-hadoop2.6 root@hadoop2:/usr/local/
scp -r /usr/local/spark-2.2.0-bin-hadoop2.6 root@hadoop3:/usr/local/

  

3.2.5在hadoop1节点上配置环境变量

命令:

vim /etc/profile

在文件中加入以下内容:

export SPARK_HOME=/usr/local/spark-2.2.0-bin-hadoop2.6
export PATH=$PATH: ${SPARK_HOME}/bin

技术分享图片

注:这里之所以没有在PATH中加入${SPARK_HOME}/sbin,是因为该目录和$HADOOP_HOME/sbin目录下都存在start-all.sh和stop-all.sh脚本,如果在PATH中加入${SPARK_HOME}/sbin,当然也是没有问题的,但是有可能会产生误操作(有时候你想关闭spark集群,于是在任意位置执行stop-all.sh命令,极有可能就把hadoop集群给关咯),所以为了避免这种情况,干脆不配置了,当要执行start-all.sh和stop-all.sh时再手动切换到${SPARK_HOME}/sbin目录下去执行命令即可。

 

使修改的环境变量生效:

source  /etc/profile

  

3.2.6启动spark集群

命令:

cd /usr/local/spark-2.2.0-bin-hadoop2.6/sbin
./start-all.sh

技术分享图片

 

3.2.7 通过网页192.168.137.21:8080查看是否成功

技术分享图片

注意,同样也是要在页面上看到所有的Woker子节点的信息才算是成功了。

 

3.3运行spark程序测试

安装完Spark之后,应该测试一下安装的spark在local模式、standalone模式和spark-on-yarn模式下是否等能运行程序。

对于安装的Spark集群,测试一下standalone模式是否可以成功运行是有必要的。

若是需要以spark-on-yarn模式运行程序,则spark-on-yarn模式的测试也非常有必要,因为有的时候虽然yarn集群启动成功了,但是由于yarn默认参数配置不一定适合你当时的集群硬件配置,极有可能是有问题的,只有跑一个程序测试一下才能试出问题来。

测试方式参考:https://blog.csdn.net/pucao_cug/article/details/72453382

 

 

 

 

至此,配置完成。

  

  

  

  

  

  

  

  

 

H01_Linux系统中搭建Hadoop和Spark集群

标签:client   dir   park   执行命令   org   避免   教程   本地   统一   

原文地址:https://www.cnblogs.com/suhaha/p/9159232.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!