spark1.6+hadoop2.6集群HA搭建与参数解析

废话就不多说了,直接开始啦~

安装环境变量:

使用linx下的解压软件,解压找到里面的install 或者 ls 运行这个进行安装

yum install gcc

yum install gcc-c++

安装make,这个是自动编译源码的工具

yum install make

yum install autoconfautomake libtool cmake

封装了底层的终端功能

yum install ncurses-devel

OpenSSL 是一个软件包,用于支持SSL传输协议的软件包

yum install openssl-devel

git就不用多说了

yum install git git-svn git-email git-gui gitk

安装protoc(需用root用户), 作用是把某种数据结构的信息,以某种格式保存起来。主要用于数据存储、传输协议格式等

1 tar -xvf protobuf-2.5.0.tar.bz2

2 cd protobuf-2.5.0

3 ./configure –prefix=/opt/protoc/

4 make && make install

安装wget (以后备用~)

sudo yum -y install wget

二、增加用户组

groupadd hadoop 添加一个组

useradd hadoop -g hadoop 添加用户

三、编译hadoop

mvn clean package -Pdist,native -DskipTests -Dtar

编译完的hadoop在 /home/hadoop/ocdc/hadoop-2.6.0-src/hadoop-dist/target 路径下

四、各节点配置hosts文件 vi/etc/hosts

10.1.245.244 master

10.1.245.243 slave1

10.1.245.242 slave2

命令行输入 hostname master

ssh到其他主机 相应输入 hostName xxxx

五、各节点免密码登录:

各节点 免密码登录

ssh-keygen -t rsa

cd /root/.ssh/

ssh-copy-id master

将生成的公钥id_rsa.pub 内容追加到authorized_keys(执行命令:cat id_rsa.pub >> authorized_keys)

时间等效性同步

ssh master date; ssh slave1 date;ssh slave2 date;

六、hadoop路径下创建相应目录(namenode,datenode 等信息存放处)

Mkdir data

(在data路径下创建目录)

mkdir yarn

mkdir jn

mkdir current

(hadoop路径下)

mkdir name

(jn目录下)

mkdir streamcluster

七、Zookeeper集群配置:

解压zookeeper

Tar zxvf zookeeper-3.4.6.tar.gz

修改temp文件为可用

Cp zoo_sample.cfg zoo.cfg

修改zoo.cfg文件:

# The number of milliseconds of each tick

tickTime=2000

# The number of ticks that the initial

# synchronization phase can take

initLimit=10

# The number of ticks that can pass between

# sending a request and getting an acknowledgement

syncLimit=5

# the directory where the snapshot is stored.

# do not use /tmp for storage, /tmp here is just

# example sakes.

dataDir=/home/hadoop/ocdc/zookeeper-3.4.6/data

dataLogDir=/home/hadoop/ocdc/zookeeper-3.4.6/logs

# the port at which the clients will connect

clientPort=2183

# the maximum number of client connections.

# increase this if you need to handle more clients

#maxClientCnxns=60

#

# Be sure to read the maintenance section of the

# administrator guide before turning on autopurge.

#

# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance

#

# The number of snapshots to retain in dataDir

#autopurge.snapRetainCount=3

# Purge task interval in hours

# Set to “0” to disable auto purge feature

#autopurge.purgeInterval=1

#写入节点ip与端口

server.1=master:2898:3898

server.2=slave1:2898:3898

server.3=slave2:2898:3898

在zookeeper目录下:

mkdir data

vi myid (写入id为1,)

拷贝zookeeper到各个目录下(将slave1中的myid改为2,slave2中的myid改为3….)

随后在 bin目录下 逐个启动zookeeper

./zkServer.sh start

./zkServer.sh status (查看状态)

八、hadoop相关配置文件及参数说明

core-site.xml

默认文件系统的名称,如果是HA模式,不加端口

fs.defaultFS

hdfs:// streamcluster

io.file.buffer.size都被用来设置缓存的大小,较大的缓存可以提供高效的数据传输,但太大也会造成更大的内存消耗和延迟

io.file.buffer.size

131072

hadoop文件系统依赖的基本配置,很多配置路径都依赖它,它的默认位置在/tmp/{$user}下面

hadoop.tmp.dir

/home/hadoop/ocdc/hadoop-2.6.0/tmp

