本文参考至Fate集群部署下的hadoop+spark集群部署指南, 仅记录本人部署过程中的操作历程。
一、系统准备
【1】、集群规划
节点名称 | 主机名 | IP地址 | IP地址简称 | 虚拟机OS |
---|
Master | VM-0-1-centos | 192.168.26.128 | 128 | CentOS 7.2 | Slave1 | VM-0-2-centos | 192.168.26.129 | 129 | CentOS 7.2 | Slave2 | VM-0-3-centos | 192.168.26.130 | 130 | CentOS 7.2 |
【2】、基础环境配置
1、 hostname配置
1)修改主机名(主机名中不能出现下划线)
在 128 root 用户下执行:
hostnamectl set-hostname VM-0-1-centos
在 129 root 用户下执行:
hostnamectl set-hostname VM-0-2-centos
在 130 root用户下执行:
hostnamectl set-hostname VM-0-3-centos
2)加入主机映射
在目标服务器(128、 129、 130)root 用户下执行:
vim /etc/hosts
192.168.26.128 VM-0-1-centos
192.168.26.129 VM-0-2-centos
192.168.26.130 VM-0-3-centos
2、 关闭SELinux
安全增强型Linux(SELinux)是一个Linux内核的功能,它提供支持访问控制的安全政策保护机制。
在目标服务器(128、129、 130)root 用户下执行:
sed -i '/^SELINUX/s/=.*/=disabled/' /etc/selinux/config
setenforce 0
3、 修改Linux最大打开文件数
在目标服务器(128、129、130)root 用户下执行:
vim /etc/security/limits.conf
* soft nofile 65536
* hard nofile 65536
4、关闭防火墙
在目标服务器(128、129、130)root 用户下执行
systemctl disable firewalld.service
systemctl stop firewalld.service
systemctl status firewalld.service
5、初始化服务器
1)初始化服务器
在目标服务器(128、129 、130)root 用户下执行
groupadd -g 6000 apps
useradd -s /bin/bash -G apps -m app
passwd app
mkdir -p /data/projects/common/jdk
chown –R app:apps /data/projects
2)配置sudo
在目标服务器(128、129、130)root 用户下执行
vim /etc/sudoers.d/app
app ALL=(ALL) ALL
app ALL=(ALL) NOPASSWD: ALL
Defaults !env_reset
3)配置ssh免密登录(三个root 和 三个app账户 )
本人采用的方法是在A虚拟机 root 账户下生成 公私钥对,并将公钥添加到授权文件,然后复制虚拟机A ,生成虚拟机B 和 虚拟机 C ,此时三台虚拟机root账户因为公私钥对和 授权文件相同,可互相免密登录;
各虚拟机的 app 用户也免密登录:需要将root的 公私钥对 和 授权文件 拷贝至app用户下,然后更改.ssh文件的所有者信息,这样 三个 root 账户 和 三个app账户就可互相免密登录
具体执行过程参照文章:设置虚拟机固定IP以及免密登录
【3】、安装包准备
1、上传以下程序包到服务器上
- jdk-1.8-linux-x64.tar.gz
- hadoop-2.7.7.tar.gz
- scala-2.12.8.tar.gz
- spark-2.4.2-bin-hadoop2.6.tar.gz
- apache-zookeeper-3.5.5-bin.tar.gz
2、解压
tar xvf hadoop-2.7.7.tar.gz -C /data/projects/common
tar xvf scala-2.12.8.tar.gz -C /data/projects/common
tar xvf spark-2.4.2-bin-hadoop2.6.tar.gz -C /data/projects/common
tar xvf apache-zookeeper-3.5.5-bin.tar.gz -C /data/projects/common
tar xvf jdk-1.8-linux-x64.tar.gz -C /data/projects/common/jdk
mv hadoop-2.7.7 hadoop
mv scala-2.11.12 scala
mv spark-2.4.2-bin-hadoop2.6 spark
mv apache-zookeeper-3.5.5-bin zookeeper
3、配置/etc/profile
export JAVA_HOME=/data/projects/common/jdk/jdk1.8.0_144
export PATH=$JAVA_HOME/bin:$PATH
export HADOOP_HOME=/data/projects/common/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
export SPARK_HOME=/data/projects/common/spark
export PATH=$SPARK_HOME/bin:$PATH
export ZOO_HOME=/data/projects/common/zookeeper
export PATH=$ZOO_HOME/bin:$PATH
二、集群部署
【1】、Zookeeper集群部署
1、写zoo.cfg配置文件
在128、129、130 app 用户下执行(可在128上配置完,发送到129和130上)
cd /data/projects/common/zookeeper/conf
vi zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/data/projects/common/zookeeper/data/zookeeper
dataLogDir=/data/projects/common/zookeeper/logs
clientPort=2181
maxClientCnxns=1000
server.1= VM-0-1-centos:2888:3888
server.2= VM-0-2-centos:2888:3888
server.3= VM-0-3-centos:2888:3888
报错:Permission denied 原因:app用户无权限修改 /data/projects/common/ 目录文件 解决方案:调整app用户对 /data/projects/common/ 的所有权,再重写 zoo.cfg 文件即可;
# -R 表示修改当前目录及其子目录 app用户 apps组
# 因当前操作目录是/data/projects/common,故 * 代表/data/projects/common
chown -R app:apps *
2、配置节点id—在dataDir目录下
master节点写1 ,slave节点依次类推 此处写完,可打开myid文件检查是否写成功;
echo 1 >> /data/projects/common/zookeeper/data/zookeeper/myid
echo 2 >> /data/projects/common/zookeeper/data/zookeeper/myid
echo 3 >> /data/projects/common/zookeeper/data/zookeeper/myid
3、启动zookeeper并查看状态
三个节点,先启动的是leader,后续启动的是follower
cd /data/projects/common/zookeeper/bin/
./zkServer.sh start
./zkServer.sh status
zk启动报错:java.net.BindException: Address already in use
JPS查看状态 java进程 QuorunPeerMain
【2】、Hadoop集群部署(ZK集群需要开启)
1、hadoop中加入jdk环境
在128、129、130 app 用户下执行
cd /data/projects/common/hadoop/etc/hadoop
在hadoop-env.sh、yarn-env.sh 中 加入 ** JDK 环境**:
export JAVA_HOME=/data/projects/common/jdk/jdk1.8.0_144
2、修改hadoop配置文件
在 /data/projects/common/Hadoop/etc/hadoop 目录下修改 core-site.xml – 集群全局参数、 hdfs-site.xml – 配置HDFS组件的属性、 mapred-site.xml – 配置map-reduce组件的属性、 yarn-site.xml – 配置集群资源管理系统参数, 需要根据实际情况修改里面的IP主机名、目录等。 参考如下:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>/data/projects/common/hadoop/tmp</value>
</property>
<property>
<name>fs.defaultFS</name>
<value>hdfs://fate-cluster</value>
</property>
<property>
<name>io.compression.codecs</name>
<value>org.apache.hadoop.io.compress.GzipCodec,
org.apache.hadoop.io.compress.DefaultCodec,
org.apache.hadoop.io.compress.BZip2Codec,
org.apache.hadoop.io.compress.SnappyCodec
</value>
</property>
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>VM-0-1-centos:2181,VM-0-2-centos:2181,VM-0-3-centos:2181</value>
</property>
<property>
<name>hadoop.http.filter.initializers</name>
<value>org.apache.hadoop.security.AuthenticationFilterInitializer</value>
</property>
<property>
<name>hadoop.http.authentication.type</name>
<value>simple</value>
</property>
<property>
<name>hadoop.http.authentication.token.validity</name>
<value>3600</value>
</property>
<property>
<name>hadoop.http.authentication.signature.secret.file</name>
<value>/data/projects/commom/hadoop/etc/hadoop/hadoop-http-auth-signature-secret</value>
</property>
<property>
<name>hadoop.http.authentication.cookie.domain</name>
<value></value>
</property>
<property>
<name>hadoop.http.authentication.simple.anonymous.allowed</name>
<value>true</value>
</property>
</configuration>
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>dfs.replication</name>
<value>3</value>
<description>设置副本数</description>
</property>
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
<property>
<name>dfs.nameservices</name>
<value>fate-cluster</value>
<description>为namenode集群定义一个services name</description>
</property>
<property>
<name>dfs.ha.namenodes.fate-cluster</name>
<value>nn1,nn2</value>
<description> nameservice 包含哪些namenode,为各个namenode起名</description>
</property>
<property>
<name>dfs.namenode.rpc-address.fate-cluster.nn1</name>
<value>VM-0-1-centos:9000</value>
<description>namenode 的rpc地址和端口号,rpc用来和datanode通讯</description>
</property>
<property>
<name>dfs.namenode.http-address.fate-cluster.nn1</name>
<value>VM-0-1-centos:50070</value>
<description>namenode 的http地址和端口号,web客户端</description>
</property>
<property>
<name>dfs.namenode.rpc-address.fate-cluster.nn2</name>
<value>VM-0-2-centos:9000</value>
</property>
<property>
<name>dfs.namenode.http-address.fate-cluster.nn2</name>
<value>VM-0-2-centos:50070</value>
</property>
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://VM-0-1-centos:8485;VM-0-2-centos:8485;VM-0-3-centos:8485/fate-cluster</value>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/data/projects/common/hadoop/data/journaldata</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///data/projects/common/hadoop/data/dfs/nn/local</value>
<description> namenode 存放name table(fsimage)本地目录</description>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/data/projects/common/hadoop/data/dfs/dn/local</value>
<description>datanode存放block本地目录</description>
</property>
<property>
<name>dfs.client.failover.proxy.provider.fate-cluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<property>
<name>dfs.ha.fencing.methods</name>
<value>shell(/bin/true)</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/app/.ssh/id_rsa</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>10000</value>
</property>
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.client.block.write.replace-datanode-on-failure.policy</name>
<value>NEVER</value>
</property>
</configuration>
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
<?xml version="1.0"?>
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>rmCluster</value>
</property>
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>VM-0-1-centos:8088</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>VM-0-1-centos</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>VM-0-2-centos</value>
</property>
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>VM-0-1-centos:2181,VM-0-2-centos:2181,VM-0-3-centos:2181</value>
</property>
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property>
<property>
<name>yarn.resourcemanager.store.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</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>
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>20480</value>
</property>
<property>
<name>yarn.nodemanager.disk-health-checker.max-disk-utilization-per-disk-percentage</name>
<value>97.0</value>
</property>
</configuration>
3、新建目录
cd /data/projects/common/hadoop
mkdir ./tmp
mkdir -p ./data/dfs/nn/local
mkdir -p ./data/dfs/dn/local
4、启动–依次执行以下命令
在128 、129 、130 app 用户下执行
hadoop-daemon.sh start journalnode
在128 app 用户下执行
hdfs namenode -format
hadoop-daemon.sh start namenode
在129 app用户下操作
hdfs namenode -bootstrapStandby
在128 app 用户下执行
hdfs zkfc -formatZK
在129 app 用户下操作
hadoop-daemon.sh start namenode
在128、129 app 用户下操作
hadoop-daemon.sh start zkfc
在128、129 app用户下操作
yarn-daemon.sh start resourcemanager
在128、129、130 app用户下操作
yarn-daemon.sh start nodemanager
在128、129、130 app用户下操作
hadoop-daemon.sh start datanode
5、验证
jps查看开启的进程 一定要有 NameNode 和 DataNode
http://192.168.26.128:50070 查看hadoop状态(129上也可查看)
http://192.168.26.128:8088 查看yarn集群状态
【3】、Spark集群部署(ZK和hadoop集群都开着,且fate的python环境配置好)
1、配置slaves
在128 app 用户下修改,并发送slaves文件至 129 、130 用户下
cd /data/projects/common/spark/conf
vi slaves
加入 VM-0-2-centos 、VM-0-3-centos
2、配置集群文件
在128 app 用户下修改,并发送slaves文件至 129 、130 用户下
vi spark-defaults.conf
加入
spark.master yarn
spark.eventLog.enabled true
spark.eventLog.dir hdfs:
spark.yarn.jars hdfs:
在spark-env.sh加入
export JAVA_HOME=/data/projects/common/jdk/jdk1.8.0_144
export SCALA_HOME=/data/projects/common/scala
export HADOOP_HOME=/data/projects/common/hadoop
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export
SPARK_HISTORY_OPTS="-Dspark.history.fs.logDirectory=hdfs://fate-cluster/tmp/spark/event"
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib/native"
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${HADOOP_HOME}/lib/native
# 此处配置pyspark的python环境,需要在fate安装配置python虚拟环境后才能正常启动
export PYSPARK_PYTHON=/data/projects/fate/common/python/venv/bin/python
export PYSPARK_DRIVER_PYTHON=/data/projects/fate/common/python/venv/bin/python
3、启动Spark集群
Master机器上启动 (128机器上Master启动,则129和130的worker都启动了)
sh /data/projects/common/spark/sbin/start-all.sh
jps进程查看 有Master 和 Worker(slaves)
4、验证spark + hadoop 集群
Master机器上(128机器)验证集群
cd /data/projects/common/spark/spark-2.4.1-bin-hadoop2.7/jars
hdfs dfs -mkdir -p /tmp/spark/jars
hdfs dfs -mkdir -p /tmp/spark/event
hdfs dfs -put *jar /tmp/spark/jars
/data/projects/common/spark/bin/spark-shell --master yarn --deploy-mode client
出错:没有fate-cluster 解决办法:修改hadoop中的core-site.xml中 fs.default.name 改为 fs.defaultFS
<property>
<!-- 定义HadoopMaster的URI和端口 -->
<name>fs.defaultFS</name>
<value>hdfs:
</property>
再次重新启动即可成功:
|