最近想做spark开发,于是就动手搭建spark集群环境,由于没有服务器可用,只能采用在个人pc上采用虚机这种形式,捣鼓了两天终于将spark集群搭建起来了,先将详细的搭建过程做一下记录,以备之后查询。如果你不小心看到来了这篇文章,希望能给你带来帮助。但是,就本人观读别人笔记的经验,多半还是会有问题,毕竟每个人所具备的软硬件环境不可能完全一样,搭建过程中的软件安装流程也不可能完全一样。
下面结合一些截图来详细说明具体搭建过程。
1. 必要软件准备
- VirtualBox:版本5.1.30, 直接百度,下载地址:http://rj.baidu.com/soft/detail/15321.html?ald,另外也可以去官网下载相应版本,官网软件下载地址为: https://www.virtualbox.org/wiki/Download_Old_Builds_5_1;
- Centos:版本:CentOS-7-x86_64-DVD-1511.iso,官网下载地址:http://vault.centos.org/7.2.1511/isos/x86_64/
- hadoop: 版本Hadoop2.6.0,下载地址:https://archive.apache.org/dist/hadoop/common/hadoop-2.6.0/,下载 hadoop-2.6.0.tar.gz
- scala: 版本scala-2.11.8, 下载地址:http://www.scala-lang.org/download/2.11.8.html, 下载 scala-2.11.8.tgz
- spark: 版本spark2.2.0, 下载地址:http://spark.apache.org/downloads.html,下载spark-2.2.0-bin-hadoop2.6.tgz
- jdk:版本JDK1.8.0_91,下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html
这些地址还是很重要的,不用每次都搜索下载源啦!
2. 基础准备
2.1 VirualBox安装与配置
这个基本上没什么可说的,本 人用的win10系统,双机安装,一路next就可以了。给个安装参考:http://www.jb51.net/article/94065.htm
这样默认设置的问题是,当安装多个虚机后,造成系统盘占用很厉害。
解决方法:通过更改虚拟硬盘存放目录,将其放到一个大空间的磁盘上。
2.2 Centos7系统安装
1)在VirtualBox中,新建虚拟电脑实例
a. 启动VirtualBox,点击新建,在弹出的窗口中,填写虚拟电脑名称,并选择系统类型,如下图所示:
b. 为虚拟电脑分配内存大小
c. 创建虚拟硬盘
到这里,在virtualbox的虚拟电脑列表中就能看到刚刚建立的虚拟电脑了,如下图所示:
2)安装centos7操作系统
双击Centos7,在弹出的窗口中,选着Centos7系统的安装程序,点击启动就可以开始安装系统,后续安装过程和正常安装Centos7系统一样。具体可参考:http://www.linuxidc.com/Linux/2016-09/135593.htm
补充:安装增强功能
选择“设备”,在其下拉列表的最后一项为“安装增强功能...”,点击即可。
然后,以root用户进入centos系统,在计算机(computer)选项卡中,找到光驱图标(名称一般为VBox_GAs_*.*),如下图示所示。然后,点击打开。
选择“VBoxLinuxAdditions.run”,如下图所示。双击执行,自动完成安全。
设置共享目录,如下图所示
2.3 实现虚拟机访问互联网及多台虚拟机之间无密码访问
1)虚拟网卡设置
主要是为虚拟机配置两块虚拟网卡,一个采用NAT方式,一个采用Host-only方式,如下面所示,配置好就可以了。两者有什么区别呢?不是很清楚,这里就不解释了。
2)虚拟主机设置
启动Centos7系统,输入密码登陆后,完成如下设置。
a. 更改用户的权限
打开终端,切换到root账户,编辑/etc/sudoers文件,找到root ALL=(ALL) ALL这一行,然后添加一行,比如xhcentos7 ALL=(ALL) ALL,xhcentos7表示要赋予root权限的用户。
b.设置主机名
打开终端,编辑/etc/sysconfig/network,进行下图设置:
c. 设置ip和主机名映射
打开终端,编辑/etc/hosts,添加集群中所有主机的ip和主机名映射(每一台虚拟电脑的设置相同),本文配置的三台虚拟主机的ip和主机名设置如下:
d. 关闭selinux
通过vi /etc/selinux/config打开文件编辑,将SELINUX=enforcing修改为SELINUX=disabled, 重启机器可生效。
e. 设置虚拟主机之间相互ssh免口令连接(会遇到莫名奇妙的问题,小心啊)
(1)切换回当前账户(如果当前是root用户),查看当前账户下是否存在.ssh目录(通过cd ~/.ssh,如果没有,会提示不存在,可通过mkdir创建,也可以不创建,在执行ssh-keygen -t rsa时会自动生成),然后通过ssh-keygen -t rsa为每个主机生成ssh密钥,遇到提示,直接按entor健就可以了。如下图:
(2)进入.ssh目录,cd ~/.ssh,通过密钥文件生成授权文件:cat id_rsa.pub>>authorized_keys,此时可以通过使用ssh无密码登陆本机了。
(3)然后,将该虚拟电脑复制2份,我这里是搭建1个master和2个slaver的集群,如果需要可以复制多份。
(4)最后一步啦,将所有test1,test2 节点上的id_rsa.pub通过scp拷贝到test 节点上,在test上,将所有公钥加到用于认证的公钥文件authorized_keys中,将公钥文件authorized_keys分发到test1,test2节点。(只是使用rsync -av 将authority_keys拷贝到其它节点,也可以了,有点懵逼啊,还是要多学习啊!)
注意:其实上述描述不一定能行,我就遇到了,第一次可以,第二次就不可以了。出现如下问题:
[hadoop@localhost .ssh]$ ssh xhp1
Agent admitted failure to sign using the key.
【不能成功配置ssh信任,提示Agent admitted failure to sign using the key】
不知道是什么原因?搜到一个解决方法如下:
[hadoop@local ~]$ ssh-add ~/.ssh/id_rsa
Identity added: /home/hadoop/.ssh/id_rsa (/home/hadoop/.ssh/id_rsa)
还是不行啊?又搜了一个解决方法如下:
[hadoop@local ~]$ chmod 600 ~/.ssh/authorized_keys
解决啦!我是一脸的懵逼啊!
3. 安装并配置JDK
首先,通过mkdir java在/usr下建立java目录,将jdk1.8.0_91.tar.gz拷贝到/usr/java目录下,执行tar -zxvf jdk1.8.0_91.tar.gz
配置jdk环境变量,编辑/etc/profile文件,添加java环境变量,如下图所示:
每台机器都做一遍,后悔啊!
4. 安装并配置Hadoop2.6.0
4.1 安装配置单机版hadoop
具体步骤:
(1)将hadoop-2.6.0.tar.gz拷贝到/usr/local目录下,
(2)执行tar -zxvf hadoop-2.6.0.tar.gz进行解压,
(3)通过mv hadoop-2.6.0 hadoop修改目录名,
(4)并通过chown -R test:test hadoop,修改hadoop目录的所属用户名和组;
(5)配置hadoop环境变量,修改/etc/profile,见”3安装并配置JDK“图。
修改etc/hadoop目录下的相关文件,具体配置如下:
(1)hadoop-env.sh,通过vi hadoop-env.sh做如下修改:
# The java implementation to use.
export JAVA_HOME=/usr/java/jdk1.8.0_91
(2)slaves,通过vi slaves做如下修改:
localhost
运行测试:
运行 自带的example,在hadoop根目录下新建input目录,并将待分析文件放到该目录下,然后执行:
./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0.jar
4.2 安装配置伪分布式hadoop
a. 修改hadoop-env.sh,在里面设置JAVA_HOME。
# The java implementation to use.
export JAVA_HOME=/usr/java/jdk1.8.0_91 b. 修改slaves。
localhost
c. 修改core-site.xml,通过vi core-site.xml进行编辑。
< configuration>
< property>
< name>fs.defaultFS</name>
< value>hdfs://localhost:9000/</value>
< /property>
< property>
< name>hadoop.tmp.dir</name>
< value>file://usr/local/hadoop/tmp</value>
< /property>
< /configuration>
d. 修改hdfs-site.xml,添加如下内容。
<configuration>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/usr/local/hadoop/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/usr/local/hadoop/dfs/data</value>
</property>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
e. 修改mapred-site.xml,添加如下内容。
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
f. yarn-site.xml,添加如下内容。
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>4.3 安装配置分布式hadoop
设置环境变量,通过vi修改/etc/profile,添加如下内容:
• export HADOOP_HOME=/usr/local/hadoop
• export HADOOP_INSTALL=$HADOOP_HOME
• export HADOOP_MAPRED_HOME=$HADOOP_HOME
• export HADOOP_COMMON_HOME=$HADOOP_HOME
• export HADOOP_HDFS_HOME=$HADOOP_HOME
• export YARN_HOME=$HADOOP_HOME
• export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
a. 修改hadoop-env.sh,在里面设置JAVA_HOME。
# The java implementation to use.
export JAVA_HOME=/usr/java/jdk1.8.0_91 b. 修改slaves。
test1 注:slave节点的主机名,如果有多台,就填写多行
c. 修改core-site.xml,通过vi core-site.xml进行编辑。
< configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000/</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/usr/local/hadoop//tmp</value>
</property> </configuration>
d. 修改hdfs-site.xml,添加如下内容。
< configuration>
< property>
< name>dfs.namenode.name.dir</name>
< value>file:/usr/local/hadoop/dfs/name</value>
< /property>
< property>
< name>dfs.datanode.data.dir</name>
< value>file:/usr/local/hadoop/dfs/data</value>
< /property>
< property>
< name>dfs.replication</name>
< value>1</value>
< property>
< name>dfs.namenode.name.dir</name>
< value>file:/usr/local/hadoop/dfs/name</value>
< /property>
< property>
< name>dfs.datanode.data.dir</name>
< value>file:/usr/local/hadoop/dfs/data</value>
< /property>
< property>
< name>dfs.replication</name> < value>1</value>
< /property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>master:50090</value><--主节点的主机名称及端口号 -->
</property>
< /configuration> e. 修改mapred-site.xml,添加如下内容。
< configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
f. yarn-site.xml,添加如下内容。
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.name</name>
</value>master</value><--主节点的主机名-->
</property>
< /configuration> g. mapred-site.xml,添加如下内容。
<configuration>
<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>
</configuration>
4.4 将配置好的hadoop文件夹分发给test1,注意权限问题。
scp -r hadoop test1:/usr/local/
4.5 启动hadoop
a. cd到hadoop的bin目录,先格式化namenode。
hdfs namenode -format
b. cd到hadoop的sbin目录
start-all.sh
c. 用jps命令查看hadoop进程。
在master上应该有:
26786 SecondaryNameNode
27077 ResourceManager
27333 Jps
26454 NameNode
在test1与test2上应该有:
6499 DataNode
6787 NodeManager
7147 Jps
并且,在master节点,浏览器输入 master:8088 能够访问hadoop管理界面,并看到slaves的存在。
5. 安装配置spark
由于spark可能会用到scala,所以需要安装scala,首先将scala,spark解压到/usr/local下,并分别重名为scala2118,spark22,然后配置环境变量,具体如下:
export SCALA_HOME=/usr/local/scala2118
export PATH=$PATH:$SCALA_HOME/bin
export SPARK_HOME=/usr/local/spark22
export PATH=$PATH:$SPARK_HOME/bin 配置spark,首先编辑spark-env.sh,具体如下:
export SCALA_HOME=/usr/local/scala2118
export JAVA_HOME=/usr/java/jdk1.8.0_91
export HADOOP_HOME=/usr/local/hadoop
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export SPARK_MASTER_HOST=xhs5m (主节点的主机名,如果是单节点模式,即为当前节点主机名)
#SPARK_DRIVER_MEMORY=512M
export SPARK_WORKER_MEMORY=1G
然后,编辑slaves,添加slave节点的主机名。
比如test1(主节点的主机名,如果是单节点模式,即为当前节点主机名)
启动spark集群和测试是否安装成功
首先启动hdfs,到hadoop安装目录的sbin目录下,通过执行start-dfs.sh来启动
其次,到spark安装目录的sbin目录下,通过执行start-all.sh来启动spark服务
查看是否启动成功,成功启动后,输入jps,会看到如下结果(单机版):
5763 DataNode
6132 SecondaryNameNode
5563 NameNode
6717 Jps
6575 Worker
打开浏览器,输入xhs5:8080会显示如下结果(单机版):
分布式情况下,主节点情况如下:
6816 SecondaryNameNode
6466 NameNode
7476 Jps
7414 Master从节点:
6816 Worker
6529 DataNode
7339 Jps
打开浏览器,输入xhs5m:8080会显示如下结果: