centos 上安装hadoop和spark 集群

要想在分布式上运行spark代码,就需要调用Hadoop的分布式文件系统。所以先安装hadoop软件。

下载hadoop和jdk

我下载的是hadoop3.0.0;其地址为:
http://www.apache.org/dyn/closer.cgi/hadoop/common/hadoop-3.0.0/hadoop-3.0.0.tar.gz

注意,这里强烈建议安装Java8版本的,不然后面运行spark 2.3.0会出现Warning提示,虽然不影响程序执行,但是总归不好呀。
下载的jdk8版本的地址为:
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

下载的jdk10.0.0,其地址为:
http://www.oracle.com/technetwork/java/javase/downloads/jdk10-downloads-4416644.html

注意,下载jdk时,需要点击接受认证,如果直接复制想要的版本的地址是下载不下来的,因为其下载地址需要带认证参数,可以在浏览器上点击下载,然后复制下载链接。

我的分布式机器主要有三台。为了后续操作方便,确保机器的hostname是我们想要的。可以用hostname 查看主机名,如果想要修改,输入hostname 主机名。我使用的master和slave1、slave2当我的三台机器的主机名。分别修改主机名,如下:

hostname master
hostname slave1
hostname slave2

为了防止机子重启后,hostname变回原来的,可以修改/etc/sysconfig/network文件中的HOSTNAME,

NETWORKING=yes
HOSTNAME=master

然后再执行:

hostname master

1、 修改/etc/hosts文件
三台机器的/etc/hosts文件都要修改。
往该文件中写入:IP hostname
例如:我的三台主机IP为:172.29.3.56和172.29.3.58、172.29.3.67

172.29.3.56 master
172.29.3.58 slave1
172.29.3.67 slave2

注意:这些内容需要写入这两台机器的/etc/hosts文件中。

配置完成后使用ping命令:

ping  -c 3  master

在master主机上:

ping  -c 3  slave1
ping  -c 3  slave2

2、给3个机器生成秘钥文件
以master为例,执行命令,生成空字符串的秘钥(后面要使用公钥),命令是:

ssh-keygen  -t   rsa   -P  ''

然后一直回撤;
~/.ssh 文件夹中生成id_rsa.pub文件
分别在其他机器上执行该命令。

3、在机器上创建authorized_keys文件
分别在3台机器上的~/.ssh 文件夹中执行touch authorized_keys,生成authorized_keys文件。
在authorized_keys文件中写入在上一步中这两台生成的id_rsa.pub中的内容。

当然如果机器很多,每台机器都要复制自己的和其他机器的id_rsa.pub中的内容,是很烦的事,可以直接拷贝到相应的文件夹。

1)将本地目录拷贝到远程
  scp -r 目录名 用户名@计算机IP或者计算机名称:远程路径2)从远程将目录拷回本地
  scp -r 用户名@计算机IP或者计算机名称:目录名本地路径

例如:
从远程将目录拷回本地:

scp -r root@172.29.3.56:/.ssh/authorized_keys /.ssh/

4、测试使用ssh进行无密码登录
在slave2中输入命令:

ssh   master


这里需要输入yes,然后机器master的登陆密码。

注意最后需要输入exit,不然以后的操作都是在机器master。

注意,必须要在其他机器上,进行相应的操作。这些机器才会相互连接。

经过上面的这些步骤,hadoop和jdk都应该下载好了。

5、 实现免密登陆:
在机器上编辑vim /etc/ssh/sshd_config
将下面语句前的#去掉。

#RSAAuthentication yes
#PubkeyAuthentication yes

安装jdk和hadoop

1、 安装jdk
先 解压jdk,由于我们使用wget下载文件,jdk文件名还带有非tar.gz的后缀,重命名就好了。
解压jdk文件。

 tar -xzvf jdk-10.0.1_linux-x64_bin.tar.gz 

2、安装之前,需要检查机器中是否有java版本,其版本是否符合需要。利用如下命令查看java版本。

java -version

然后键入:

rpm -qa | grep java

命令说明:

rpm   管理套件
-qa   使用询问模式,查询所有套件
grep  查找文件里符合条件的字符串
java   查找包含java字符串的文件

下面几个可以删除(将这些删除了,就算卸载了Java版本,然后改下配置文件/etc/profile):

java-1.7.0-openjdk-1.7.0.45-2.4.3.3.el6.x86_64
java-1.6.0-openjdk-1.6.0.0-1.66.1.13.0.el6.x86_64

而noarch文件可以不用删除。
现在删除文件:

rpm -e --nodeps java-1.7.0-openjdk-1.7.0.45-2.4.3.3.el6.x86_64
rpm -e --nodeps java-1.6.0-openjdk-1.6.0.0-1.66.1.13.0.el6.x86_64

命令介绍:
rpm     管理套件
-e     删除指定的套件
–nodeps  不验证套件档的相互关联性
然后再键入java -version,就会找不到相关文件。
如果还没有删除,则用yum -y remove去删除他们。
必须先删除以前的旧版本,新版本才能生效。

3、 修改配置文件
jdk8的配置文件 /etc/profile添加如下内容:

export  JAVA_HOME=/opt/jdk1.8.0_181
export  JRE_HOME=/opt/jdk1.8.0_181/jre
export  CLASSPATH=$CLASSPATH:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
export  PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin

jdk10的配置文件 /etc/profile添加如下内容:

export JAVAHOME=/opt/jdk-10.0.1

export  CLASSPATH=$:CLASSPATH:$JAVAHOME/lib/

export  PATH=$PATH:$JAVAHOME/bin

CentOS6上面的是JAVAHOME,CentOS7是$JAVA_HOME

/opt/jdk-10.0.1是jdk解压过后的所在文件夹,当然其可以再其他文件夹里,不一定要在opt文件夹里。

修改了/etc/profile文件后,需要把这个文件里保存的命令执行一次,执行命令 source /etc/profile 回车。

注意:需要再其他机器运行安装jdk步骤。

4、安装hadoop文件
首先进入hadoop压缩包的所在文件夹,解压文件:

cd /opt/
tar -xzf hadoop-3.0.0.tar.gz

重要说明:在Hadoop中有两种节点,分别是NameNodeDataNode
1)NameNode负责集群中与存储相关的调度,NameNode维护了整个文件系统的元数据信息,这些信息以两种形式的文件存储,一种是镜像文件(image文件),另一种是编辑日志(edit log)。NameNode会在文件系统启动时,动态地加载这些文件到内存中以响应客户端的读写请求。
NameNode的安全模式:在启动NameNode后,它会进入安全模式,所谓“安全模式”是指,在此期间它会接收DataNode的心跳包及块的状态信息,以此来判断块的副本安全性。在达到一定比例的块副本安全性时,NameNode将退出安全模式。

2)DataNode负责具体的存储任务。DataNode用来执行具体的存储任务:存储文件块。另外它也会定时的通过心跳向NameNode报告自己的状态(包括存储的文件块的信息)。
NameNode的安全保障:NameNode的作用在HDFS的集群中显而易见。一般而言,有两种机制来保证其自身及其上数据的安全。一种是同步转储其上的元数据文件,另一种是采用Secondary NameNode。

所以本文是将master作为NameNode,slave1和slave2作为DataNode。虽然NameNode和DataNode可以共存一台机器,但是这样做有一定的弊端。
比如:hadoop集群重要的是保证namdenode的长期稳定运行,把datanode放在namenode上,增加了namenode的负担,datanode占用大量的磁盘io,网络流量可能导致hdfs响应慢,错误率增加,要进行大量错误恢复,这影响集群的稳定性。

4.1、 修改/etc/profile配置文件
在/etc/profile文件中,添加如下内容。

export HADOOP_HOME=/opt/hadoop-3.0.0/
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOM
export YARN_HOME=$HADOOP_HO
export HADOOP_ROOT_LOGGER=INFO,console
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_COMMON_LIB_NATIVE_DIR:$HADOOP_HOME/lib"

4.2、新建目录
在几台机器上新建一下目录,这些目录会在下面的配置文件中使用到:

