hadoop和spark主备HA配置说明
集群中包括4个节点:2个Master(主备),2个Salve,节点之间局域网连接,可以相互ping通。节点IP地址分布如下:
Hadoop HA集群:
IP地址 |
hostname |
role |
10.12.0.240 |
master |
ActiveNameNode |
10.12.0.243 |
standyMaster |
StandByNameNode |
10.12.0.241 |
slave1 |
DataNode1 |
10.12.0.242 |
slave2 |
DataNode2 |
Spark HA集群:
IP地址 |
hostname |
role |
10.12.0.240 |
master |
Master |
10.12.0.243 |
standyMaster |
StandBy Master |
10.12.0.241 |
slave1 |
worker |
10.12.0.242 |
slave2 |
worker |
在root用户关闭防火墙
永久关闭防火墙,重启后不变:
chkconfig iptablesoff/on
关闭防火墙:( 即时生效,重启后失效。先关闭防火墙,再永久关闭防火墙。)
service iptables stop
/etc/init.d/iptables stauts 查看防火墙状态
[root@master ~]#groupadd hadoop
[root@master ~]#useradd -g hadoop hadoop
[root@master ~]#passwd hadoop
[root@master ~]# 两次输入密码
测试创建用户
[root@master ~]# suhadoop
[hadoop@master root]$
su root 回到root用户
vim /etc/sudoers
为hadoop用户分配权限,需先修改sudoers文件的权限。
执行命令: chmod u+w /etc/sudoers
再添加:hadoop ALL=(ALL) ALL
下面的例子我们将以Master机器为例,即主机名为"Master ",IP为"10.12.0.93"进行一些主机名配置的相关操作。其他的Slave机器以此为依据进行修改。
用下面命令进行显示机器名称,如果跟规划的不一致,要按照下面进行修改。
hostname
上图中,用"hostname"查"master"机器的名字为"master ",与我们预先规划的一致。其他2台机器分别改为slave1和slave2。
假定我们发现我们的机器的主机名不是我们想要的,通过对"/etc/sysconfig/network"文件修改其中"HOSTNAME"后面的值,改成我们规划的名称。
这个"/etc/sysconfig/network"文件是定义hostname和是否利用网络的不接触网络设备的对系统全体定义的文件。
设定形式:设定值=值
"/etc/sysconfig/network"的设定项目如下:
NETWORKING 是否利用网络
GATEWAY 默认网关
IPGATEWAYDEV 默认网关的接口名
HOSTNAME 主机名
DOMAIN 域名
用下面命令进行修改当前机器的主机名(备注:修改系统文件一般用root用户)
vim/etc/sysconfig/network
通过上面的命令我们从"/etc/sysconfig/network"中找到"HOSTNAME"进行修改,查看内容如下:
假定我们的机器连IP在当时安装机器时都没有配置好,那此时我们需要对"ifcfg-eth0"文件进行配置,该文件位于"/etc/sysconfig/network-scripts"文件夹下。
在这个目录下面,存放的是网络接口(网卡)的制御脚本文件(控制文件),ifcfg- eth0是默认的第一个网络接口,如果机器中有多个网络接口,那么名字就将依此类推ifcfg-eth1,ifcfg-eth2,ifcfg- eth3,……。
这里面的文件是相当重要的,涉及到网络能否正常工作。
设定形式:设定值=值
设定项目项目如下:
DEVICE 接口名(设备,网卡)
BOOTPROTO IP的配置方法(static:固定IP, dhcpHCP, none:手动)
HWADDR MAC地址
ONBOOT 系统启动的时候网络接口是否有效(yes/no)
TYPE 网络类型(通常是Ethemet)
NETMASK 网络掩码
IPADDR IP地址
IPV6INIT IPV6是否有效(yes/no)
GATEWAY 默认网关IP地址
DSN1 DSN服务器地址
查看"/etc/sysconfig/network-scripts/ifcfg-eth1内容,此处实际网卡名称eth1
如果上图中IP与规划不相符,用下面命令进行修改:
vim/etc/sysconfig/network-scripts/ifcgf-eth1
修改完之后可以用"ifconfig"进行查看。
4)配置hosts文件(必须)
"/etc/hosts"这个文件是用来配置主机将用的DNS服务器信息,是记载LAN内接续的各主机的对应[HostName和IP]用的。当用户在进行网络连接时,首先查找该文件,寻找对应主机名(或域名)对应的IP地址。
vi /etc/hosts
master(NameNode | JobTracker)作为客户端,要实现无密码公钥认证,连接到服务器salve(DataNode | Tasktracker)上时,需要在master上生成一个密钥对,包括一个公钥和一个私钥,而后将公钥复制到所有的Slave上。当master通过SSH连接salve时,Salve就会生成一个随机数并用Master的公钥对随机数进行加密,并发送给master。master收到加密数之后再用私钥解密,并将解密数回传给slave,slave确认解密数无误之后就允许master进行连接了。这就是一个公钥认证过程,其间不需要用户手工输入密码。重要过程是将客户端master复制到slave上。
(注:无密码说明从网上拷贝过来,图片Master对应master,Slave1对应slave1)
在mater节点上执行以下命令:
ssh-keygen -t rsa -P ''
这条命是生成其无密码密钥对,询问其保存路径时直接回车采用默认路径。生成的密钥对:id_rsa和id_rsa.pub,默认存储在"/home/hadoop/.ssh"目录下。
查看"/home/hadoop/"下是否有".ssh"文件夹,且".ssh"文件下是否有两个刚生产的无密码密钥对。
接着在master节点上做如下配置,把id_rsa.pub追加到授权的key里面去。
cat ~/.ssh/id_rsa.pub>> ~/.ssh/authorized_keys
在验证前,需要做两件事儿。第一件事儿是修改文件"authorized_keys"权限(权限的设置非常重要,因为不安全的设置安全设置,会让你不能使用RSA功能),另一件事儿是用root用户设置"/etc/ssh/sshd_config"的内容。使其无密码登录有效。
1)修改文件"authorized_keys"
chmod 600~/.ssh/authorized_keys
备注:如果不进行设置,在验证时,扔提示你输入密码,。
(如果600权限仍要密码就修改为500:chmod 600 ~/.ssh/authorized_keys)
2)设置SSH配置
用root用户登录服务器修改SSH配置文件"/etc/ssh/sshd_config"的下列内容。
RSAAuthentication yes#启用 RSA认证
PubkeyAuthenticationyes #启用公钥私钥配对认证方式
AuthorizedKeysFile.ssh/authorized_keys #公钥文件路径(和上面生成的文件同)
设置完之后记得重启SSH服务,才能使刚才设置有效。
service sshd restart
退出root登录,使用hadoop普通用户验证是否成功。
ssh localhost
从上图中得知无密码登录本级已经设置完毕,接下来的事儿是把公钥复制所有的slave机器上。使用下面的命令格式进行复制公钥:
scp ~/.ssh/id_rsa.pub 远程用户名@远程服务器IP:~/
例如:
scp ~/.ssh/id_rsa.pub [email protected]:~/
上面的命令是复制文件"id_rsa.pub"到服务器IP为"10.12.0.92"的用户为"hadoop"的"/home/hadoop/"下面。
下面就针对IP为"10.12.0.92"的slave1的节点进行配置。
$ scp ~/.ssh/id_rsa.pub hadoop@10.12.0.92: ~/
chenlb@10.12.0.92's password:
id_rsa.pub 100% 223 0.2KB/s 00:00
从上我们得知,已经把文件"id_rsa.pub"传过去了,因为并没有建立起无密码连接,所以在连接时,仍然要提示输入输入Slave1.Hadoop服务器用户hadoop的密码。为了确保确实已经把文件传过去了,用SecureCRT登录Slave1.Hadoop:192.168.1.3服务器,查看"/home/hadoop/"下是否存在这个文件。
从上面得知我们已经成功把公钥复制过去了。
这一步并不是必须的,如果在Slave1.Hadoop的"/home/hadoop"已经存在就不需要创建了,因为我们之前并没有对Slave机器做过无密码登录配置,所以该文件是不存在的。用下面命令进行创建。(备注:用hadoop登录系统,如果不涉及系统文件修改,一般情况下都是用我们之前建立的普通用户hadoop进行执行命令。)
mkdir ~/.ssh
然后是修改文件夹".ssh"的用户权限,把他的权限修改为"700",用下面命令执行:
chmod 700 ~/.ssh
备注:如果不进行,即使你按照前面的操作设置了"authorized_keys"权限,并配置了"/etc/ssh/sshd_config",还重启了sshd服务,在Master能用"sshlocalhost"进行无密码登录,但是对Slave1.Hadoop进行登录仍然需要输入密码,就是因为".ssh"文件夹的权限设置不对。这个文件夹".ssh"在配置SSH无密码登录时系统自动生成时,权限自动为"700",如果是自己手动创建,它的组权限和其他权限都有,这样就会导致RSA无密码远程登录失败。
对比上面两张图,发现文件夹".ssh"权限已经变了。
3)追加到授权文件"authorized_keys"
到目前为止Maste的公钥也有了,文件夹".ssh"也有了,且权限也修改了。这一步就是把Master.Hadoop的公钥追加到Slave1的授权文件"authorized_keys"中去。使用下面命令进行追加并修改"authorized_keys"文件权限:
cat ~/id_rsa.pub>> ~/.ssh/authorized_keys
chmod 600~/.ssh/authorized_keys
4)用root用户修改"/etc/ssh/sshd_config"
具体步骤参考前面master.的"设置SSH配置",具体分为两步:第1是修改配置文件;第2是重启SSH服务。
5)用master使用SSH无密码登录Slave1
当前面的步骤设置完毕,就可以使用下面命令格式进行SSH无密码登录了。
ssh 远程服务器IP
从上图我们主要3个地方,第1个就是SSH无密码登录命令,第2、3个就是登录前后"@"后面的机器名变了,由"Master"变为了"Slave1",这就说明我们已经成功实现了SSH无密码登录了。
最后记得把"/home/hadoop/"目录下的"id_rsa.pub"文件删除掉。
rm –r ~/id_rsa.pub
到此为止,我们经过前5步已经实现了从"master "到"slave1 "SSH无密码登录,下面就是重复上面的步骤把剩余的两台(Slave2.Hadoop和Slave3.Hadoop)Slave服务器进行配置。这样,我们就完成了"配置Master无密码登录所有的Slave服务器"。
2.3 配置所有Slave无密码登录Master
和master无密码登录所有slave原理一样,就是把slave的公钥追加到master的".ssh"文件夹下的"authorized_keys"中,记得是追加(>>)。
所有的机器上都要安装JDK,现在就先在Master服务器安装,然后其他服务器按照步骤重复进行即可。安装JDK以及配置环境变量,需要以"root"的身份进行。
首先用root身份登录"Master.Hadoop"后在"/usr"下创建"java"文件夹,再把用FTP上传到"/home/hadoop/"下的"jdk-6u31-linux-i586.bin"复制到"/usr/java"文件夹中。
检验系统原版本
[root@localhost ~]# java -version
java version "1.7.0_45"
OpenJDK Runtime Environment(rhel-2.4.3.3.el6-x86_64 u45-b15)
OpenJDK 64-Bit Server VM (build 24.45-b08,mixed mode)
[root@ls4 hadoop]#进一步查看JDK信息:
[root@localhost ~]# rpm -qa | grep java
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
tzdata-java-2013g-1.el6.noarch
卸载OpenJDK,执行以下操作:
[root@localhost ~]# rpm -e --nodepstzdata-java-2012c-1.el6.noarch
[root@localhost ~]# rpm -e --nodepsjava-1.7.0-openjdk-1.7.0.45-2.4.3.3.el6.x86_64
[root@localhost ~]# rpm -e --nodeps ava-1.6.0-openjdk-1.6.0.0-1.66.1.13.0.el6.x86_64
安装java
tar -zxvf jdk-7u51-linux-x64.tar.gz -C /usr/local/java
配置新JDK
export JAVA_HOME=/usr/local/jdk1.7.0_51
export JRE_HOME=/usr/local/jdk1.7.0_51/jre
exportCLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib
export PATH=$PATH:$JAVA_HOME/bin
重启"/etc/profile"
source /etc/profile
而最新版本的spark-1.3需要最低版本的scala版本为2.10.x,先使用apt-get remove scala将机器上的老版本scala清除干净。
在这个位置下载 http://www.scala-lang.org/download/2.10.5.html scala,
现在好后,解压,
最后编辑/etc/profile,设置如下环境变量:
export SCALA_HOME=/usr/local/scala-2.10.4
export PATH=$PATH:$ SCALA_HOME
最后可以看到,scala的版本为2.10.5的了
~/spark-evn/scala-2.10.5$ scala -version
Scala code runner version 2.10.5 -- Copyright 2002-2013, LAMP/EPFL
1.首先到Maven官网下载安装包,目前最新版本为3.2.5,下载文件为apache-maven-3.2.5-bin.tar.gz,下载可以使用wget命令;
2.进入下载文件夹,找到下载的文件,运行如下命令解压
tar -xvf apache-maven-3.2.5-bin.tar.gz
解压后的文件夹名为apache-maven-3.2.5
3.使用mv命令将apache-maven-3.2.3文件夹拷贝到自己指定的文件夹,比如/usr/local/下
mvapache-maven-3.2.3 /usr/local/
4.配置环境变量,编辑/etc/profile文件,添加如下代码
exportMAVEN_HOME=/usr/local/apache-maven-3.2.5
export PATH=$JAVA_HOME/bin:$MAVEN_HOME/bin:$ANTX_HOME/bin:$ANT_HOME/bin
5.保存文件,并运行如下命令使环境变量生效
source /etc/profile
6.在控制台输入如下命令,如果能看到Maven相关版本信息,则说明Maven已经安装成功
mvn -v
将zookeeper-3.5.0-alpha.tar.gz解压到/home/hadoop目录。
#配置zoo.cfg文件
cd /home/hadoop/zookeeper-3.5.0-alpha
mkdir data
mkdir datalog
cd conf
cp zoo_sample.cfg zoo.cfg
vi zoo.cfg
#注意:服务个数最好是奇数个如3,5,7...... |
输入1进入SY-0134的zookeeper中的myid文件
echo "1"> /home/hadoop/zookeeper-3.5.0-alpha/data/myid
使用scp命令把zookeeper拷贝到其他机器上面
cd /home/hadoop
scp –r zookeeper-3.5.0-alpha hadoop@standyMaster:~/
scp –r zookeeper-3.5.0-alpha hadoop@slave1:~/
另外一点,Zoookeeper的Server在不同节点上,myid文件内容不一样。
echo "1"> home/hadoop/zookeeper-3.5.0/data/myid #master
echo "2"> home/hadoop/zookeeper-3.5.0/data/myid #standyMaster
echo "3"> home/hadoop/zookeeper-3.5.0/data/myid #slave1
在3个节点上分别启动zookeeper .
[hadoop@masterzookeeper-3.5.0]$ bin/zkServer.shstart
[hadoop@stardyMasterzookeeper-3.5.0]$ bin/zkServer.sh start
[hadoop@slave1zookeeper-3.5.0]$ bin/zkServer.shstar
上传hadoop-2.6.0-cdh5.4.0.tar.gz到master服务器/home/hadoop目录。使用hadoop用户登入。
tar –xzvf hadoop-2.6.0-cdh5.4.0.tar.gz –C/CDH
vi /etc/profile
exportHADOOP_HOME=/home/hadoop/CDH5/hadoop-2.6.0-cdh5.4.0
exportHADOOP_CONF_DIR=/home/hadoop/CDH5/hadoop-2.6.0-cdh5.4.0/etc/hadoop
exportPATH=$PATH:$JAVA_HOME/bin:$SCALA_HOME/bin:$HADOOP_HOME/sbin:$HADOOP_HOME/bin:$MAVEN_HOME/bin
cd /home/hadoop/CDH5/hadoop-2.6.0-cdh5.4.0/etc/hadoop
增加
export JAVA_HOME=/usr/java/jdk1.7.0_51
schemeand authority determine the FileSystem implementation. The uri'sscheme determines the config property (fs.SCHEME.impl) naming theFileSystem implementation class. Theuri's authority is used to determine the host, port, etc. for a filesystem.
|
Theactual number of replications can be specified when the file is created. Thedefault is used if replication is not specified in create time.
Specifies the percentage of blocks that should satisfy the minimal replication requirement defined by dfs.namenode.replication.min. Values less than or equal to 0 mean not to wait for any particular percentage of blocks before exiting safemode. Values greater than 1 will make safe mode permanent.
Specifies the number of datanodes that must be considered alive before the name node exits safemode. Values less than or equal to 0 mean not to take the number of live datanodes into account when deciding whether to remain in safe mode during startup. Values greater than the number of datanodes in the cluster will make safe mode permanent.
Specifies the maximum amount of bandwidth that each datanode can utilize for the balancing purpose in term of the number of bytes per second.
|
注意:在上面的配置中有一个地方要特别说明一下,dfs.ha.fencing.ssh.private-key-files这里指向的是一个本地文件。上面我们是配置了两个namenode来实现HDFS的HA的,分别是nn1和nn2,在nn2的~/.ssh/目录下需要将nn1的~/.ssh/目录下的id_rsa文件copy过来,并且应该重命名成如id_rsa_nn1这样的文件名,以免覆盖了本地的文件。
|
|
slave1 slave2 |
使用scp命令拷贝hadoop文件夹到slave1和slave2机器上面:
scp -r /home/hadoop/hadoop-2.6.0-cdh5.4.0 hadoop@sdardyMaster: /home/hadoop/
scp -r /home/hadoop/hadoop-2.6.0-cdh5.4.0 hadoop@slave1: /home/hadoop/
scp –r /home/hadoop/hadoop-2.6.0-cdh5.4.0 hadoop@slave2: /home/hadoop/
配置stardyMaster, slave1,slave2环境变量,跟master环境变量一样
在所有机器上创建配置文件所需目录,不然运行会报错,同时注意权限问题
Step 1 在某一个namenode节点执行如下命令,创建命名空间
[hadoop@master bin]$ cd $HADOOP_HOME
[hadoop@master]$ ./bin/hdfs zkfc -formatZK
-- Step 5.2 启动JournalNode进程(在3台服务器上分别执行):
[hadoop@master bin]$HADOOP_HOME/sbin/hadoop-daemon.sh start journalnode
[hadoop@stardyMaster bin]$HADOOP_HOME/sbin/hadoop-daemon.sh start journalnode
[hadoop@slave1]$HADOOP_HOME/sbin/hadoop-daemon.sh start journalnode
--Step 3格式化Hadoop集群并启动:
-- 在 master上执行:
[hadoop@master bin] $HADOOP_HOME/bin/hdfsnamenode -format mycluster
[hadoop@master bin]$HADOOP_HOME/sbin/hadoop-daemon.sh start namenode
-- 上步执行完后,在 stardyMaster上执行:
[hadoop@stardyMasterbin] $HADOOP_HOME/bin/hdfsnamenode -bootstrapStandby
[hadoop@stardyMaster bin]$HADOOP_HOME/sbin/hadoop-daemon.sh start namenode
在master启动:
$HADOOP_HOME/sbin/start-all.sh
-- 因为是配置的自动故障转移,所以不能手工切换namenode的active和stadby角色。
-- 可以通过haadmin查看每个Service的角色状态:
--Step 4可以用过kill命令关闭master上的namenode,如何查看是否出现切换
通过web界面查看
32213 JournalNode 32343 NameNode 526 ResourceManager 22412 Jps 7428 QuorumPeerMain 439 DFSZKFailoverController |
http://10.12.0.240:50070和http://10.12.0.243:50070 登录Web控制可以查看HDFS集群的状况
http:// 10.12.0.240:8188(配置文件配置了)可以通过Web控制台查看运行状态
上传spark-1.4.1-bin-2.6.0-cdh5.4.1.tgz到master服务器/home/hadoop目录。使用hadoop用户登入。
tar –xzvf spark-1.4.1-bin-2.6.0-cdh5.4.1.tgz–C/
mv spark-1.4.1-bin-2.6.0-cdh5.4.1spark-1.4.1
cd /home/hadoop/spark-1.4.1/conf
$ mv spark-env.sh.template spark-env.sh
vi spark-env.sh
export JAVA_HOME=/usr/local/java/jdk1.7.0_51 export SCALA_HOME=/usr/local/scala/scala-2.10.4
export HADOOP_CONF_DIR==/home/hadoop/CDH5/hadoop-2.6.0-cdh5.4.0/etc/hadoop export HADOOP_HOME==/home/hadoop/CDH5/hadoop-2.6.0-cdh5.4.0
export SPARK_WORKER_MEMORY=24g export SPARK_WORKER_CORES=6 export SAPRK_WORKER_INSTANCES=1
export SPARK_DRIVER_MEMORY=1g
export SPARK_EXECUTOR_MEMORY=24g
export SPARK_HOME=/home/hadoop/CDH5/spark-1.3.0-bin-cdh-5.4.0 export SPARK_MASTER_IP=10.12.0.93 export SPARK_MASTER_PORT=7077 export SPARK_=spark://${SPARK_MASTER_IP}:{SPARK_MASTER_PORT} export SPARK_CLASSPATH=$SPARK_CLASSPATH |
vi slaves
slave1 slave2
|
使用scp命令拷贝hadoop文件夹到slave1和slave2机器上面:
scp -r ~/spark-1.4.1 hadoop@slave1:/home/hadoop/CDH5/
scp -r /home/hadoop/CDH5/spark-1.3.0-bin-cdh-5.4.0 hadoop@slave2: /home/hadoop/CDH5/
cd /home/hadoop/CDH5/spark-1.3.0-bin-cdh-5.4.0/
在(10.12.0.240)机器启动命令
sbin/start-all.sh
在(10.12.0.243)机器启动命令
sbin/start-master.sh
jps
[hadoop@master conf]$ jps 4662 Master 3734 NameNode 14457 Jps 4170 ResourceManager |
http:// 10.12.0.93:8080可以通过Web控制台查看
运行自动例子
bin/ ./spark-submit --driver-memory 1g--class org.apache.spark.examples.SparkPi --master spark://master,standyMaster:7077/home/hadoop/CDH5/spark-1.3.0-bin-cdh-5.4.0/lib/spark-examples-1.3.0-hadoop2.6.0-cdh5.4.0.jar