最近想做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

这样默认设置的问题是,当安装多个虚机后,造成系统盘占用很厉害。

      解决方法:通过更改虚拟硬盘存放目录,将其放到一个大空间的磁盘上。

Spark环境部署及编程实践心得体会_hadoop

2.2 Centos7系统安装

1)在VirtualBox中,新建虚拟电脑实例

 a. 启动VirtualBox,点击新建,在弹出的窗口中,填写虚拟电脑名称,并选择系统类型,如下图所示:

Spark环境部署及编程实践心得体会_spark_02

b. 为虚拟电脑分配内存大小

Spark环境部署及编程实践心得体会_Spark环境部署及编程实践心得体会_03

c. 创建虚拟硬盘

Spark环境部署及编程实践心得体会_spark_04

Spark环境部署及编程实践心得体会_virtualbox_05

Spark环境部署及编程实践心得体会_virtualbox_06

Spark环境部署及编程实践心得体会_spark_07

到这里,在virtualbox的虚拟电脑列表中就能看到刚刚建立的虚拟电脑了,如下图所示:

Spark环境部署及编程实践心得体会_虚拟机_08

2)安装centos7操作系统

双击Centos7,在弹出的窗口中,选着Centos7系统的安装程序,点击启动就可以开始安装系统,后续安装过程和正常安装Centos7系统一样。具体可参考:http://www.linuxidc.com/Linux/2016-09/135593.htm

Spark环境部署及编程实践心得体会_虚拟机_09

补充:安装增强功能

       选择“设备”,在其下拉列表的最后一项为“安装增强功能...”,点击即可。

       然后,以root用户进入centos系统,在计算机(computer)选项卡中,找到光驱图标(名称一般为VBox_GAs_*.*),如下图示所示。然后,点击打开。

Spark环境部署及编程实践心得体会_虚拟机_10

      选择“VBoxLinuxAdditions.run”,如下图所示。双击执行,自动完成安全。

Spark环境部署及编程实践心得体会_spark_11

设置共享目录,如下图所示

Spark环境部署及编程实践心得体会_spark_12

2.3 实现虚拟机访问互联网及多台虚拟机之间无密码访问

1)虚拟网卡设置

      主要是为虚拟机配置两块虚拟网卡,一个采用NAT方式,一个采用Host-only方式,如下面所示,配置好就可以了。两者有什么区别呢?不是很清楚,这里就不解释了。

Spark环境部署及编程实践心得体会_virtualbox_13

Spark环境部署及编程实践心得体会_virtualbox_14

2)虚拟主机设置

启动Centos7系统,输入密码登陆后,完成如下设置。

a. 更改用户的权限

打开终端,切换到root账户,编辑/etc/sudoers文件,找到root  ALL=(ALL)    ALL这一行,然后添加一行,比如xhcentos7 ALL=(ALL)    ALL,xhcentos7表示要赋予root权限的用户。

Spark环境部署及编程实践心得体会_虚拟机_15

b.设置主机名

打开终端,编辑/etc/sysconfig/network,进行下图设置:

Spark环境部署及编程实践心得体会_Spark环境部署及编程实践心得体会_16

c. 设置ip和主机名映射

    打开终端,编辑/etc/hosts,添加集群中所有主机的ip和主机名映射(每一台虚拟电脑的设置相同),本文配置的三台虚拟主机的ip和主机名设置如下:

Spark环境部署及编程实践心得体会_Spark环境部署及编程实践心得体会_17

  

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健就可以了。如下图:

Spark环境部署及编程实践心得体会_虚拟机_18

       (2)进入.ssh目录,cd ~/.ssh,通过密钥文件生成授权文件:cat id_rsa.pub>>authorized_keys,此时可以通过使用ssh无密码登陆本机了。

Spark环境部署及编程实践心得体会_spark_19

  (3)然后,将该虚拟电脑复制2份,我这里是搭建1个master和2个slaver的集群,如果需要可以复制多份。

Spark环境部署及编程实践心得体会_hadoop_20

 

(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环境变量,如下图所示:

Spark环境部署及编程实践心得体会_hadoop_21

每台机器都做一遍,后悔啊!

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


    运行测试:



Spark环境部署及编程实践心得体会_虚拟机_22


运行 自带的example,在hadoop根目录下新建input目录,并将待分析文件放到该目录下,然后执行:

         ./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0.jar

Spark环境部署及编程实践心得体会_hadoop_23

 


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的存在。

Spark环境部署及编程实践心得体会_Spark环境部署及编程实践心得体会_24

 

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会显示如下结果(单机版):

Spark环境部署及编程实践心得体会_virtualbox_25

分布式情况下,主节点情况如下:

6816 SecondaryNameNode
 6466 NameNode
 7476 Jps
 7414 Master从节点:
6816 Worker
 6529 DataNode
 7339 Jps

打开浏览器,输入xhs5m:8080会显示如下结果:

Spark环境部署及编程实践心得体会_虚拟机_26