mkdir  /root/hadoop
mkdir  /root/hadoop/tmp
mkdir  /root/hadoop/var
mkdir  /root/hadoop/dfs
mkdir  /root/hadoop/dfs/name
mkdir  /root/hadoop/dfs/data

4.3、修改hadoop-3.0.0文件目录下etc/hadoop/中的一系列配置文件

以下操作都在master上进行。

主要要修改的配资为:
- 修改core-site.xml
- 修改hadoop-env.sh
- 修改hdfs-site.xml
- 修改mapred-site.xml
- 修改workers文件
- 修改yarn-site.xml文件

关于hadoop配置文件的参数的含义,可以参考这篇博客

4.3.1. 修改core-site.xml

 修改/opt/hadoop-3.0.0/etc/hadoop/core-site.xml文件

<configuration>节点内加入配置:

```
  <poperty>

        <name>hadoop.tmp.dir</name>

        <value>file:/root/hadoop/tmp</value>

        <description>Abase for other temporary directories.</description>

   </property>

   <property>

        <name>fs.defaultFS</name>

        <value>hdfs://master:9000</value>

   </property>
   <property>

        <name>hadoop.native.lib</name>

        <value>true</value>

        <description>Should native hadoop libraries, if present, be used.</description>

   </property>
```

注意:以前默认的fs.default.name已经不再使用,如果还在使用,该9000端口不会被启动,要使用fs.defaultFS,端口9000才会被启动。
查看端口被启动的命令是:netstat -lent

4.3.2. 修改hadoop-env.sh

 修改/opt/hadoop-3.0.0/etc/hadoop/hadoop-env.sh文件

  将`export   JAVA_HOME=${JAVA_HOME}`
  修改为: `export   JAVA_HOME=/opt/jdk-10.0.1`

4.3.3. 修改hdfs-site.xml

修改/opt/hadoop/hadoop-2.8.0/etc/hadoop/hdfs-site.xml文件
在`<configuration>`节点内加入配置:
```
<property>

   <name>dfs.name.dir</name>

   <value>file:/root/hadoop/dfs/name</value>

   <description>Path on the local filesystem where theNameNode stores the namespace and transactions logs persistently.</description>

</property>

<property>

   <name>dfs.data.dir</name>

   <value>file:/root/hadoop/dfs/data</value>

   <description>Comma separated list of paths on the localfilesystem of a DataNode where it should store its blocks.</description>

</property>

<property>

   <name>dfs.replication</name>

   <value>2</value>

  <description>副本个数,配置默认是3,应小于datanode机器数量</description>

</property>

<property>

      <name>dfs.permissions</name>

      <value>True</value>

      <description>need permissions</description>

</property>
<property>

      <name>dfs.secondary.http-address</name>

      <value>master:9001</value>

    <description>secondary NameNode web管理端口</description>

</property>

<property>

      <name>dfs.namenode.http-address</name>

      <value>master:50070</value>

     <description>开启50070端口,不然web不能访问hadoop</description>
</property>

“`
说明:dfs.permissions配置为false后,可以允许不要检查权限就生成dfs上的文件,方便倒是方便了,但是你需要防止误删除,请将它设置为true,或者直接将该property节点删除,因为默认就是true。 dfs.replication参数是指定一个文件上传到hdfs上时创建几个副本,这里设置为创建2个副本,一般而言,最多创建3个副本基本上就行了。

注意:dfs.name.dir的value要使用完全路径:file:/root/hadoop/dfs/name;而不能使用 /root/hadoop/dfs/name,不然会报”common.Util: Path /root/hadoop/dfs/name should be specified as a URI in configuration files. Please update hdfs configuration.”错误

4.3.4. 修改mapred-site.xml

在以前Hadoop版本中,没有mapred-site.xml,而是有mapred-site.xml.template,需要将其复制后,重命名为mapred-site.xml。

<configuration>节点内加入配置:

```
<property>

   <name>mapred.job.tracker</name>

   <value>master:49001</value>

</property>

<property>

      <name>mapred.local.dir</name>

       <value>file:/root/hadoop/var</value>

</property>

<property>

       <name>mapreduce.framework.name</name>

       <value>yarn</value>

</property>
```
注意:mapred.job.tracker的值必须是NameNode节点的hostname。

