搭建Spark集群

作者: symsimmy | 来源:发表于2018-03-25 19:48 被阅读0次

    创建hadoop用户

    #添加用户hadoop
    adduser hadoop
    

    这个过程中需要输入密码两次

    Enter new UNIX password: 
    Retype new UNIX password: 
    passwd: password updated successfully
    

    看到最后的字样就代表新建hadoop用户成功.
    如果需要删除用户,使用下面的命令

    userdel hadoop
    

    把hadoop用户加入sudo用户组,编辑/etc/sudoers文件

    sudo vi /etc/sudoers
    

    然后在

    root ALL=(ALL) ALL
    

    后面加入

    hadoop ALL=(ALL) ALL
    

    注: 两个用户创建命令之间的区别
    adduser: 会自动为创建的用户指定主目录、系统shell版本,会在创建时输入用户密码。
    useradd:需要使用参数选项指定上述基本设置,如果不使用任何参数,则创建的用户无密码、无主目录、没有指定shell版本。

    下载所需要用到的工具包,并上传到hadoop用户目录

    需要用到的工具包包括java,hadoop,scala,spark,.
    这里我使用的各工具包的版本为

    名称 版本号
    Java jdk-8u161-linux-x64.tar.gz
    hadoop hadoop-3.0.0.tar.gz
    scala scala-2.11.8.tgz
    spark spark-2.3.0-bin-hadoop2.7.tgz

    这里我们先在其中一台机器上安装所有的工具包,然后使用scp命令将配置好的工具包同步到其余的服务器.
    为了方便,我这里是先在windows机器上用FDM把所有的软件工具包下载好,然后使用ftp推送到服务器上的,由于是内网环境,所有上传带宽还不错,很快就上传完成了!

    具体如下:


    注解:类似的工具有rsync;scp消耗资源少,不会提高多少系统负荷,在这一点上,rsync就远远不及它了。rsync比scp会快一点,但当小文件多的情况下,rsync会导致硬盘I/O非常高,而scp基本不影响系统正常使用。

    安装java

    :包括下面的spark,hadoopscala我都放在/usr/local目录,这是个人习惯问题,你也可以放在其他目录

    解压并移动至/us/local目录

    tar -zxvf jdk-8u161-linux-x64.tar.gz
    mv jdk1.8.0_161 /usr/local
    

    设置环境变量

    export JAVA_HOME=/usr/local/jdk1.8.0_161
    export JRE_HOME=$JAVA_HOME/jre
    export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
    export PATH=$JAVA_HOME/bin:$PATH
    

    安装hadoop

    解压并移动至/us/local目录

    tar -zxvf hadoop-3.0.0.tar.gz
    mv hadoop-3.0.0 /usr/local
    

    设置环境变量

    export HADOOP_HOME=/usr/local/hadoop-3.0.0
    export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
    export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib/native"
    export PATH=$HADOOP_HOME/bin:$PATH
    export PATH=$HADOOP_HOME/sbin:$PATH
    

    安装scala

    解压并移动至/us/local目录

    tar -zxvf scala-2.11.8.tgz
    mv scala-2.11.8 /usr/local
    

    设置环境变量

    export SCALA_HOME=/usr/local/scala-2.11.8
    export PATH=$SCALA_HOME/bin:$PATH
    

    安装spark

    解压并移动至/us/local目录

    tar -zxvf spark-2.3.0-bin-hadoop2.7.tgz
    mv spark-2.3.0-bin-hadoop2.7 /usr/local
    

    设置环境变量

    export SPARK_HOME=/usr/local/spark-2.3.0-bin-hadoop2.7
    export PATH=$SPARK_HOME/bin:$PATH
    

    复制所有的环境变量到~/.profile

    export JAVA_HOME=/usr/local/jdk1.8.0_161
    export JRE_HOME=$JAVA_HOME/jre
    export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
    export PATH=$JAVA_HOME/bin:$PATH
    export SCALA_HOME=/usr/local/scala-2.11.8
    export PATH=$SCALA_HOME/bin:$PATH
    export SPARK_HOME=/usr/local/spark-2.3.0-bin-hadoop2.7
    export PATH=$SPARK_HOME/bin:$PATH
    export HADOOP_HOME=/usr/local/hadoop-3.0.0
    export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
    export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib/native"
    export PATH=$HADOOP_HOME/bin:$PATH
    export PATH=$HADOOP_HOME/sbin:$PATH
    

    然后执行

    source ~/.profile
    

    :如果这里不配置的话,在hadoop3.0.0下面会出现以下的错误


    虽然里面的JAVA_HOME /usr/local/jdk-8u161-linux-x64这个是因为我设错了,就因为这个我还排查了大半天,结果在这里还用上了,汗.....

    报错:pc: ERROR: JAVA_HOME is not set and could not be found.

    在hadoop-env.sh中,再显示地重新声明一遍JAVA_HOME,添加:

    export JAVA_HOME=/usr/local/jdk1.8.0_161
    

    配置集群服务器参数

    我们这里用到的是三台服务器,一台master,两台slave.三台机器的名称和ip如下:

    主机名称 ip地址
    master 10.141.211.80
    slave01 10.141.211.81
    slave02 10.141.211.82

    三台电脑主机的用户名均为hadoop.
    三台机器可以ping双方的ip来测试三台电脑的连通性。
    在master节点主机上的Shell中运行如下命令,测试能否连接到slave01节点主机

    # -c 后面接的参数代表ping操作执行的次数
    ping 10.141.211.81 -c 3
    

    如果出现如下图,说明连接成功


    为了更好的在Shell中区分三台主机,修改其显示的主机名,执行如下命令

    sudo vim /etc/hostname
    

    master的/etc/hostname添加如下配置:

    master
    

    同样slave01的/etc/hostname添加如下配置:

    slave01
    

    同样slave02的/etc/hostname添加如下配置:

    slave02
    

    :如果已经hostname文件中已经存在名称,则删除原有的名称

    重启三台电脑,重启后在终端Shell中才会看到机器名的变化,如下图:



    修改三台机器的/etc/hosts文件,添加同样的配置:

    sudo vim /etc/hosts
    

    配置如下:

    127.0.0.1 localhost master
    127.0.1.1 master #相应的改为slave01,或slave02 
    10.141.211.80 master
    10.141.211.81 slave01
    10.141.211.82 slave02
    

    : 127.0.0.1 localhost master这里增加master是为了这里是为了解决sudo: unable to resolve host slave01: Connection refused

    配置ssh免密码登陆

    先测试一下是否可以通过ssh登录本机

    ssh localhsot
    

    如果输入密码之后,登录成功,则代表可行,直接下一步配置免密码即可.否则,需要下载openssh-server

    #通过apt下载ssh-verser
    sudo apt install openssh-server -y
    

    然后重复上面的验证过程.
    接下来配置免密码登录

    • ssh-keygen创建公钥
    ssh-keygen -t rsa
    

    输入后,会提示创建.ssh/id_rsa、id_rsa.pub的文件,其中第一个为密钥,第二个为公钥。过程中会要求输入密码,为了ssh访问过程无须密码,可以直接回车 。

    • 复制公钥到authrized_keys文件中
    cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
    

    在保证了三台主机电脑都能连接到本地localhost后,还需要让master主机免密码登录slave01和slave02主机。在master执行如下命令,将master的id_rsa.pub传送给两台slave主机。

    scp ~/.ssh/id_rsa.pub hadoop@slave01:/home/hadoop/
    scp ~/.ssh/id_rsa.pub hadoop@slave02:/home/hadoop/
    

    在slave01,slave02主机上分别运行ls命令

    ls ~
    

    可以看到slave01、slave02主机分别接收到id_rsa.pub文件



    接着在slave01、slave02主机上将master的公钥加入各自的节点上,在slave01和slave02执行如下命令:

    cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
    rm ~/id_rsa.pub
    

    如果master主机和slave01、slave02主机的用户名一样,那么在master主机上直接执行如下测试命令,即可让master主机免密码登录slave01、slave02主机。

    ssh slave01
    

    如果master主机和slave01主机的用户名不一样,还需要在master修改~/.ssh/config文件,如果没有此文件,自己创建文件。

    Host master
      user Ruanrc
    Host slave01
      user hadoop
    

    然后master主机再执行免密码登录:

    ssh slave01
    

    Hadoop集群配置

    修改master主机修改Hadoop如下配置文件,这些配置文件都位于/usr/local/hadoop-3.0.0/etc/hadoop目录下。

    workers(hadoop3.0.0中将slaves文件改为了workers文件)
    这里把DataNode的主机名写入该文件,每行一个。这里让master节点主机仅作为NameNode使用。

    slave01
    slave02
    

    :这里需要删除workers文件中原来的localhost

    core-site.xml

    <configuration>
        <property>
            <name>hadoop.tmp.dir</name>
            <value>file:/usr/local/hadoop-3.0.0/tmp</value>
            <description>Abase for other temporary directories.</description>
        </property>
        <property>
            <name>fs.defaultFS</name>
            <value>hdfs://master:9000</value>
        </property>
    </configuration>
    

    hdfs-site.xml

    <configuration>
      <property>
          <name>dfs.replication</name>
          <value>3</value>
      </property>
       <property> 
          <name>dfs.name.dir</name> 
          <value>file:/home/hadoop/hadoop/namenode</value> 
       </property> 
       <property> 
          <name>dfs.data.dir</name>
          <value>file:/home/hadoop/hadoop/datanode</value > 
       </property>
    
      </configuration>
    

    mapred-site.xml

    <configuration>
      <property>
          <name>mapreduce.framework.name</name>
          <value>yarn</value>
      </property>
    </configuration>
    

    yarn-site.xml

    <configuration>
    <!-- Site specific YARN configuration properties -->
        <property>
            <name>yarn.nodemanager.aux-services</name>
            <value>mapreduce_shuffle</value>
        </property>
        <property>
            <name>yarn.resourcemanager.hostname</name>
            <value>master</value>
        </property>
    </configuration>
    

    :以上修改的文件需要在所有slave服务器上同步,使用前面的scp命令即可

    同步配置文件

    scp etc/hadoop/workers hadoop@slave01:/usr/local/hadoop-3.0.0/etc/hadoop
    scp etc/hadoop/workers  hadoop@slave02:/usr/local/hadoop-3.0.0/etc/hadoop
    
    scp etc/hadoop/core-site.xml hadoop@slave01:/usr/local/hadoop-3.0.0/etc/hadoop
    scp etc/hadoop/core-site.xml hadoop@slave02:/usr/local/hadoop-3.0.0/etc/hadoop
    
    scp etc/hadoop/hdfs-site.xml hadoop@slave01:/usr/local/hadoop-3.0.0/etc/hadoop
    scp etc/hadoop/hdfs-site.xml hadoop@slave02:/usr/local/hadoop-3.0.0/etc/hadoop
    
    scp etc/hadoop/mapred-site.xml hadoop@slave01:/usr/local/hadoop-3.0.0/etc/hadoop
    scp etc/hadoop/mapred-site.xml hadoop@slave02:/usr/local/hadoop-3.0.0/etc/hadoop
    
    scp etc/hadoop/yarn-site.xml hadoop@slave01:/usr/local/hadoop-3.0.0/etc/hadoop
    scp etc/hadoop/yarn-site.xml hadoop@slave02:/usr/local/hadoop-3.0.0/etc/hadoop
    

    启动hadoop集群

    启动hadoop集群
    在master主机上执行如下命令:

    cd /usr/local/hadoop-3.0.0
    hdfs namenode -format
    start-all.sh
    

    运行后,在master,slave01,slave02运行jps命令,查看:

    jps
    

    master运行jps后,如下图:



    slave01运行jps后,如下图:



    slave02运行jps后,如下图:

    从上面的截图不难看出,master节点正常启动了namenode,slave01和slave02节点正常启动了datanode

    spark集群配置

    把spark作为master节点,两个slave01,slave02作为worker节点
    在master节点主机上进行如下操作:

    1. 编辑slaves
      将slaves.template copy到slaves
    cd $SPARK_HOME/conf
    cp slaves.template slaves
    

    slaves文件设置Worker节点。编辑slaves内容,把默认内容localhost替换成如下内容:

    slave01
    slave02
    
    1. 编辑spark-env.sh
      将 spark-env.sh.template 拷贝到 spark-env.sh
    cp spark-env.sh.template spark-env.sh
    

    编辑spark-env.sh,添加以下内容

    export SPARK_DIST_CLASSPATH=$(/usr/local/hadoop-3.0.0/bin/hadoop classpath)
    export HADOOP_CONF_DIR=/usr/local/hadoop-3.0.0/etc/hadoop
    export SPARK_MASTER_IP=10.141.211.80
    #参考我的另一篇文章,缺少该配置,会找不到worker节点
    export SPARK_MASTER_HOST=10.141.211.80
    

    SPARK_MASTER_IP 指定 Spark 集群 master 节点的 IP 地址;
    配置好后,将master主机上的/usr/local/spark文件夹复制到各个节点上。
    scp大法好!!!

    启动spark集群

    启动spark集群前,要先启动Hadoop集群。在master节点主机上运行如下命令:

    $HADOOP_HOME/sbin/start-all.sh
    

    启动spark集群

    1. 启动master节点
      在master节点主机上运行如下命令:
    $SPARK_HOME/sbin/start-master.sh
    
    1. 启动所有slave节点
      在master节点主机上运行如下命令:
    $SPARK_HOME/sbin/start-slaves.sh
    

    报错:Spark 启动时,提示 JAVA_HOME not set
    在sbin目录下的spark-config.sh 中添加对应的jdk 路径

    export JAVA_HOME=/usr/local/jdk1.8.0_161
    

    分别slave01、slave02节点上运行jps命令,可以看到多了个Worker进程



    输入http://10.141.211.80:7077/即可查看网页端
    40)

    参考教程

    相关文章

      网友评论

        本文标题:搭建Spark集群

        本文链接:https://www.haomeiwen.com/subject/vrvaqftx.html