Linux安装配置Spark集群
假设我们有99.1.1.164(Master)、99.1.1.165(Slave01)、99.1.1.166(Slave02)三台机器,想要搭建一个Spark集群。首先我们需要搭建一个分布式的Hadoop集群,如果是零基础建议从单机伪分布式的集群开始学习,具体可以参见另一篇文章Linux安装配置Hadoop 。
这篇文章里我们针对生产环境的需求,会修改一些默认配置。另外,由于集群包括Master、Slave01、Slave02以及今后提交Spark程序的客户端,本文会特别提示每个操作需要在哪些主机上完成。
实验环境:RedHat6.4+Hadoop2.7.3+Spark2.0.1+Scala2.11.8。
1. 安装前准备
1.1 新建hadoop用户
Master、Slave01、Slave02均需操作。
Hadoop使用root用户启动会有问题,为此我们专门新建一个hadoop用户(也可以其他名字)。为方便起见,再为其配置免密码执行sudo:
useradd hadoop
echo 'hadoop ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers
su - hadoop
,以下所有操作都用hadoop用户完成。
1.2 配置节点主机名
Master、Slave01、Slave02、客户端均需操作。
虽然使用IP其实也可以,但我们习惯在配置过程中使用主机名而不是IP,为此三台主机需确保能ping通Master、Slave01、Slave02三个主机名,或者修改/etc/hosts
:
sudo echo '99.1.1.164 bigdata-SZTS-Master' >> /etc/hosts
sudo echo '99.1.1.165 bigdata-SZTS-Slave01' >> /etc/hosts
sudo echo '99.1.1.166 bigdata-SZTS-Slave02' >> /etc/hosts
1.3 配置免密码登录
只需在Master上操作。
Master启动Master、Slave01、Slave02上的进程时使用的是远程登录的方式,为此需要配置Master的hadoop用户能免密码登录三台主机:
ssh-keygen -t rsa
ssh-copy-id bigdata-SZTS-Master
ssh-copy-id bigdata-SZTS-Slave01
ssh-copy-id bigdata-SZTS-Slave02
一路回车并在必要时输入hadoop的密码即可。
1.4 准备Java环境
Master、Slave01、Slave02、客户端均需操作。
建议使用JDK1.8以上版本,并配置环境变量。sudo vim /etc/profile
,修改:
export JAVA_HOME=/usr/java/jdk1.8.0_71
此外,由于Unix和Linux的区别,Hadoop有时默认的Java路径为/bin/java
。若未配置,在以Yarn模式运行Spark程序时,日志中会记录以下错误:
/bin/bash: /bin/java: No such file or directory
为此建一个软链接即可:
cd /bin
sudo ln -s /usr/bin/java
最后确认以下命令均能运行Java且版本一致:
/bin/java -version
/usr/bin/java -version
$JAVA_HOME/bin/java -version
2. 安装配置Hadoop
我们使用yum、rpm等方式安装应用时,会发现许多应用的文件分布遵循一定的规范,比如应用安装在/usr/share/appname
,配置文件放在/etc/appname
,日志文件放在/var/log/appname
,临时文件放在/tmp
,等等,从而在运行时应用的根目录不产生任何文件。我们也遵循同样的规范。
2.1 下载并安装
Master、Slave01、Slave02均需操作。
wget http://mirror.bit.edu.cn/apache/hadoop/common/hadoop-2.7.3/hadoop-2.7.3.tar.gz
tar zxvf hadoop-2.7.3.tar.gz
sudo mv hadoop-2.7.3 /usr/share/hadoop-2.7.3
配置环境变量。sudo vim /etc/profile
,修改:
export HADOOP_HOME=/usr/share/hadoop-2.7.3
2.2 修改配置文件位置
Master、Slave01、Slave02均需操作。
将配置文件统一放置便于进行备份,也能确保应用升级时配置文件不被覆盖。Hadoop配置文件默认位于$HADOOP_HOME/etc/hadoop
,为此将其移到/etc
下并建立软链接即可:
cd $HADOOP_HOME/etc
sudo mv hadoop /etc/hadoop
ln -s /etc/hadoop
接下来我们对/etc/hadoop
文件夹中的配置文件进行修改。
2.3 core-site.xml
Master、Slave01、Slave02均需操作。
将临时文件统一放置便于进行文件清理。添加:
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://bigdata-SZTS-Master:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/tmp</value>
</property>
</configuration>
2.4 hdfs-site.xml
Master、Slave01、Slave02均需操作。
将数据文件移到应用根目录以外,便于进行管理和应用升级。添加:
<configuration>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>bigdata-SZTS-Master:50090</value>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>/opt/app/data/hadoop/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/opt/app/data/hadoop/dfs/data</value>
</property>
</configuration>
新建相应文件夹并确保hadoop用户有权限:
sudo mkdir /opt/app/data/hadoop
sudo chown -R hadoop /opt/app/data/hadoop
2.5 yarn-site.xml
Master、Slave01、Slave02均需操作。
添加:
<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>bigdata-SZTS-Master</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
如果以Yarn的client模式运行Spark程序时报以下错误:
AM Container is running beyond virtual memory limits
可以通过以下两种方式解决。添加:
a. 禁用虚拟内存限制检查
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
b.增加每MB物理内存可使用的虚拟内存的倍数(默认2.1)
<property>
<name>yarn.nodemanager.vmem-pmem-ratio</name>
<value>3</value>
</property>
2.6 mapred-site.xml
Master、Slave01、Slave02均需操作。
添加:
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>bigdata-SZTS-Master:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>bigdata-SZTS-Master:19888</value>
</property>
</configuration>
2.7 slaves
Master、Slave01、Slave02均需操作。
新建该文件或添加:
bigdata-SZTS-Slave01
bigdata-SZTS-Slave02
2.8 日志文件配置
Master、Slave01、Slave02均需操作。
将日志文件统一放置便于进行文件清理。另外Hadoop默认输出的日志级别是INFO,信息太多,可将其改为WARN。vim下全文替换的命令为:
:%s/INFO/WARN/g
修改以下文件:
hadoop-env.sh
JAVA_HOME=/usr/java/jdk1.8.0_71
export HADOOP_NAMENODE_OPTS="-Dhadoop.security.logger=${HADOOP_SECURITY_LOGGER:-WARN,RFAS} -Dhdfs.audit.logger=${HDFS_AUDIT_LOGGER:-WARN,NullAppender} $HADOOP_NAMENODE_OPTS"
export HADOOP_SECONDARYNAMENODE_OPTS="-Dhadoop.security.logger=${HADOOP_SECURITY_LOGGER:-WARN,RFAS} -Dhdfs.audit.logger=${HDFS_AUDIT_LOGGER:-WARN,NullAppender} $HADOOP_SECONDARYNAMENODE_OPTS"
export HADOOP_LOG_DIR=/var/log/hadoop
export HADOOP_ROOT_LOGGER=WARN,console
新建相应文件夹并确保hadoop用户有权限:
sudo mkdir /var/log/hadoop
sudo chown -R hadoop /var/log/hadoop
log4j.properties
修改:
hadoop.root.logger=WARN,console
mapred-env.sh
修改:
export HADOOP_MAPRED_ROOT_LOGGER=WARN,RFA
export HADOOP_MAPRED_LOG_DIR=/var/log/hadoop
export HADOOP_JHS_LOGGER=WARN,RFA
yarn-env.sh
注意export YARN_LOG_DIR
这一句的位置:
export YARN_LOG_DIR=/var/log/hadoop
# default log directory & file
...
...
YARN_OPTS="$YARN_OPTS -Dhadoop.root.logger=${YARN_ROOT_LOGGER:-WARN,console}"
YARN_OPTS="$YARN_OPTS -Dyarn.root.logger=${YARN_ROOT_LOGGER:-WARN,console}"
2.9 测试
只需在Master上操作。
每个步骤执行完后都要确认正确,再执行下一步。
- 首次启动需格式化hdfs:
bin/hdfs namenode -format
。成功的话,会看到 “successfully formatted” 和 “Exitting with status 0” 的提示,若为 “Exitting with status 1” 则是出错。 sbin/start-dfs.sh
:成功的话,Master上执行jps可以看到NameNode、SecondaryNameNode,Slave01、Slave02上执行jps可以看到DataNode。否则sbin/stop-dfs.sh
,检查错误。sbin/start-yarn.sh
:成功的话,Master上执行jps可以看到ResourceManager,Slave01、Slave02上执行jps可以看到NodeManager。否则sbin/stop-yarn.sh
,检查错误。sbin/mr-jobhistory-daemon.sh start historyserver
:成功的话,Master上执行jps可以看到JobHistoryServer。否则sbin/mr-jobhistory-daemon.sh stop historyserver
,检查错误。- 最后在hdfs上建一个文件夹作为测试:
hdfs dfs -mkdir /data
hdfs dfs -ls /
3. 安装配置Spark
3.1 下载安装Scala
Master、Slave01、Slave02均需操作。
wget http://downloads.lightbend.com/scala/2.11.8/scala-2.11.8.rpm
sudo rpm -i scala-2.11.8.rpm
配置环境变量。sudo vim /etc/profile
,修改:
export SCALA_HOME=/usr/share/scala
3.2 下载并安装
Master、Slave01、Slave02、客户端均需操作。
wget http://d3kbcqa49mib13.cloudfront.net/spark-2.0.1-bin-hadoop2.7.tgz
tar zxvf spark-2.0.1-bin-hadoop2.7.tgz
sudo mv spark-2.0.1-bin-hadoop2.7 /usr/share/spark-2.0.1-bin-hadoop2.7
配置环境变量。sudo vim /etc/profile
,修改:
export SPARK_HOME=/usr/share/spark-2.0.1-bin-hadoop2.7
3.3 修改配置
Master、Slave01、Slave02、客户端均需操作。
Spark配置文件默认位于$SPARK_HOME/conf
,为此将其移到/etc
下并建立软链接即可:
sudo mv conf /etc/spark
ln -s /etc/spark conf
接下来我们对该文件夹中的配置文件进行修改。
slaves
新建该文件或添加:
bigdata-SZTS-Slave01
bigdata-SZTS-Slave02
spark-env.sh
修改:
export SPARK_LOCAL_IP=`hostname`
export HADOOP_CONF_DIR=/etc/hadoop
export SPARK_MASTER_HOST=bigdata-SZTS-Master
export SPARK_LOG_DIR=/var/log/spark
尤其注意SPARK_LOCAL_IP
的设置。Master上会有一个SparkUI,可以跳转到各Slave的页面查看Slave的stdout、stderr等输出。SPARK_LOCAL_IP
配置成127.0.0.1或0.0.0.0会导致无法跳转,而我们又想保持配置文件的统一性,所以取了主机名。
另外我们修改了日志文件的位置,新建相应文件夹并确保hadoop用户有权限:
sudo mkdir /var/log/spark
sudo chown -R hadoop /var/log/spark
log4j.properties
修改:
log4j.rootCategory=WARN, console
log4j.logger.org.apache.spark.repl.Main=WARN
log4j.logger.org.spark_project.jetty=WARN
3.4 测试
只需在Master上操作。
sbin/start-all.sh
:成功的话,Master上执行jps可以看到Master,Slave01、Slave02上执行jps可以看到Worker。否则sbin/stop-all.sh
,检查错误。
4. 客户端配置
4.1 Linux客户端
如果想简单起见,可以把客户端按照Master、Slave01或Slave02进行配置,但这样并不有助于我们理解Spark,因为里面很多配置对于客户端来说是多余的。事实上,客户端的配置相当简单。
将hadoop-2.7.3.tar.gz安装包下的配置文件解压到/etc/hadoop
。
修改/etc/hadoop/core-site.xml
:
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://bigdata-SZTS-Master:9000</value>
</property>
</configuration>
修改/etc/hadoop/yarn-site.xml
:
<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>bigdata-SZTS-Master</value>
</property>
</configuration>
完啦!
4.2 Windows客户端
Windows客户端和Linux客户端配置稍有不同。另外Windows也不是主流的使用Spark的场景,这里只做简单介绍。目前来看Windows客户端的最大好处是可以使用Intellij Idea进行Spark程序的开发和调试。
- 安装JDK1.8到
C:\Program_Files\Java\jdk1.8.0_71
- 将hadoop-2.7.3.tar.gz的配置文件解压到
C:\Program_Files\hadoop-2.7.3\etc\hadoop
- Hadoop官方提供的在Windows下的可执行文件存在问题,如果不想自己编译可以下载第三方编译的bin文件到
C:\Program_Files\hadoop-2.7.3\bin
,这个在网上一搜一大把,例如hadoop-2.7.3 bin目录 for win10 64位 - 修改
core-site.xml
和yarn-site.xml
,和Linux客户端相同 - 将
spark-2.0.1-bin-hadoop-2.7.tgz
解压到C:\Program_Files\spark-2.0.1-bin-hadoop2.7
- 右键计算机->属性->高级系统设置->环境变量,新建以下环境变量
- JAVA_HOME:
C:\Program_Files\Java\jdk1.8.0_71
- HADOOP_HOME:
C:\Program_Files\hadoop-2.7.3
- HADOOP_CONF_DIR:
%HADOOP_HOME%\etc\hadoop
- SPARK_HOME:
C:\Program_Files\spark-2.0.1-bin-hadoop2.7
- 在Master节点上添加与执行操作的Windows用户名同名的用户并加入supergroup组:
adduser mvpboss1004
groupadd supergroup
usermod -a -G supergroup mvpboss1004
否则在spark-submit需要读写HDFS时会报以下错误
Caused by: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.AccessControlException): Permission denied: user=mvpboss1004, access=WRITE, inode="/user":hadoop:supergroup:drwxr-xr-x
5. spark-submit测试
spark-submit提交作业有多种模式,我们使用Spark自带的计算圆周率的例子进行测试,假设客户端IP为99.1.14.3,以下操作在客户端上进行。Windows和Linux客户端的命令是一样的。
5.1 local
bin/spark-submit --class org.apache.spark.examples.SparkPi --master local[*] examples/jars/spark-examples_2.11-2.0.1.jar 10
命令行会显示结果:
Pi is roughly 3.14015114015114
5.2 Yarn+client
bin/spark-submit --class org.apache.spark.examples.SparkPi --master yarn --deploy-mode client --conf spark.driver.host=99.1.14.3 examples/jars/spark-examples_2.11-2.0.1.jar 10
命令行会显示结果。
5.3 Yarn+cluster
bin/spark-submit --class org.apache.spark.examples.SparkPi --master yarn --deploy-mode cluster --conf spark.driver.host=99.1.14.3 examples/jars/spark-examples_2.11-2.0.1.jar 10
由于cluster模式完全运行在集群上,本地无法看到结果,只能通过以下方式。依次执行:
- 访问http://bigdata-szts-master:8088/cluster/
- ID一列点击刚才提交的任务ID链接,例如
application_1488686054344_0015
- 跳转后拉到底,Logs一列点击刚才提交的任务
Logs
链接 - 跳转后点击stdout的输出,例如
stdout : Total file length is 32 bytes
- 跳转的页面会显示结果
5.4 Standalone+client
bin/spark-submit --class org.apache.spark.examples.SparkPi --master spark://bigdata-szts-master:7077 --deploy-mode client --conf spark.driver.host=99.1.14.3 examples/jars/spark-examples_2.11-2.0.1.jar 10
命令行会显示结果。
5.5 Standalone+cluster
bin/spark-submit --class org.apache.spark.examples.SparkPi --master spark://bigdata-szts-master:6066 --deploy-mode cluster --conf spark.driver.host=99.1.14.3 examples/jars/spark-examples_2.11-2.0.1.jar 10
由于cluster模式完全运行在集群上,本地无法看到结果,只能通过以下方式。依次执行:
- 访问http://bigdata-szts-master:8080
Completed Drivers
一栏Worker一列点击刚才提交的任务链接,Slave01或Slave02都有可能,例如worker-20170305203148-99.1.36.165-58334
- 跳转后
Finished Drivers
一栏Logs一列点击刚才提交的任务stdout
链接 - 跳转的页面会显示结果