4.3.5. 修改workers文件
在以前版本中,可能会是slaves文件,而不是workers文件。
将里面的localhost删除,添加如下内容,既DataNode节点的hostname:

slave1
slave2

4.3.6. 修改yarn-site.xml文件

在`<configuration>`节点内加入配置(注意了,内存根据机器配置越大越好,我这里由于机器原因只配置了1个G。)
注意:yarn.resourcemanager.hostname的值是NameNode的hostname。
```
<property>

        <name>yarn.resourcemanager.hostname</name>

        <value>master</value>

   </property>

   <property>

        <description>The address of the applications manager interface in the RM.</description>

        <name>yarn.resourcemanager.address</name>

        <value>${yarn.resourcemanager.hostname}:8032</value>

   </property>

   <property>

        <description>The address of the scheduler interface.</description>

        <name>yarn.resourcemanager.scheduler.address</name>

        <value>${yarn.resourcemanager.hostname}:8030</value>

   </property>

   <property>

        <description>The http address of the RM web application.</description>

        <name>yarn.resourcemanager.webapp.address</name>

        <value>${yarn.resourcemanager.hostname}:8088</value>

   </property>

   <property>

        <description>The https adddress of the RM web application.</description>

        <name>yarn.resourcemanager.webapp.https.address</name>

        <value>${yarn.resourcemanager.hostname}:8090</value>

   </property>

   <property>

        <name>yarn.resourcemanager.resource-tracker.address</name>

        <value>${yarn.resourcemanager.hostname}:8031</value>

   </property>

   <property>

        <description>The address of the RM admin interface.</description>

        <name>yarn.resourcemanager.admin.address</name>

        <value>${yarn.resourcemanager.hostname}:8033</value>

   </property>

   <property>

        <name>yarn.nodemanager.aux-services</name>

        <value>mapreduce_shuffle</value>

   </property>

   <property>

        <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>

        <value>org.apache.hadoop.mapred.ShuffleHandle</value>

   </property>

   <property>

        <name>yarn.scheduler.maximum-allocation-mb</name>

        <value>2048</value>

        <discription>每个节点可用内存,单位MB,默认8182MB</discription>

   </property>

   <property>

        <name>yarn.nodemanager.vmem-pmem-ratio</name>

        <value>2.1</value>

   </property>

   <property>

        <name>yarn.nodemanager.resource.memory-mb</name>

        <value>2048</value>

</property>

   <property>

        <name>yarn.nodemanager.vmem-check-enabled</name>

        <value>true</value>

</property>
```

节点解释:
1)yarn.nodemanager.vmem-pmem-ratio:任务每使用1MB物理内存,最多可使用虚拟内存量,默认是2.1。
2)yarn.nodemanager.resource.memory-mb:表示该节点上YARN可使用的物理内存总量,默认是8192(MB),注意,如果你的节点内存资源不够8GB,则需要调减小这个值,而YARN不会智能的探测节点的物理内存总量,由于其最小申请值是1024M,所以其值必须大于1024M 。
3) yarn.nodemanager.pmem-check-enabled:是否启动一个线程检查每个任务正使用的物理内存量,如果任务超出分配值,则直接将其杀掉,默认是true。其值必须大于1024M。
4) yarn.nodemanager.vmem-check-enabled:是否启动一个线程检查每个任务正使用的虚拟内存量,如果任务超出分配值,则直接将其杀掉,默认是true。
5)yarn.scheduler.minimum-allocation-mb:单个任务可申请的最少物理内存量,默认是1024(MB),如果一个任务申请的物理内存量少于该值,则该对应的值改为这个数。
6)yarn.scheduler.maximum-allocation-mb:单个任务可申请的最多物理内存量,默认是8192(MB)。

4.4、配置datanode节点
复制namedata节点既master的hadoop到其他DataNode节点上,

这是从namenode节点推送到datanode 节点的数据。

scp -r /opt/hadoop-3.0.0 root@172.29.3.58:/opt/hadoop-3.0.0

