共计 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 运行需要的环境,如下:
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集群规划:
服务器 | 进程 | ||||||||
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 文件配置如下
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
如下:
注:到这一步,基础环境算是配置好了,可以给各个节点做个快照,后面步骤出错了也可以快速恢复。
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/
如下:
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
如下:
注:需根据实际 java 路径进行修改
2.2.2配置core-site.xml
命令:
vim core-site.xml
在文件中加入如下内容
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop1:9000</value>
</property>
如下:
2.2.3配置hdfs-site.xml
命令:
vim 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
命令:
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>
如下:
注:
可以看到上面有许多端口的配置,网上很多文章的教程中是没有的,这是因为这些端口默认就是 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 状态上,卡在该状态上的日志我看不出问题来,但是确实把上面的端口都配置了之后就好了。
因此,最好是将这些端口都显式配置好!!!
图一:
注:判定上图信息是异常的原因,是因为子节点要去连接主节点,它需要连接到正确的主节点 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 程序的时候会报如下错误。
报错是因为,执行程序时,yarn 对于机器能分配的资源进行了检查,结果发现运行程序需要的资源超出了机器所能分配资源的上限,然后就粗错了。如果把上面两项设置为 false,则运行程序时就不会去进行对应的资源检查了,此时虽然机器能分配的资源依然不足,但是 yarn 不会像之前那样立马把 container 干掉了,而是会花较长的时间才能把程序跑完。
2.2.5 配置slaves
命令:
vim 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.8启动 yarn, 在hadoop1上执行以下命令
cd /usr/local/hadoop-2.6.5/sbin
./start-yarn.sh
如下:
2.9验证 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 之间的关系那样——安装 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.1用 root 用户 解压 scala 安装包到 /usr/local 目录下 (hadoop1 上操作)
命令:
cd /data/soft
tar -xvf scala-2.11.8.tgz -C /usr/local/
3.1.2将解压后的 scala 目录拷贝到 hadoop2 和hadoop3(hadoop1上操作)
命令:
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(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
如下:
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
如下:
注:
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
如下:
注:这里之所以没有在 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
如下:
3.2.6 通过网页 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 默认参数配置不一定适合你当时的集群硬件配置,极有可能是有问题的,只有跑一个程序测试一下才能试出问题来。
至此,配置完成。
更多 Hadoop 相关信息见Hadoop 专题页面 https://www.linuxidc.com/topicnews.aspx?tid=13
: