要想在分布式上运行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中有两种节点,分别是NameNode和DataNode。
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
目录下的文件进行配置。
新建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新建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
- 用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里面已经被删除的节点。