1.2 在Linux集群上部署Spark
Spark安装部署比较简单,用户可以登录其官方网站(http://spark.apache.org/downloads.html)下载Spark最新版本或历史版本,也可以查阅Spark相关文档作为参考。本书开始写作时,Spark刚刚发布1.5.0版,因此本章所述的环境搭建均以Spark 1.5.0版为例。
Spark使用了Hadoop的HDFS作为持久化存储层,因此安装Spark时,应先安装与Spark版本相兼容的Hadoop。
本节以阿里云Linux主机为例,描述集群环境及Spark开发环境的搭建过程。
Spark计算框架以Scala语言开发,因此部署Spark首先需要安装Scala及JDK(Spark1.5.0需要JDK1.7.0或更高版本)。另外,Spark计算框架基于持久化层,如Hadoop HDFS,因此本章也会简述Hadoop的安装配置。
1.2.1 安装OpenJDK
Spark1.5.0要求OpenJDK1.7.0或更高版本。以本机Linux X86机器为例,OpenJDK的安装步骤如下所示:
1)查询服务器上可用的JDK版本。在终端输入如下命令:
yum list "*JDK*"
yum会列出服务器上的JDK版本。
2)安装JDK。在终端输入如下命令:
yum install java-1.7.0-openjdk-devel.x86 cd /usr/lib/jvm ln -s java-1.7.0-openjdk.x86 java-1.7
3)JDK环境配置。
① 用编辑器打开/etc/profile文件,加入如下内容:
export JAVA_HOME=/usr/lib/jvm/java-1.7 export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin
关闭并保存profile文件。
② 输入命令source /etc/profile让配置生效。
1.2.2 安装Scala
登录Scala官网(http://www.scala-lang.org/download/)下载最新版本: scala-2.11.7.tgz
1)安装。
tar zxvf scala-2.11.7.tgz -C /usr/local cd /usr/local ln -s scala-2.11.7 scala
2)配置:打开/etc/profile,加入如下语句:
export SCALA_HOME=/usr/local/scala export PATH=$PATH:$SCALA_HOME/bin
1.2.3 配置SSH免密码登录
在分布式系统中,如Hadoop与Spark,通常使用SSH(安全协议,Secure Shell)服务来启动Slave节点上的程序,当节点数量比较大时,频繁地输入密码进行身份认证是一项非常艰难的体验。为了简化这个问题,可以使用”公私钥”认证的方式来达到SSH免密码登录。
首先在Master节点上创建一对公私钥(公钥文件:~/.ssh/id_rsa.pub;私钥文件:~/.ssh/id_rsa),然后把公钥拷贝到Worker节点上(~/.ssh/authorized_keys)。二者交互步骤如下:
1)Master通过SSH连接Worker时,Worker生成一个随机数然后用公钥加密后,发回给Master。
2)Master收到加密数后,用私钥解密,并将解密数回传给Worker。
3)Worker确认解密数正确之后,允许Master连接。
如果配置好SSH免密码登录之后,在以上交互中就无须用户输入密码了。下面介绍安装与配置过程。
1)安装SSH: yum install ssh
2)生成公私钥对: ssh-keygen -t rsa
一直按回车键,不需要输入。执行完成后会在~/.ssh目录下看到已生成id_rsa.pub与id_rsa两个密钥文件。其中id_rsa.pub为公钥。
3)拷贝公钥到Worker机器: scp ~/.ssh/id_rsa.pub <用户名>@<worker机器ip>:~/. ssh
4)在Worker节点上,将公钥文件重命名为authorized_keys: mv id_rsa.pub auth-orized_keys。类似地,在所有Worker节点上都可以配置SSH免密码登录。
1.2.4 Hadoop的安装配置
登录Hadoop官网(http://hadoop.apache.org/releases.html)下载Hadoop 2.6.0安装包hadoop-2.6.0.tar.gz。然后解压至本地指定目录。
tar zxvf hadoop-2.6.0.tar.gz -C /usr/local ln -s hadoop-2.6.0 hadoop
下面讲解Hadoop的配置。
1)打开/etc/profile,末尾加入:
export HADOOP_INSTALL=/usr/local/hadoop export PATH=$PATH:$HADOOP_INSTALL/bin export PATH=$PATH:$HADOOP_INSTALL/sbin export HADOOP_MAPRED_HOME=$HADOOP_INSTALL export HADOOP_COMMON_HOME=$HADOOP_INSTALL export HADOOP_HDFS_HOME=$HADOOP_INSTALL export YARN_HOME=$HADOOP_INSTALL
执行 __source /etc/profile__使其生效,然后进入Hadoop配置目录:/usr/local/hadoop/etc/hadoop,配置Hadoop。
2)配置hadoop_env.sh。
export JAVA_HOME=/usr/lib/jvm/java-1.7
3)配置core-site.xml。
<property> <name>fs.defaultFS</name> <value>hdfs://Master:9000</value> </property> <property> <name>hadoop.tmp.dir</name> <value>file:/root/bigdata/tmp</value> </property> <property> <name>io.file.buffer.size</name> <value>131702</value> </property>
4)配置yarn-site.xml。
<property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.nodemanager.auxservices.mapreduce.shuffle.class</name> <value>org.apache.hadoop.mapred.ShuffleHandler</value> </property> <property> <name>yarn.resourcemanager.address</name> <value>Master:8032</value> </property> <property> <name>yarn.resourcemanager.scheduler.address</name> <value>Master:8030</value> </property> <property> <name>yarn.resourcemanager.resource-tracker.address</name> <value>Master:8031</value> </property> <property> <name>yarn.resourcemanager.admin.address</name> <value>Master:8033</value> </property> <property> <name>yarn.resourcemanager.webapp.address</name> <value>Master:8088</value> </property>
5)配置mapred-site.xml。
<property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <property> <name>mapreduce.jobhistory.address</name> <value>Master:10020</value> </property> <property> <name>mapreduce.jobhistory.webapp.address</name> <value>Master:19888</value> </property>
6)创建namenode和datanode目录,并配置路径。
① 创建目录。
mkdir -p /hdfs/namenode mkdir -p /hdfs/datanode
② 在hdfs-site.xml中配置路径。
<property> <name>dfs.namenode.name.dir</name> <value>file:/hdfs/namenode</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>file:/hdfs/datanode</value> </property> <property> <name>dfs.replication</name> <value>3</value> </property> <property> <name>dfs.namenode.secondary.http-address</name> <value>Master:9001</value> </property> <property> <name>dfs.webhdfs.enabled</name> <value>true</value> </property>
7)配置slaves文件,在其中加入所有从节点主机名,例如:
x.x.x.x worker1 x.x.x.x worker2 ……
8)格式化namenode:
/usr/local/hadoop/bin/hadoop namenode -format
至此,Hadoop配置过程基本完成。
1.2.5 Spark的安装部署
登录Spark官网下载页面(http://spark.apache.org/downloads.html)下载Spark。这里选择最新的Spark 1.5.0版spark-1.5.0-bin-hadoop2.6.tgz(Pre-built for Hadoop2.6 and later)。
然后解压spark安装包至本地指定目录:
tar zxvf spark-1.5.0-bin-hadoop2.6.tgz -C /usr/local/ ln -s spark-1.5.0-bin-hadoop2.6 spark
下面让我们开始Spark的配置之旅吧。
1)打开/etc/profile,末尾加入:
export SPARK_HOME=/usr/local/spark PATH=$PATH:${SPARK_HOME}/bin
关闭并保存profile,然后命令行执行source /etc/profile使配置生效。
2)打开/etc/hosts,加入集群中Master及各个Worker节点的ip与hostname配对。
x.x.x.x Master-name x.x.x.x worker1 x.x.x.x worker2 x.x.x.x worker3 ……
3)进入/usr/local/spark/conf,在命令行执行:
cp spark-env.sh.template spark-env.sh vi spark-env.sh
末尾加入:
export JAVA_HOME=/usr/lib/jvm/java-1.7 export SCALA_HOME=/usr/local/scala export SPARK_MASTER_IP=112.74.197.158<以本机为例> export SPARK_WORKER_MEMORY=1g
保存并退出,执行命令:
cp slaves.template slaves vi slaves
在其中加入各个Worker节点的hostname。这里以四台机器(master、worker1、worker2、worker3)为例,那么slaves文件内容如下:
worker1 worker2 worker3
1.2.6 Hadoop与Spark的集群复制
前面完成了Master主机上Hadoop与Spark的搭建,现在我们将该环境及部分配置文件从Master分发到各个Worker节点上(以笔者环境为例)。在集群环境中,由一台主机向多台主机间的文件传输一般使用pssh工具来完成。为此,在Master上建立一个文件workerlist.txt,其中保存了所有Worker节点的IP,每次文件的分发只需要一行命令即可完成。
1)复制JDK环境:
pssh -h workerlist -r /usr/lib/jvm/java-1.7 /
2)复制scala环境:
pssh -h workerlist -r /usr/local/scala /
3)复制Hadoop:
pssh -h workerlist -r /usr/local/hadoop /
4)复制Spark环境:
pssh -h workerlist -r /usr/local/spark /
5)复制系统配置文件:
pssh -h workerlist /etc/hosts / pssh -h workerlist /etc/profile /
至此,Spark Linux集群环境搭建完毕。