Abasefor other temporary directories.

hadoop.proxyuser.spark.hosts

*

hadoop.proxyuser.spark.groups

*

hdfs-site.xml

集群的逻辑名,要注意的是,如果为HA模式,需要与core-site.xml中的fs.defaultFS名一致

dfs.nameservices

streamcluster

datanode的端口,运行tcp/ip服务器以支持块传输,默认为0.0.0.0:50010

dfs.datanode.address

0.0.0.0:50012

datanode的http服务器地址和端口

dfs.datanode.http.address

0.0.0.0:50077

datanode的rpc服务器的地址和端口, 提供进程间交互通信

dfs.datanode.ipc.address

0.0.0.0:50022

dfs.ha.namenodes.[nameservice ID]在名称服务中每一个nameNode的唯一标识符,streamcluster为之前配置的nameservice的名称,这里配置高可用,所以配置两个NN

dfs.ha.namenodes.streamcluster

nn1,nn2

由namenode存储元数据的目录地址

dfs.namenode.name.dir

/home/hadoop/ocdc/hadoop-2.6.0/name

true

由datanode存放数据块的目录列表

dfs.datanode.data.dir

/home/hadoop/ocdc/hadoop-2.6.0/data

true

由写操作所需要创建的最小副本数目

dfs.replication

3

如果是 true,则打开权限系统

dfs.permission

true

设置成true, 通过知道每个block所在磁盘,可以在调度cpu资源时让不同的cpu读不同的磁盘,避免查询内和查询间的IO竞争

dfs.datanode.hdfs-blocks-metadata.enabled

true

是否在HDFS中开启权限检查。

dfs.permissions.enabled

false

HA模式下该参数为streamcluster中namenode1节点对外服务的RPC地址

dfs.namenode.rpc-address.streamcluster.nn1

master:8033

HA模式下该参数为streamcluster中namenode1节点对外服务的RPC地址

dfs.namenode.rpc-address.streamcluster.nn2

slave1:8033

HA模式下该参数为streamcluster中namenode1节点对外服务的HTTP地址

dfs.namenode.http-address.streamcluster.nn1

master:50083

HA模式下该参数为streamcluster中namenode1节点对外服务的HTTP地址

dfs.namenode.http-address.streamcluster.nn2

slave1:50083

设置的为journalNode的地址,Activity状态中的Namenode会将edits的Log写入JournalNode,而standby状态中的Namenode会读取这些edits log.

dfs.namenode.shared.edits.dir

qjournal://master:8489;slave1:8489;slave2:8489/streamcluster

JournalNode 所在节点上的一个目录,用于存放 editlog 和其他状态信息。

dfs.journalnode.edits.dir

/home/hadoop/ocdc/hadoop-2.6.0/data/jn

journalNode RPC服务地址和端口

dfs.journalnode.rpc-address

0.0.0.0:8489

journalNode HTTP服务地址和端口

dfs.journalnode.http-address

0.0.0.0:8484

此参数为客户端与activity状态下的Namenode进行交互的java实现类,DFS客户端通过该类寻找当前activity的Namenode

dfs.client.failover.proxy.provider.streamcluster

org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider

使HA模式下不会同时出现两个master,不允许出现两个activity状态下的Namenode

dfs.ha.fencing.methods

shell(/bin/true)

SSH的超时时间设置,倘若超过此时间,则认为执行失败.

dfs.ha.fencing.ssh.connect-timeout

10000

指定streamcluster的两个NameNode共享edits文件目录时,使用的JournalNode集群信息

dfs.ha.automatic-failover.enabled

true

每个datanode任一时刻可以打开的文件数量上限。

dfs.datanode.max.xcievers

4096

DataNode传送数据出入的最大线程数,等同于dfs.datanode.max.xcievers。

dfs.datanode.max.transfer.threads

4096

块的字节大小

dfs.blocksize

67108864

一般原则是将其设置为集群大小的自然对数乘以20,即20logN, NameNode有一个工作线程池用来处理客户端的远程过程调用及集群守护进程的调用。处理程序数量越多意味着要更大的池来处理来自不同DataNode的并发心跳以及客户端并发的元数据操作。

dfs.namenode.handler.count

20

ha.zookeeper.quorum