修改DataNode节点的/etc/profile文件,过程与master。

4.5、启动Hadoop
4.5.1 在namenode上执行初始化
因为hmaster是namenode,slave1和slave2是datanode,所以只需要对master进行初始化操作,也就是对hdfs进行格式化。
进入到master这台机器的/opt/hadoop/hadoop-3.0.0/bin目录,也就是执行命令:

cd   /opt/hadoop-3.0.0/bin

执行初始化脚本,也就是执行命令:

./hadoop  namenode  -format

初始化成功:

在执行的的过程中,可能会有警告信息出现,如WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable 信息,可以执行export HADOOP_ROOT_LOGGER=DEBUG,console
再次执行./hadoop namenode -format 命令时,可以看到起DEBUG信息,我出现的错误是系统缺少glibc_2.14 模块,可以参考这篇博客 安装glibc_2.14

还有可能出现以下错误:DEBUG util.NativeCodeLoader: Failed to load native-hadoop with error: java.lang.UnsatisfiedLinkError: no hadoop in java.library.path: [/lib]
该错位的解决办法是:
/etc/profile 中加入

export ADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.library.path=$ADOOP_COMMON_LIB_NATIVE_DIR"

格式化成功后,可以在看到在/root/hadoop/dfs/name/目录多了一个current目录,而且该目录内有一系列文件。

4.5.2、在namenode上执行启动命令
因为hmaster是namenode,slave1和slave2是datanode,所以只需要对master执行启动命令即可。
进入到master这台机器的/opt/hadoop-3.0.0/bin目录,也就是执行命令:

cd    /opt/hadoop-3.0.0/sbin

执行初始化脚本,也就是执行命令:

./start-all.sh

如果出现这类错误:

WARNING: HADOOP_SECURE_DN_USER has been replaced by HDFS_DATANODE_SECURE_USER. Using value of HADOOP_SECURE_DN_USER.
Starting namenodes on [master]

需要编辑以下两个文件:

vim sbin/start-dfs.sh
vim sbin/stop-dfs.sh

在里面添加以下内容:

HDFS_DATANODE_USER=root
HDFS_DATANODE_SECURE_USER=hdfs
HDFS_NAMENODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root

然后启动:sbin/start-yarn.sh ,如果成功,就略过下面步骤,如果出现以下错误:

Starting resourcemanager
ERROR: Attempting to operate on yarn resourcemanager as root
ERROR: but there is no YARN_RESOURCEMANAGER_USER defined. Aborting operation.
Starting nodemanagers
ERROR: Attempting to operate on yarn nodemanager as root
ERROR: but there is no YARN_NODEMANAGER_USER defined. Aborting operation.

要编辑以下文件:

vim sbin/start-yarn.sh 
vim sbin/stop-yarn.sh

添加以下内容:

YARN_RESOURCEMANAGER_USER=root
HADOOP_SECURE_DN_USER=yarn
YARN_NODEMANAGER_USER=root

安装spark

1、安装Spark依赖的Scala
我下载的scala版本是2.12.6版本。
解压过后,将文件夹放到/opt/文件夹里面。
1.1、配置系统环境
编辑/etc/profile这个文件,在文件中增加一行配置:

export SCALA_HOME=/opt/scala-2.12.6
export PATH=$PATH:$SCALA_HOME/bin

然后执行:source /etc/profile

验证Scala:scala -version

2、安装spark
2.1 下载spark
我下载的spark版本是2.3.0,由于我安装的hadoop版本是3.0的,所以要选择Pre-built for Apache Hadoop 2.7 and later选项。

spark-2.3.1版本下载地址是:http://mirrors.hust.edu.cn/apache/spark/spark-2.3.0/spark-2.3.0-bin-hadoop2.7.tgz

解压过后,将文件夹放到/opt/文件夹里面。并重命名为spark-2.3.0。

2.2、Spark相关的配置

2.2.1 系统环境配置
编辑/etc/profile这个文件,在文件中增加一行配置:

export SPARK_HOME=/opt/spark-2.3.0
export PATH=$PATH:$SPARK_HOME/bin

