阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

CentOS Linux中搭建Hadoop和Spark集群详解

248次阅读
没有评论

共计 9196 个字符,预计需要花费 23 分钟才能阅读完成。

前言

1.Linux 操作系统为 CentOS7

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

3. 安装的 Hadoop 版本是 2.6.5,Spark 版本是 2.2.0,Scala 的版本是 2.11.8。

  如果安装的 Spark 要同 Hadoop 搭配工作,则需注意他们之间的版本依赖关系。可以从 spark 官网上查询到 Spark 运行需要的环境,如下:

CentOS Linux 中搭建 Hadoop 和 Spark 集群详解

4. 需要的安装包:

CentOS Linux 中搭建 Hadoop 和 Spark 集群详解

安装包下载地址:

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集群规划:

服务器

进程

Hostname

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通。 

/etc/hosts 文件配置如下

CentOS Linux 中搭建 Hadoop 和 Spark 集群详解

1.3所有节点关闭防火墙

查看防火墙状态:

systemctl status firewalld

 

关闭防火墙:

 

systemctl stop firewalld
systemctl disable firewalld

1.4 SSH免密登录设置

SSH 免密登录设置参考:https://www.linuxidc.com/Linux/2018-05/152505.htm

通过配置,使得 hadoop1、hadoop2、和 hadoop3 之间都可以相互免密登录(至少要使得 hadoop1 可以免密登录 hadoop2 和 hadoop3)。

1.5配置 NTP

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

集群中配置 NTP 可参考:https://www.linuxidc.com/Linux/2018-03/151402.htm

1.6配置 JDK(所有节点)

JDK 的配置可参考:https://www.linuxidc.com/Linux/2018-06/152794.htm

如下:

CentOS Linux 中搭建 Hadoop 和 Spark 集群详解

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

2.安装Hadoop

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

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

命令:

cd /data/soft

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

如下:

CentOS Linux 中搭建 Hadoop 和 Spark 集群详解

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

2.2.1配置hadoop-env.sh

命令:

vim hadoop-env.sh

在 hadoop-env.sh 中修改 Java_HOME

export JAVA_HOME=/usr/local/jdk

如下:

CentOS Linux 中搭建 Hadoop 和 Spark 集群详解

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

2.2.2配置core-site.xml

命令:

 

vim core-site.xml

 

在文件中加入如下内容

 

<property>

 

    <name>fs.defaultFS</name>

 

    <value>hdfs://hadoop1:9000</value>

 

</property>

 

如下:

CentOS Linux 中搭建 Hadoop 和 Spark 集群详解

2.2.3配置hdfs-site.xml

命令:

 

vim hdfs-site.xml

在文件中加入如下内容

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

如下:

CentOS Linux 中搭建 Hadoop 和 Spark 集群详解

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

<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

命令:

vim 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>

如下:

CentOS Linux 中搭建 Hadoop 和 Spark 集群详解

注:

可以看到上面有许多端口的配置,网上很多文章的教程中是没有的,这是因为这些端口默认就是 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 状态上,卡在该状态上的日志我看不出问题来,但是确实把上面的端口都配置了之后就好了。

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

图一:

CentOS Linux 中搭建 Hadoop 和 Spark 集群详解

 注:判定上图信息是异常的原因,是因为子节点要去连接主节点,它需要连接到正确的主节点 IP 才行,而上图中连接的却是 0.0.0.0——在子节点上,0.0.0.0 的 IP 代表的是子节点自己,它连接错了,自然无法向主节点注册。

 

关于最后两项配置

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

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

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

CentOS Linux 中搭建 Hadoop 和 Spark 集群详解

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

2.2.5 配置slaves

命令:

vim slaves

 在文件中加入如下内容

hadoop2
hadoop3

如下:

CentOS Linux 中搭建 Hadoop 和 Spark 集群详解

注:本次配置中 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

CentOS Linux 中搭建 Hadoop 和 Spark 集群详解

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

 CentOS Linux 中搭建 Hadoop 和 Spark 集群详解

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

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

hdfs namenode -format

如下:

CentOS Linux 中搭建 Hadoop 和 Spark 集群详解

CentOS Linux 中搭建 Hadoop 和 Spark 集群详解

注:命令执行完之后从结果上很难看出是否格式化成功了,这时可以紧接着通过 echo $? 命令查看hdfs namenode -format 命令是否执行成功。如下,如果输出 0,则说明上一条执行成功。

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

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

如下:

CentOS Linux 中搭建 Hadoop 和 Spark 集群详解

 

2.7验证 hdfs 是否安装成功

方法一:

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

CentOS Linux 中搭建 Hadoop 和 Spark 集群详解

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

 CentOS Linux 中搭建 Hadoop 和 Spark 集群详解

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

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

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

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

CentOS Linux 中搭建 Hadoop 和 Spark 集群详解

方法二:

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

CentOS Linux 中搭建 Hadoop 和 Spark 集群详解

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

2.8启动 yarnhadoop1上执行以下命令

cd  /usr/local/hadoop-2.6.5/sbin

./start-yarn.sh

如下:

CentOS Linux 中搭建 Hadoop 和 Spark 集群详解

2.9验证 yarn 是否启动成功

方法一

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

CentOS Linux 中搭建 Hadoop 和 Spark 集群详解

在子节点上有 NodeManager 进程

CentOS Linux 中搭建 Hadoop 和 Spark 集群详解

但是,同样还不能认为 yarn 集群就没有问题了,原因如 2.2.4 中所说的那样(即:可能由于某些原因,导致子节点在启动之后却无法向主节点注册)。

因此,保险起见,应在主节点上再通过 yarn node -list -all 命令查看一下。如下:

CentOS Linux 中搭建 Hadoop 和 Spark 集群详解

如上图说明 yarn 启动成功。

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

图一:

CentOS Linux 中搭建 Hadoop 和 Spark 集群详解

图二:

CentOS Linux 中搭建 Hadoop 和 Spark 集群详解

方法二:

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

CentOS Linux 中搭建 Hadoop 和 Spark 集群详解

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

 CentOS Linux 中搭建 Hadoop 和 Spark 集群详解

3.安装Spark

Spark 的安装跟 hadoop(包括 yarn)是相对独立的,即使是需要以 spark-on-yarn 模式运行 Spark 程序。Spark 和 hadoop 的关系,不像 hadoop 和 jdk 之间的关系那样——安装 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 程序,所以也就安装了。

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

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

命令:

cd /data/soft
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

如下:

CentOS Linux 中搭建 Hadoop 和 Spark 集群详解

3.1.4使修改的环境变量生效

命令:

source  /etc/profile

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

CentOS Linux 中搭建 Hadoop 和 Spark 集群详解

3.1.5测试是否安装成功

命令:

scala

或者

scala -version

CentOS Linux 中搭建 Hadoop 和 Spark 集群详解

3.2安装 Spark(hadoop1 上操作)

3.2.1解压 spark安装包到 /usr/local/ 目录下

命令:

cd /data/soft

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

3.2.2 参数 配置

3.2.2.1 配置 slaves

命令:

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

vim slaves

写入如下内容

hadoop2
hadoop3

如下:

CentOS Linux 中搭建 Hadoop 和 Spark 集群详解

3.2.2.2配置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

如下:

CentOS Linux 中搭建 Hadoop 和 Spark 集群详解

注:

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.3将配置好的 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.4 在 hadoop1 节点上配置环境变量

命令:

vim /etc/profile

在文件中加入以下内容:

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

如下:

CentOS Linux 中搭建 Hadoop 和 Spark 集群详解

注:这里之所以没有在 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.5 启动 spark 集群

 

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

如下:

CentOS Linux 中搭建 Hadoop 和 Spark 集群详解

 

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

CentOS Linux 中搭建 Hadoop 和 Spark 集群详解

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

3.3运行 spark 程序测试

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

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

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

至此,配置完成。

更多 Hadoop 相关信息见Hadoop 专题页面 https://www.linuxidc.com/topicnews.aspx?tid=13

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计9196字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中