master:2183,slave1:2183,slave2:2183

yarn-site.xml

NodeManager的心跳间隔

yarn.resourcemanager.connect.retry-interval.ms

2000

是否启用RM HA,默认为false(不启用)。这里设置为启用。

yarn.resourcemanager.ha.enabled

true

是否启用自动故障转移。默认情况下,在启用HA时,启用自动故障转移。

yarn.resourcemanager.ha.automatic-failover.enabled

true

启用内置的自动故障转移。默认情况下,在启用HA时,启用内置的自动故障转移。

yarn.resourcemanager.ha.automatic-failover.embedded

true

集群的ID,确保ResourceManager不会为成为其他集群的Activity活跃状态。

yarn.resourcemanager.cluster-id

yarn-rm-cluster

HA下两个ResourceManager的逻辑名称

yarn.resourcemanager.ha.rm-ids

rm1,rm2

用于标识ResourceManager,这里要注意一点,HA备用的RM的服务器需要修改为rm2

yarn.resourcemanager.ha.id

rm1

启用重启ResourceManager的功能,默认为false

yarn.resourcemanager.recovery.enabled

true

用于状态存储的类,可以设置为

org.apache.hadoop.yarn.server.resourcemanager.recovery.FileSystemRMStateStore,基于Hadoop文件系统的实现,这里的设置是基于ZooKeeper的实现

yarn.resourcemanager.store.class

org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore

存储RM状态的ZooKeeper Znode全路径。

yarn.resourcemanager.zk.state-store.address

master:2183,slave1:2183,slave2:2183

被RM用于状态存储的ZooKeeper服务器的主机:端口号

yarn.resourcemanager.zk-address

master:2183,slave1:2183,slave2:2183

Scheduler失联等待的时间

yarn.app.mapreduce.am.scheduler.connection.wait.interval-ms

5000

ResourceManager1的地址和端口

yarn.resourcemanager.address.rm1

master:23140

ResourceManager1调度器地址:端口

yarn.resourcemanager.scheduler.address.rm1

master:23130

ResourceManager 1对外web ui地址。可通过该地址在浏览器中查看集群各类信息。

yarn.resourcemanager.webapp.address.rm1

master:23188

NodeManager通过该地址向ResourceManager1汇报心跳,领取任务等的地址。

yarn.resourcemanager.resource-tracker.address.rm1

master:23125

ResourceManager 1对管理员暴露的访问地址。管理员通过该地址向RM发送管理命令等。

yarn.resourcemanager.admin.address.rm1

master:23141

yarn.resourcemanager.ha.admin.address.rm1

master:23142

HA ResourceManager2相关参数同上 rm1

yarn.resourcemanager.address.rm2

slave1:23140

HA ResourceManager2相关参数同上 rm1

yarn.resourcemanager.scheduler.address.rm2

slave1:23130

HA ResourceManager2相关参数同上 rm1

yarn.resourcemanager.webapp.address.rm2

slave1:23188

HA ResourceManager2相关参数同上 rm1

yarn.resourcemanager.resource-tracker.address.rm2

slave1:23125

HA ResourceManager2相关参数同上 rm1

yarn.resourcemanager.admin.address.rm2

slave1:23141

HA ResourceManager2相关参数同上 rm1

yarn.resourcemanager.ha.admin.address.rm2

slave1:23142

localizer IPC

yarn.nodemanager.localizer.address

0.0.0.0:23344

http服务端口

yarn.nodemanager.webapp.address

0.0.0.0:23999

通过该配置,用户可以自定义一些服务,例如Map-Reduce的shuffle功能就是采用这种方式实现的,可运行mapReduce程序

yarn.nodemanager.aux-services

mapreduce_shuffle

之前定义了为mapreduce_shuffle,那么相对应属性的类就定义为org.apache.hadoop.mapred.ShuffleHandle

yarn.nodemanager.aux-services.mapreduce_shuffle.class

org.apache.hadoop.mapred.ShuffleHandler

NodeManager会通过参数yarn.nodemanager.local-dirs配置一系列目录(磁盘),用于存储Application中间结果(比如MapReduce中Map Task的中间输出结果)

yarn.nodemanager.local-dirs

/home/hadoop/ocdc/hadoop-2.6.0/data/yarn/local