然后执行:source /etc/profile

注意:因为$SPARK_HOME/sbin目录下有一些文件名称和$HADOOP_HOME/sbin目录下的文件同名,为了避免同名文件冲突,这里不在PATH变量里添加$SPARK_HOME/sbin只添加了$SPARK_HOME/bin

2.2.2 配置conf目录下的文件
/opt/spark-2.3.0/conf目录下的文件进行配置。

  1. 新建spark-env.h文件
    以spark为我们创建好的模板创建一个spark-env.h文件,命令是:

    cp    spark-env.sh.template   spark-env.sh

    编辑spark-env.sh文件,在里面加入配置(具体路径以自己的为准):

    export SCALA_HOME=/opt/scala-2.12.6
    export JAVA_HOME=/opt/jdk-10.0.1
    export HADOOP_HOME=/opt/hadoop-3.0.0
    export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
    export SPARK_HOME=/opt/spark-2.3.0
    export SPARK_MASTER_IP=master
    export SPARK_EXECUTOR_MEMORY=512m
    export SPARK_WORKER_MEMORY=512m

    注意:SPARK_EXECUTOR_MEMORY数字要小心填写,不然后面有可能导致出现INFO TaskSchedulerImpl:54 - Adding task set 0.0 with 2 tasks
    2018-07-09 16:19:20 WARN TaskSchedulerImpl:66 - Initial job has not accepted any resources; check your cluster UI to ensure that workers are registered and have sufficient resources
    错误。

  2. 新建slaves文件
    以spark为我们创建好的模板创建一个slaves文件,命令是:

    cp    slaves.template   slaves

    编辑slaves文件,里面的内容为:

    slave1
    slave2

    一定要将slaves里面内容的localhost删除。

将master上配置好的spark-2.3.0文件夹,复制到slave1和slave2服务器上。
或者在master服务器上执行:

scp -r /opt/spark-2.3.0/ root@172.29.3.58:/opt/spark-2.3.0/  

2.3、启动和测试Spark集群
2.3.1 启动Spark
因为spark是依赖于hadoop提供的分布式文件系统的,所以在启动spark之前,先确保hadoop在正常运行。
在hadoop正常运行的情况下,在master(也就是hadoop的namenode,spark的marster节点)上执行命令:

cd /opt/spark-2.3.0/sbin
./start-all.sh

2.4、测试和使用Spark集群
2.4.1 访问Spark集群提供的URL
在浏览器里访问Mster机器,我的Spark集群里Master机器是master,IP地址是172.29.3.56,访问8080端口,URL是:http://172.29.3.56:8080/

2.4.2 使用单机local模式,运行Spark提供的计算圆周率的示例程序

cd /opt/spark-2.3.0
./bin/spark-submit  --class   org.apache.spark.examples.SparkPi  --master   local  examples/jars/spark-examples_2.11-2.3.0.jar

注意,可能会出现:

WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.apache.hadoop.security.authentication.util.KerberosUtil (file:/opt/spark-2.3.0/jars/hadoop-auth-2.7.3.jar) to method sun.security.krb5.Config.getInstance()
WARNING: Please consider reporting this to the maintainers of org.apache.hadoop.security.authentication.util.KerberosUtil
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release

这些提示信息,是因为我安装的java版本都太高了,比较合适的版本是Java是1.8.0版本的。

2.4.3 使用独立的Spark集群模式提交任务
这种模式也就是Standalone模式,使用独立的Spark集群模式提交任务,需要先启动Spark集群,但是不需要启动Hadoop集群。启动Spark集群的方法是见2.3。
执行命令,用Standalone模式运行计算圆周率的Demo:

cd /opt/spark-2.3.0
./bin/spark-submit   --class   org.apache.spark.examples.SparkPi   --master   spark://172.29.3.56:7077   examples/jars/spark-examples_2.11-2.3.0.jar

2.4.4 使用Spark 集群+Hadoop集群的模式提交任务
这种模式也叫On-Yarn模式,主要包括yarn-Client和yarn-Cluster两种模式。在这种模式下提交任务,需要先启动Hadoop集群,然后在启动Spark集群。
然后按照以下步骤进行:

注意需要关闭主从服务器上防火墙:

service iptables stop 
或永久关闭
chkconfig iptables on/off
  1. 用yarn-client模式执行计算程序
cd /opt/spark-2.3.0
 ./bin/spark-submit   --class  org.apache.spark.examples.SparkPi  --master  yarn-client    examples/jars/spark-examples_2.11-2.3.0.jar

在我安装的系统和版本中,还缺少了activation.jar,从http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-java-plat-419418.html#jaf-1.1-fr-oth-JPR 下载一个activation.jar,然后将其放到/opt/hadoop-3.0.0/share/hadoop/common/lib 中,然后重启Hadoop。

2.4.5 用yarn-cluster模式执行计算程序

cd /opt/spark-2.3.0
./bin/spark-submit  --class  org.apache.spark.examples.SparkPi  --master  yarn-cluster   examples/jars/spark-examples_2.11-2.3.0.jar

错误:Failed to cleanup staging dir hdfs://master:9000/user/root/.sparkStaging/application_1531122508332_0002
java.net.ConnectException: Call From master/172.29.3.56 to master:9000 failed on connection exception: java.net.ConnectException: Connection refused;

解决方法:
这是因为端口9000没有启动,安装前面的说法,将fs.default.name改为fs.defaultFS,就行了。当然可能还有其他方法。

注意,使用yarn-cluster模式计算,结果没有输出在控制台,结果写在了Hadoop集群的日志中,如何查看计算结果?注意到刚才的输出中有地址:

  http://172.29.3.56:8088/proxy/application_1495027881637_0001/

在spark和hadoop上新增节点

在spark和Hadoop上不关闭主机的情况下,新增节点。
最好是直接将原先的节点环境拷贝一份到新增的节点,这样就不需要重复的配置新增的节点。只需要在新增节点的/etc/profile和每个节点/etc/hosts~/.ssh/authorized_keys文件中进行配置。
在各个节点的Hadoop的workers和spark的slaves文件添加新增的节点hostname。
1、添加datanode
在新增的节点上启动datanode进程,从而将其添加到集群中,在新增的节点执行:hdfs --daemon start datanode

然后在namenode上用hdfs dfsadmin -report 命令查看集群情况,最后需要对hdfs负载设置均衡,因为默认的数据传输带宽比较低,可以设置为64M,即 hdfs dfsadmin -setBalancerBanwidth 67108864 即可,默认的balancer的threshold为10%,即各个节点与集群总的存储使用率相差不超过10%,可以设置为5%,然后启动balancer,sbin/start-balancer.sh -threshold 5

2、添加nodemanager
在新增节点上运行yarn --daemon start nodemanager
然后在namenode上用yarn node -list 查看集群情况

3、添加spark的worker
在新增节点上运行

cd /opt/spark-2.3.0/sbin
./start-slave.sh spark://master:7077

在spark和hadoop上删除节点

删除节点一般不建议直接停掉,需要先将其排除在集群之外,编辑配置文件:hdfs-site.xml,在该节点中添加

<property>  
    <name>dfs.hosts.exclude</name>  
    <value>file:/opt/hadoop-3.0.0/etc/hadoop/excludes</value>  
</property>

在excludes添加需要删除的节点的hostname。比如

slave3

在namenode上刷新节点信息:

cd /opt/hadoop-3.0.0/bin/
hdfs dfsadmin -refreshNodes

会看到节点变成Dead和Decommissioned状态。关闭需要一段时间,请耐心等待。

最后在需要删除的节点上,停止节点:

cd /opt/hadoop-3.0.0/bin/
hdfs --daemon stop datanode
cd /opt/spark-2.3.0/bin/
yarn --daemon stop nodemanager

cd /opt/spark-2.3.0/sbin
./stop-slave.sh spark://master:7077

再次编辑excludes文件,删除里面的内容。重新刷新:

cd /opt/hadoop-3.0.0/bin/
hdfs dfsadmin -refreshNodes
hdfs dfsadmin -report

删除Hadoop的workers和spark上的slaves里面已经被删除的节点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值