同上NodeManager配置的日志文件

yarn.nodemanager.log-dirs

/home/hadoop/ocdc/hadoop-2.6.0/data/yarn/log

MapReduce JobHistory Server Web UI地址。

mapreduce.jobhistory.webapp.address

0.0.0.0:12345

每个节点可用的最大内存,RM中的两个值不应该超过此值。此数值可以用于计算container最大数目,即:用此值除以RM中的最小容器内存。虚拟内存率,是占task所用内存的百分比,默认值为2.1倍;注意:第一个参数是不可修改的,一旦设置,整个运行过程中不可动态修改,且该值的默认大小是8G,即使计算机内存不足8G也会按着8G内存来使用。

yarn.nodemanager.vmem-pmem-ratio

2.4

每个节点可用的内存,单位为MB

yarn.nodemanager.resource.memory-mb

16384

单个任务可申请的最大内存,默认为8192MB

yarn.scheduler.maximum-allocation-mb

16384

启用的资源调度器主类。目前可用的有FIFO、Capacity Scheduler和Fair Scheduler。

yarn.resourcemanager.scheduler.class

org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler

为applications配置相应的ClassPath

yarn.application.classpath

$HADOOP_CONF_DIR,

$HADOOP_COMMON_HOME/share/hadoop/common/*,

$HADOOP_COMMON_HOME/share/hadoop/common/lib/*,

$HADOOP_HDFS_HOME/share/hadoop/hdfs/*,

$HADOOP_HDFS_HOME/share/hadoop/hdfs/lib/*,

$HADOOP_YARN_HOME/share/hadoop/yarn/*,

$HADOOP_YARN_HOME/share/hadoop/yarn/lib/*

mapred-site.xml

配置引擎为yarn,如果要配置Tez则改为yarn-tez. 其中的奥妙在于使用了JDK6+的一个特性ServiceLoader类。其为JDK实现了一个依赖注入的机制。

mapreduce.framework.name

yarn

mapreduce.jobhistory.webapp.address和mapreduce.jobhistory.address参数配置的主机上对Hadoop历史作业情况经行查看。

mapreduce.jobhistory.address

master:10020

mapreduce.jobhistory.webapp.address和mapreduce.jobhistory.address参数配置的主机上对Hadoop历史作业情况经行查看。

mapreduce.jobhistory.webapp.address

master:19888

指定压缩类型,默认是RECORD类型,它会按单个的record压缩,如果指定为BLOCK类型,它将一组record压缩,压缩效果自然是BLOCK好。

mapred.output.compression.type

BLOCK

slaves

vi slaves

master1

slave1

slave2

随后将拷贝配置好的hadoop到各个服务器中

九、启动Hadoop各组件

启动jounalnode

./hadoop-daemon.sh start journalnode

进行namenode格式化

./hadoop namenode -format

格式化后会在根据core-site.xml中的hadoop.tmp.dir配置生成个文件,之后通过下面命令,启动namenode进程在namenode2上执行

sbin/hadoop-daemon.sh start namenode

完成主备节点同步信息

./hdfs namenode –bootstrapStandby

格式化ZK(在namenode1上执行即可, 这句命令必须手工打上,否则会报错)

./hdfs zkfc –formatZK

启动HDFS(在namenode1上执行)

./start-dfs.sh

启动YARN(在namenode1和namenode2上执行)

./start-yarn.sh

在namenode1上执行${HADOOP_HOME}/bin/yarn rmadmin -getServiceState rm1查看rm1和rm2分别为active和standby状态

我们在启动hadoop各个节点时,启动namenode和datanode,这个时候如果datanode的storageID不一样,那么会导致如下datanode注册不成功的信息:

这个时候,我们需要修改指定的datanode的current文件中的相应storageID的值,直接把它删除,这个时候,系统会动态新生成一个storageID,这样再次启动时就不会发生错误了。

查看端口是否占用

Netstat-tunlp |grep 22

查看所有端口

Netstat -anplut

十、spark搭建与参数解析

修改spark-env..sh 增加如下参数(路径根据服务器上的路径修改)

HADOOP_CONF_DIR=/home/hadoop/ocdc/hadoop-2.6.0/etc/hadoop/

HADOOP_HOME=/home/hadoop/ocdc/hadoop-2.6.0/

SPARK_HOME=/home/hadoop/ocdc/spark-1.6.1-bin-hadoop2.6/

该参数决定了yarn集群中,最多能够同时启动的EXECUTOR的实例个数。

SPARK_EXECUTOR_INSTANCES=3

设置每个EXECUTOR能够使用的CPU core的数量。

SPARK_EXECUTOR_CORES=7

该参数设置的是每个EXECUTOR分配的内存的数量

SPARK_EXECUTOR_MEMORY=11G

该参数设置的是DRIVER分配的内存的大小

SPARK_DRIVER_MEMORY=11G

Spark Application在Yarn中的名字

SPARK_YARN_APP_NAME=”asiainfo.Spark-1.6.0″

指定在yarn中执行,提交方式为client

MASTER=yarn-cluster

修改spark-default.conf文件 (路径根据服务器上的路径修改)

如果没有适合当前本地性要求的任务可供运行,将跑得慢的任务在空闲计算资源上再度调度的行为,这个参数会引发一些tmp文件被删除的问题,一般设置为false

spark.speculation false

如果设置为true,前台用jdbc方式连接,显示的会是乱码

spark.sql.hive.convertMetastoreParquet false

应用程序上载到HDFS的复制份数

spark.yarn.submit.file.replication 3

Spark application master给YARN ResourceManager 发送心跳的时间间隔(ms)

spark.yarn.scheduler.heartbeat.interal-ms 5000

仅适用于HashShuffleMananger的实现,同样是为了解决生成过多文件的问题,采用的方式是在不同批次运行的Map任务之间重用Shuffle输出文件,也就是说合并的是不同批次的Map任务的输出数据,但是每个Map任务所需要的文件还是取决于Reduce分区的数量,因此,它并不减少同时打开的输出文件的数量,因此对内存使用量的减少并没有帮助。只是HashShuffleManager里的一个折中的解决方案。

spark.shuffle.consolidateFiles true

用来调整cache所占用的内存大小。默认为0.6。如果频繁发生Full GC,可以考虑降低这个比值,这样RDD Cache可用的内存空间减少(剩下的部分Cache数据就需要通过Disk Store写到磁盘上了),会带来一定的性能损失,但是腾出更多的内存空间用于执行任务,减少Full GC发生的次数,反而可能改善程序运行的整体性能。这要看你的具体业务逻辑,是cache的多还是计算的多。

spark.storage.memoryFraction 0.3

一个partition对应着一个task,如果数据量过大,可以调整次参数来减少每个task所需消耗的内存.

spark.sql.shuffle.partitions 800

Spark SQL在每次执行次,先把SQL查询编译JAVA字节码。针对执行时间长的SQL查询或频繁执行的SQL查询,此配置能加快查询速度,因为它产生特殊的字节码去执行。但是针对很短的查询,可能会增加开销,因为它必须先编译每一个查询

spark.sql.codegen true

我们都知道shuffle默认情况下的文件数据为map tasks * reduce tasks,通过设置其为true,可以使spark合并shuffle的中间文件为reduce的tasks数目。

spark.shuffle.consolidateFiles true

相关jar包的加载地址

spark.driver.extraClassPath /home/hadoop/ocdc/spark-1.6.1-bin-hadoop2.6/lib/mysql-connector-java-5.1.30-bin.jar:/home/hadoop/ocdc/spark-1.6.1-bin-hadoop2.6/lib/datanucleus-api-jdo-3.2.6.jar:/home/hadoop/ocdc/spark-1.6.1-bin-hadoop2.6/lib

/datanucleus-core-3.2.10.jar:/home/hadoop/ocdc/spark-1.6.1-bin-hadoop2.6/lib/datanucleus-rdbms-3.2.9.jar:/home/hadoop/ocdc/spark-1.6.1-bin-hadoop2.6/lib/ojdbc14-10.2.0.3.jar

最终:

Hadoop监控页面(根据yarn-site.xml的参数yarn.resourcemanager.webapp.address.rm1中配置的端口决定的):

http://10.1.245.244: 23188

Hadoop namenode监控页面( 根据hdfs-site.xml中配置的参数

dfs.namenode.http-address.streamcluster.nn1中的端口决定):

http://10.1.245.244: 50083

spark thriftserver注册启动:

;