Hadoop详解(五)——ZooKeeper详解,ZooKeeper伪分布搭建和集群搭建,Hadoop集群搭建,sqoop工具的使用
ZooKeeper简介
什么是ZooKeeper?
为什么使用ZooKeeper?
ZooKeeper能做哪些工作?
ZooKeeper特性
ZooKeeper的数据模型
ZooKeeper的节点
ZooKeeper的角色
ZooKeeper的顺序号
ZooKeeper的读写机制
ZooKeeper的保证
ZooKeeper的API接口
② Stat exists(String path, boolean watch)
③ void delete(String path, int version)
④ List<String> getChildren(String path, boolean watch)
⑤ List<String> getChildren(String path, Watcher watcher)
同样getChildren方法也有一个重载订单可以设置特定的watcher来监控子节点状态。
⑦ byte[] getData(String path, boolean watch, Stat stat)
⑧ void addAuthInfo(String scheme, byte[] auth)
⑨ Stat setACL(String path, List<ACL> acl, int version)
⑩ List<ACL> getACL(String path, Stat stat)
获取某个目录节点的访问权限列表
Watcher
① Watcher在ZooKeeper是一个核心功能,watcher可以监控目录节点的数据变化以及子目录的变化,一旦这些状态发生变化,服务器就会通知所有设置在这个目录节点上的Watcher,从而每个客户端都很快知道它所关注的目录节点的状态发生变化,而做出相应的反向。
(1) 写操作与ZooKeeper内部事件之间的对应关系
ACL
① digest:用户名,密码
② host:通过客户端的主机名来识别客户端
③ ip: 通过客户端的ip来识别客户端
new ACL(Perms.READ,new Id("host","example.com"));
这个ACL对应的身份验证模式是host,符合该模式的身份是example.com,权限的组合是:READ
Znode的节点状态
ZooKeeper工作原理
④ 当leader崩溃或者leader失去大多数的follower,这时候zk进入恢复模式,恢复模式需要重新选举出一个新的leader,让所有的server都恢复到一个正确的状态。
Leader选举
② 对于其他server的询问,server每次根据自己的状态都回复自己推荐的leader的id和上一次处理事务的zxid(系统启动时每个server都会推荐自己)
③ 收到所有Server回复以后,就计算出zxid最大的哪个Server,并将这个Server相关信息设置成下一次要投票的Server。
④ 计算这过程中获得票数最多的的sever为获胜者,如果获胜者的票数超过半数,则改server被选为leader。否则,继续这个过程,直到leader被选举出来。
⑤ leader就会开始等待server连接
⑥ Follower连接leader,将最大的zxid发送给leader
⑦ Leader根据follower的zxid确定同步点
⑧ 完成同步后通知follower 已经成为uptodate状态
⑨ Follower收到uptodate消息后,又可以重新接受client的请求进行服务了
ZooKeeper应用场景
场景一:统一命名服务
② Name Service 是 Zookeeper 内置的功能,只要调用 Zookeeper 的 API 就能实现
场景二:配置管理
② 将配置信息保存在 Zookeeper 的某个目录节点中,然后将所有需要修改的应用机器监控配置信息的状态,一旦配置信息发生变化,每台应用机器就会收到 Zookeeper 的通知,然后从 Zookeeper 获取新的配置信息应用到系统中。
举例:Zookeeper很容易实现这种集中式的配置管理,比如将APP1的所有配置配置到/APP1 znode下,APP1所有机器一启动就对/APP1这个节点进行监控(zk.exist(“/APP1″,true)),并且实现回调方法 Watcher,那么在zookeeper上/APP1 znode节点下数据发生变化的时候,每个机器都会收到通知,Watcher方法将会被执行,那么应用再取下数据即可 (zk.getData(“/APP1″,false,null));
场景三:集群管理
② Zookeeper 不仅能够维护当前的集群中机器的服务状态,而且能够选出一个“总管”,让这个总管来管理集群,这就是 Zookeeper 的另一个功能 Leader Election。
场景四:共享锁
场景5:队列管理
② 创建一个父目录 /synchronizing,每个成员都监控目录 /synchronizing/start 是否存在,然后每个成员都加入这个队列(创建 /synchronizing/member_i 的临时目录节点),然后每个成员获取 / synchronizing 目录的所有目录节点,判断 i 的值是否已经是成员的个数,如果小于成员个数等待 /synchronizing/start 的出现,如果已经相等就创建 /synchronizing/start。
ZooKeeper的安装和配置
ZooKeeper的配置选项
zookeeper的默认配置文件为zookeeper/conf/zoo_sample.cfg,需要将其修改为zoo.cfg。其中各配置项的含义,解释如下:
① tickTime:CS通信心跳时间
Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳。tickTime以毫秒为单位。
tickTime=2000
② initLimit:LF初始通信时限
集群中的follower服务器(F)与leader服务器(L)之间初始连接时能容忍的最多心跳数(tickTime的数量)。
initLimit=5
③ syncLimit:LF同步通信时限
集群中的follower服务器与leader服务器之间请求和应答之间能容忍的最多心跳数(tickTime的数量)。
syncLimit=2
④ dataDir:数据文件目录
Zookeeper保存数据的目录,默认情况下,Zookeeper将写数据的日志文件也保存在这个目录里。
dataDir=/home/michael/opt/zookeeper/data
⑤ clientPort:客户端连接端口
客户端连接 Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求。
clientPort=2181
⑥ 服务器名称与地址:集群信息(服务器编号,服务器地址,LF通信端口,选举端口)
这个配置项的书写格式比较特殊,规则如下:
server.N=YYY:A:B
server.1=hadoop4:2888:3888
server.2=hadoop5:2888:3888
server.3=hadoop6:2888:3888
ZooKeeper单机模式安装
启动ZooKeeper的Server:sh bin/zkServer.sh start, 如果想要关闭,输入:zkServer.sh stop
ZooKeeper集群模式安装
在conf目录下创建一个配置文件zoo.cfg,
syncLimit=2
server.1=server1:2888:3888
server.2=server2:2888:3888
server.3=server3:2888:3888
ZooKeeper伪集群安装
② 进入data目录,创建一个myid的文件,里面写入一个数字,server1,就写一个1,server2对应myid文件就写入2,server3对应myid文件就写个3
③ 在conf目录下创建一个配置文件zoo.cfg,
tickTime=2000
clientPort=2181
initLimit=5
syncLimit=2
server.1=server1:2888:3888
server.2=server2:2888:3888
server.3=server3:2888:3888
ZooKeeper接口
package hadoop.zookeeper.test;import java.io.IOException;import org.apache.hadoop.ha.ClientBaseWithFixes;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;public class ZookeeperDemo {public static void main(String[] args) throws Exception {// 创建一个与服务器的连接ZooKeeper zk = new ZooKeeper("hadoop0:2181", ClientBaseWithFixes.CONNECTION_TIMEOUT, new Watcher() {// 监控所有触发的事情@Overridepublic void process(WatchedEvent event) {System.out.println("已经触发了"+event.getType()+"事件!");}});// 创建一个目录节点zk.create("/testRootPath", "testRootData".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);// 创建一个子目录节点zk.create("/testRootPath/testChildPathOne", "testChildOneData".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);System.out.println(new String(zk.getData("/testRootPath", false, null)));// 取出子目录节点列表System.out.println(zk.getChildren("/testRootPath", true));// 修改子目录节点数据zk.setData("/testRootPath/testChildPathOne", "modifyChildOneData".getBytes(), -1);System.out.println("目录节点状态:["+zk.exists("/testRootPath", true)+"]");// 创建另外一个子目录节点zk.create("/testRootPath/testChildPathTwo", "testChildTwoData".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);System.out.println(new String(zk.getData("/testRootPath/testChildPathTwo", true, null)));// 删除子目录节点zk.delete("/testRootPath/testChildPathTwo", -1);zk.delete("/testRootPath/testChildPathOne", -1);// 删除父目录节点zk.delete("/testRootPath", -1);// 关闭连接zk.close();}
}
运行结果:
testRootData
[testChildPathOne]
目录节点状态:[4294967298,4294967298,1504285237971,1504285237971,0,1,0,0,12,1,4294967299
]
已经触发了NodeChildrenChanged事件!
testChildTwoData
已经触发了NodeDeleted事件!
已经触发了NodeDeleted事件!
Hadoop高可靠性HD的原理
已知Hadoop1.0 中NameNode会不断的将元数据信息写入edits和fsimage文件中。在Hadoop2.0之后就不再使用这种方式。如上图所示,处于Active活跃状态的NameNode会实时的将eidts文件存入到专门存放edits文件的介质中(JournalNode,它依赖于ZooKeeper),处于standby状态的NameNode会实时的将介质中的数据同步下来,从而完成active状态的NameNode和standby状态的NameNode中数据的实时同步。
隔离机制:第一种是sshfence 当处于active状态的NM出现了问题但是此进程没有死掉,通过通讯,处于standby状态的NM得到了此信息,但是不能启动两个active状态的NM,standby状态的NM就会首先通过sshfence隔离机制发送命令kill掉出问题的active状态的NM,然后自己转为active状态。第二种就是shell(/bin/true) 隔离机制,在处于active状态的NM所在机器宕机后,同时与它在同一台机器的ZKFC也会死掉,当standby状态的NM发现长时间没有收到active状态的NM的信息,就会任务它已经宕机了,然后就会执行shell脚本,只要返回true,它就会切换为active状态。
Hadoop集群搭建
Hadoop2.2.0集群搭建说明书
hadoop2.0已经发布了稳定版本了,增加了很多特性,比如HDFS HA、YARN等。
1.修改Linux主机名
2.修改IP
3.修改主机名和IP的映射关系######注意######如果公司是租用的服务器或是使用的云主机(如华为用主机、阿里云主机等)/etc/hosts里面要配置的是内网IP地址和主机名的映射关系
4.关闭防火墙
5.ssh免登陆
6.安装JDK,配置环境变量等集群规划:主机名 IP 安装的软件 运行的进程hadoop1 192.168.0.10 jdk、hadoop NameNode、DFSZKFailoverControllerhadoop2 192.168.0.20 jdk、hadoop NameNode、DFSZKFailoverControllerhadoop3 192.168.0.30 jdk、hadoop ResourceManagerhadoop4 192.168.0.40 jdk、hadoop、zookeeper DataNode、NodeManager、JournalNode、QuorumPeerMainhadoop5 192.168.0.50 jdk、hadoop、zookeeper DataNode、NodeManager、JournalNode、QuorumPeerMainhadoop6 192.168.0.60 jdk、hadoop、zookeeper DataNode、NodeManager、JournalNode、QuorumPeerMain说明:在hadoop2.0中通常由两个NameNode组成,一个处于active状态,另一个处于standby状态。Active NameNode对外提供服务,而Standby NameNode则不对外提供服务,仅同步active namenode的状态,以便能够在它失败时快速进行切换。hadoop2.0官方提供了两种HDFS HA的解决方案,一种是NFS,另一种是QJM。这里我们使用简单的QJM。在该方案中,主备NameNode之间通过一组JournalNode同步元数据信息,一条数据只要成功写入多数JournalNode即认为写入成功。通常配置奇数个JournalNode这里还配置了一个zookeeper集群,用于ZKFC(DFSZKFailoverController)故障转移,当Active NameNode挂掉了,会自动切换Standby NameNode为standby状态安装步骤:1.安装配置zooekeeper集群1.1解压tar -zxvf zookeeper-3.4.5.tar.gz -C /cloud/1.2修改配置cd /cloud/zookeeper-3.4.5/conf/cp zoo_sample.cfg zoo.cfgvim zoo.cfg修改:dataDir=/cloud/zookeeper-3.4.5/tmp在最后添加:server.1=hadoop4:2888:3888server.2=hadoop5:2888:3888server.3=hadoop6:2888:3888保存退出然后创建一个tmp文件夹mkdir /cloud/zookeeper-3.4.5/tmp再创建一个空文件touch /cloud/zookeeper-3.4.5/tmp/myid最后向该文件写入IDecho 1 > /cloud/zookeeper-3.4.5/tmp/myid1.3将配置好的zookeeper拷贝到其他节点(首先分别在hadoop5、hadoop6根目录下创建一个cloud目录:mkdir /cloud)scp -r /cloud/zookeeper-3.4.5/ hadoop5:/cloud/scp -r /cloud/zookeeper-3.4.5/ hadoop6:/cloud/注意:修改hadoop5、hadoop6对应/cloud/zookeeper-3.4.5/tmp/myid内容hadoop5:echo 2 > /cloud/zookeeper-3.4.5/tmp/myidhadoop6:echo 3 > /cloud/zookeeper-3.4.5/tmp/myid2.安装配置hadoop集群2.1解压tar -zxvf hadoop-2.2.0.tar.gz -C /cloud/2.2配置HDFS(hadoop2.0所有的配置文件都在$HADOOP_HOME/etc/hadoop目录下)#将hadoop添加到环境变量中vim /etc/profileexport JAVA_HOME=/usr/java/jdk1.7.0_55export HADOOP_HOME=/cloud/hadoop-2.2.0export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin#hadoop2.0的配置文件全部在$HADOOP_HOME/etc/hadoop下cd /cloud/hadoop-2.2.0/etc/hadoop2.2.1修改hadoo-env.shexport JAVA_HOME=/usr/java/jdk1.7.0_552.2.2修改core-site.xml<configuration><!-- 指定hdfs的nameservice为ns1 --><property><name>fs.defaultFS</name><value>hdfs://ns1</value></property><!-- 指定hadoop临时目录 --><property><name>hadoop.tmp.dir</name><value>/cloud/hadoop-2.2.0/tmp</value></property><!-- 指定zookeeper地址 --><property><name>ha.zookeeper.quorum</name><value>hadoop4:2181,hadoop5:2181,hadoop6:2181</value></property></configuration>2.2.3修改hdfs-site.xml<configuration><!--指定hdfs的nameservice为ns1,需要和core-site.xml中的保持一致 --><property><name>dfs.nameservices</name><value>ns1</value></property><!-- ns1下面有两个NameNode,分别是nn1,nn2 --><property><name>dfs.ha.namenodes.ns1</name><value>nn1,nn2</value></property><!-- nn1的RPC通信地址 --><property><name>dfs.namenode.rpc-address.ns1.nn1</name><value>hadoop1:9000</value></property><!-- nn1的http通信地址 --><property><name>dfs.namenode.http-address.ns1.nn1</name><value>hadoop1:50070</value></property><!-- nn2的RPC通信地址 --><property><name>dfs.namenode.rpc-address.ns1.nn2</name><value>hadoop2:9000</value></property><!-- nn2的http通信地址 --><property><name>dfs.namenode.http-address.ns1.nn2</name><value>hadoop2:50070</value></property><!-- 指定NameNode的元数据在JournalNode上的存放位置 --><property><name>dfs.namenode.shared.edits.dir</name><value>qjournal://hadoop4:8485;hadoop5:8485;hadoop6:8485/ns1</value></property><!-- 指定JournalNode在本地磁盘存放数据的位置 --><property><name>dfs.journalnode.edits.dir</name><value>/cloud/hadoop-2.2.0/journal</value></property><!-- 开启NameNode失败自动切换 --><property><name>dfs.ha.automatic-failover.enabled</name><value>true</value></property><!-- 配置失败自动切换实现方式 --><property><name>dfs.client.failover.proxy.provider.ns1</name><value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value></property><!-- 配置隔离机制方法,多个机制用换行分割,即每个机制暂用一行--><property><name>dfs.ha.fencing.methods</name><value>sshfenceshell(/bin/true)</value></property><!-- 使用sshfence隔离机制时需要ssh免登陆 --><property><name>dfs.ha.fencing.ssh.private-key-files</name><value>/root/.ssh/id_rsa</value></property><!-- 配置sshfence隔离机制超时时间 --><property><name>dfs.ha.fencing.ssh.connect-timeout</name><value>30000</value></property></configuration>2.2.4修改mapred-site.xml<configuration><!-- 指定mr框架为yarn方式 --><property><name>mapreduce.framework.name</name><value>yarn</value></property></configuration> 2.2.5修改yarn-site.xml<configuration><!-- 指定resourcemanager地址 --><property><name>yarn.resourcemanager.hostname</name><value>hadoop3</value></property><!-- 指定nodemanager启动时加载server的方式为shuffle server --><property><name>yarn.nodemanager.aux-services</name><value>mapreduce_shuffle</value></property></configuration>2.2.6修改slaves(slaves是指定子节点的位置,因为要在hadoop1上启动HDFS、在hadoop3启动yarn,所以hadoop1上的slaves文件指定的是datanode的位置,hadoop3上的slaves文件指定的是nodemanager的位置)hadoop4hadoop5hadoop62.2.7配置免密码登陆#首先要配置hadoop1到hadoop2、hadoop3、hadoop4、hadoop5、hadoop6的免密码登陆#在hadoop1上生产一对钥匙ssh-keygen -t rsa#将公钥拷贝到其他节点,包括自己ssh-coyp-id hadoop1ssh-coyp-id hadoop2ssh-coyp-id hadoop3ssh-coyp-id hadoop4ssh-coyp-id hadoop5ssh-coyp-id hadoop6#配置hadoop3到hadoop4、hadoop5、hadoop6的免密码登陆#在hadoop3上生产一对钥匙ssh-keygen -t rsa#将公钥拷贝到其他节点ssh-coyp-id hadoop4ssh-coyp-id hadoop5ssh-coyp-id hadoop6#注意:两个namenode之间要配置ssh免密码登陆,别忘了配置hadoop2到hadoop1的免登陆在hadoop2上生产一对钥匙ssh-keygen -t rsassh-coyp-id -i hadoop1 2.4将配置好的hadoop拷贝到其他节点scp -r /cloud/ hadoop2:/scp -r /cloud/ hadoop3:/scp -r /cloud/hadoop-2.2.0/ root@hadoop4:/cloud/scp -r /cloud/hadoop-2.2.0/ root@hadoop5:/cloud/scp -r /cloud/hadoop-2.2.0/ root@hadoop6:/cloud/###注意:严格按照下面的步骤2.5启动zookeeper集群(分别在hadoop4、hadoop5、hadoop6上启动zk)cd /cloud/zookeeper-3.4.5/bin/./zkServer.sh start#查看状态:一个leader,两个follower./zkServer.sh status2.6启动journalnode(在hadoop1上启动所有journalnode,注意:是调用的hadoop-daemons.sh这个脚本,注意是复数s的那个脚本)cd /cloud/hadoop-2.2.0sbin/hadoop-daemons.sh start journalnode#运行jps命令检验,hadoop4、hadoop5、hadoop6上多了JournalNode进程2.7格式化HDFS#在hadoop1上执行命令:hdfs namenode -format#格式化后会在根据core-site.xml中的hadoop.tmp.dir配置生成个文件,这里我配置的是/cloud/hadoop-2.2.0/tmp,然后将/cloud/hadoop-2.2.0/tmp拷贝到hadoop2的/cloud/hadoop-2.2.0/下。scp -r tmp/ hadoop2:/cloud/hadoop-2.2.0/2.8格式化ZK(在hadoop1上执行即可)hdfs zkfc -formatZK2.9启动HDFS(在hadoop1上执行)sbin/start-dfs.sh2.10启动YARN(#####注意#####:是在hadoop3上执行start-yarn.sh,把namenode和resourcemanager分开是因为性能问题,因为他们都要占用大量资源,所以把他们分开了,他们分开了就要分别在不同的机器上启动)sbin/start-yarn.sh到此,hadoop2.2.0配置完毕,可以统计浏览器访问:http://192.168.0.10:50070NameNode 'hadoop1:9000' (active)http://192.168.0.20:50070NameNode 'hadoop2:9000' (standby)验证HDFS HA首先向hdfs上传一个文件hadoop fs -put /etc/profile /profilehadoop fs -ls /然后再kill掉active的NameNodekill -9 <pid of NN>通过浏览器访问:http://192.168.0.20:50070NameNode 'hadoop2:9000' (active)这个时候hadoop2上的NameNode变成了active在执行命令:hadoop fs -ls /-rw-r--r-- 3 root supergroup 1926 2014-02-06 15:36 /profile刚才上传的文件依然存在!!!手动启动那个挂掉的NameNodesbin/hadoop-daemon.sh start namenode通过浏览器访问:http://192.168.0.10:50070NameNode 'hadoop1:9000' (standby)验证YARN:运行一下hadoop提供的demo中的WordCount程序:hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.2.0.jar wordcount /profile /outOK,大功告成!!!
Hadoop2.4.1集群搭建说明
hadoop2.0已经发布了稳定版本了,增加了很多特性,比如HDFS HA、YARN等。最新的hadoop-2.4.1又增加了YARN HA
1.修改Linux主机名
2.修改IP
3.修改主机名和IP的映射关系######注意######如果你们公司是租用的服务器或是使用的云主机(如华为用主机、阿里云主机等)/etc/hosts里面要配置的是内网IP地址和主机名的映射关系
4.关闭防火墙
5.ssh免登陆
6.安装JDK,配置环境变量等集群规划:主机名 IP 安装的软件 运行的进程hadoop1 192.168.0.10 jdk、hadoop NameNode、DFSZKFailoverController(zkfc)hadoop2 192.168.0.20 jdk、hadoop NameNode、DFSZKFailoverController(zkfc)hadoop3 192.168.0.30 jdk、hadoop ResourceManagerhadoop4 192.168.0.40 jdk、hadoop ResourceManagerhadoop5 192.168.0.50 jdk、hadoop、zookeeper DataNode、NodeManager、JournalNode、QuorumPeerMainhadoop6 192.168.0.60 jdk、hadoop、zookeeper DataNode、NodeManager、JournalNode、QuorumPeerMainhadoop7 192.168.0.70 jdk、hadoop、zookeeper DataNode、NodeManager、JournalNode、QuorumPeerMain说明:1.在hadoop2.0中通常由两个NameNode组成,一个处于active状态,另一个处于standby状态。Active NameNode对外提供服务,而Standby NameNode则不对外提供服务,仅同步active namenode的状态,以便能够在它失败时快速进行切换。hadoop2.0官方提供了两种HDFS HA的解决方案,一种是NFS,另一种是QJM。这里我们使用简单的QJM。在该方案中,主备NameNode之间通过一组JournalNode同步元数据信息,一条数据只要成功写入多数JournalNode即认为写入成功。通常配置奇数个JournalNode这里还配置了一个zookeeper集群,用于ZKFC(DFSZKFailoverController)故障转移,当Active NameNode挂掉了,会自动切换Standby NameNode为standby状态2.hadoop-2.2.0中依然存在一个问题,就是ResourceManager只有一个,存在单点故障,hadoop-2.4.1解决了这个问题,有两个ResourceManager,一个是Active,一个是Standby,状态由zookeeper进行协调
安装步骤:1.安装配置zooekeeper集群(在hadoop5上)1.1解压tar -zxvf zookeeper-3.4.5.tar.gz -C /cloud/1.2修改配置cd /cloud/zookeeper-3.4.5/conf/cp zoo_sample.cfg zoo.cfgvim zoo.cfg修改:dataDir=/cloud/zookeeper-3.4.5/tmp在最后添加:server.1=hadoop5:2888:3888server.2=hadoop6:2888:3888server.3=hadoop7:2888:3888保存退出然后创建一个tmp文件夹mkdir /cloud/zookeeper-3.4.5/tmp再创建一个空文件touch /cloud/zookeeper-3.4.5/tmp/myid最后向该文件写入IDecho 1 > /cloud/zookeeper-3.4.5/tmp/myid1.3将配置好的zookeeper拷贝到其他节点(首先分别在hadoop6、hadoop7根目录下创建一个cloud目录:mkdir /cloud)scp -r /cloud/zookeeper-3.4.5/ hadoop6:/cloud/scp -r /cloud/zookeeper-3.4.5/ hadoop7:/cloud/注意:修改hadoop6、hadoop7对应/cloud/zookeeper-3.4.5/tmp/myid内容hadoop6:echo 2 > /cloud/zookeeper-3.4.5/tmp/myidhadoop7:echo 3 > /cloud/zookeeper-3.4.5/tmp/myid2.安装配置hadoop集群(在hadoop1上操作)2.1解压tar -zxvf hadoop-2.4.1.tar.gz -C /cloud/2.2配置HDFS(hadoop2.0所有的配置文件都在$HADOOP_HOME/etc/hadoop目录下)#将hadoop添加到环境变量中vim /etc/profileexport JAVA_HOME=/usr/java/jdk1.7.0_55export HADOOP_HOME=/cloud/hadoop-2.4.1export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin#hadoop2.0的配置文件全部在$HADOOP_HOME/etc/hadoop下cd /cloud/hadoop-2.4.1/etc/hadoop2.2.1修改hadoo-env.shexport JAVA_HOME=/usr/java/jdk1.7.0_552.2.2修改core-site.xml<configuration><!-- 指定hdfs的nameservice为ns1 --><property><name>fs.defaultFS</name><value>hdfs://ns1</value></property><!-- 指定hadoop临时目录 --><property><name>hadoop.tmp.dir</name><value>/cloud/hadoop-2.4.1/tmp</value></property><!-- 指定zookeeper地址 --><property><name>ha.zookeeper.quorum</name><value>hadoop5:2181,hadoop6:2181,hadoop7:2181</value></property></configuration>2.2.3修改hdfs-site.xml<configuration><!--指定hdfs的nameservice为ns1,需要和core-site.xml中的保持一致 --><property><name>dfs.nameservices</name><value>ns1</value></property><!-- ns1下面有两个NameNode,分别是nn1,nn2 --><property><name>dfs.ha.namenodes.ns1</name><value>nn1,nn2</value></property><!-- nn1的RPC通信地址 --><property><name>dfs.namenode.rpc-address.ns1.nn1</name><value>hadoop1:9000</value></property><!-- nn1的http通信地址 --><property><name>dfs.namenode.http-address.ns1.nn1</name><value>hadoop1:50070</value></property><!-- nn2的RPC通信地址 --><property><name>dfs.namenode.rpc-address.ns1.nn2</name><value>hadoop2:9000</value></property><!-- nn2的http通信地址 --><property><name>dfs.namenode.http-address.ns1.nn2</name><value>hadoop2:50070</value></property><!-- 指定NameNode的元数据在JournalNode上的存放位置 --><property><name>dfs.namenode.shared.edits.dir</name><value>qjournal://hadoop5:8485;hadoop6:8485;hadoop7:8485/ns1</value></property><!-- 指定JournalNode在本地磁盘存放数据的位置 --><property><name>dfs.journalnode.edits.dir</name><value>/cloud/hadoop-2.4.1/journal</value></property><!-- 开启NameNode失败自动切换 --><property><name>dfs.ha.automatic-failover.enabled</name><value>true</value></property><!-- 配置失败自动切换实现方式 --><property><name>dfs.client.failover.proxy.provider.ns1</name><value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value></property><!-- 配置隔离机制方法,多个机制用换行分割,即每个机制暂用一行--><property><name>dfs.ha.fencing.methods</name><value>sshfenceshell(/bin/true)</value></property><!-- 使用sshfence隔离机制时需要ssh免登陆 --><property><name>dfs.ha.fencing.ssh.private-key-files</name><value>/home/hadoop/.ssh/id_rsa</value></property><!-- 配置sshfence隔离机制超时时间 --><property><name>dfs.ha.fencing.ssh.connect-timeout</name><value>30000</value></property></configuration>2.2.4修改mapred-site.xml<configuration><!-- 指定mr框架为yarn方式 --><property><name>mapreduce.framework.name</name><value>yarn</value></property></configuration> 2.2.5修改yarn-site.xml<configuration><!-- 开启RM高可靠 --><property><name>yarn.resourcemanager.ha.enabled</name><value>true</value></property><!-- 指定RM的cluster id --><property><name>yarn.resourcemanager.cluster-id</name><value>yrc</value></property><!-- 指定RM的名字 --><property><name>yarn.resourcemanager.ha.rm-ids</name><value>rm1,rm2</value></property><!-- 分别指定RM的地址 --><property><name>yarn.resourcemanager.hostname.rm1</name><value>hadoop3</value></property><property><name>yarn.resourcemanager.hostname.rm2</name><value>hadoop4</value></property><!-- 指定zk集群地址 --><property><name>yarn.resourcemanager.zk-address</name><value>hadoop5:2181,hadoop6:2181,hadoop7:2181</value></property><property><name>yarn.nodemanager.aux-services</name><value>mapreduce_shuffle</value></property></configuration>2.2.6修改slaves(slaves是指定子节点的位置,因为要在hadoop1上启动HDFS、在hadoop3启动yarn,所以hadoop1上的slaves文件指定的是datanode的位置,hadoop3上的slaves文件指定的是nodemanager的位置)hadoop5hadoop6hadoop72.2.7配置免密码登陆#首先要配置hadoop1到hadoop2、hadoop3、hadoop4、hadoop5、hadoop6、hadoop7的免密码登陆#在hadoop1上生产一对钥匙ssh-keygen -t rsa#将公钥拷贝到其他节点,包括自己ssh-coyp-id hadoop1ssh-coyp-id hadoop2ssh-coyp-id hadoop3ssh-coyp-id hadoop4ssh-coyp-id hadoop5ssh-coyp-id hadoop6ssh-coyp-id hadoop7#配置hadoop3到hadoop4、hadoop5、hadoop6、hadoop7的免密码登陆#在hadoop3上生产一对钥匙ssh-keygen -t rsa#将公钥拷贝到其他节点ssh-coyp-id hadoop4ssh-coyp-id hadoop5ssh-coyp-id hadoop6ssh-coyp-id hadoop7#注意:两个namenode之间要配置ssh免密码登陆,别忘了配置hadoop2到hadoop1的免登陆在hadoop2上生产一对钥匙ssh-keygen -t rsassh-coyp-id -i hadoop1 2.4将配置好的hadoop拷贝到其他节点scp -r /cloud/ hadoop2:/scp -r /cloud/ hadoop3:/scp -r /cloud/hadoop-2.4.1/ root@hadoop4:/cloud/scp -r /cloud/hadoop-2.4.1/ root@hadoop5:/cloud/scp -r /cloud/hadoop-2.4.1/ root@hadoop6:/cloud/scp -r /cloud/hadoop-2.4.1/ root@hadoop7:/cloud/###注意:严格按照下面的步骤2.5启动zookeeper集群(分别在hadoop5、hadoop6、tcast07上启动zk)cd /cloud/zookeeper-3.4.5/bin/./zkServer.sh start#查看状态:一个leader,两个follower./zkServer.sh status2.6启动journalnode(分别在在hadoop5、hadoop6、tcast07上执行)cd /cloud/hadoop-2.4.1sbin/hadoop-daemon.sh start journalnode#运行jps命令检验,hadoop5、hadoop6、hadoop7上多了JournalNode进程2.7格式化HDFS#在hadoop1上执行命令:hdfs namenode -format#格式化后会在根据core-site.xml中的hadoop.tmp.dir配置生成个文件,这里我配置的是/cloud/hadoop-2.4.1/tmp,然后将/cloud/hadoop-2.4.1/tmp拷贝到hadoop2的/cloud/hadoop-2.4.1/下。scp -r tmp/ hadoop2:/cloud/hadoop-2.4.1/2.8格式化ZK(在hadoop1上执行即可)hdfs zkfc -formatZK2.9启动HDFS(在hadoop1上执行)sbin/start-dfs.sh2.10启动YARN(#####注意#####:是在hadoop3上执行start-yarn.sh,把namenode和resourcemanager分开是因为性能问题,因为他们都要占用大量资源,所以把他们分开了,他们分开了就要分别在不同的机器上启动)sbin/start-yarn.sh到此,hadoop-2.4.1配置完毕,可以统计浏览器访问:http://192.168.0.10:50070NameNode 'hadoop1:9000' (active)http://192.168.0.20:50070NameNode 'hadoop2:9000' (standby)验证HDFS HA首先向hdfs上传一个文件hadoop fs -put /etc/profile /profilehadoop fs -ls /然后再kill掉active的NameNodekill -9 <pid of NN>通过浏览器访问:http://192.168.0.20:50070NameNode 'hadoop2:9000' (active)这个时候hadoop2上的NameNode变成了active在执行命令:hadoop fs -ls /-rw-r--r-- 3 root supergroup 1926 2014-02-06 15:36 /profile刚才上传的文件依然存在!!!手动启动那个挂掉的NameNodesbin/hadoop-daemon.sh start namenode通过浏览器访问:http://192.168.0.10:50070NameNode 'hadoop1:9000' (standby)验证YARN:运行一下hadoop提供的demo中的WordCount程序:hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.4.1.jar wordcount /profile /out配置成功!!!
我使用的Hadoop版本是2.7.4 ,由于嫌麻烦,就按照2.2.0的方式进行配置的。

在hadoop3上停止Yarn

再次在hadoop1上启动HDFS 查看启动顺序

启动HDFS文件系统时,在hadoop1中读取$HADOOP_HOME/etc/hadoop/目录中的hdfs-site.xml信息启动NameNode,根据slaves配置文件通过ssh协议启动DataNodes,然后根据hdfs-site.xml中的信息通过ssh协议启动JournalNodes 至于最后启动的ZKFC 是和每台NameNode连在一块的。NameNodes—>DataNodes—>JournalNodes—>ZKFCs
需要注意的是:在安装格式化的时候,需要启动JournalNode,在安装完成后启动HDFS或YARN前只需要启动ZooKeeper集群即可
再次在hadoop3上启动yarn 查看启动顺序

在启动yarn的时候,首先启动ResourceManager 因为在本地的yarn-site.xml中配置的ResourceManager所在主机是hadoop3 所以会在本地启动,然后读取本地的slaves配置文件 通过ssh协议将slaves文件中指定的所有的主机上启动NodeManager。注意:启动时都是读取本地的配置文件,在hadoop3上启动yarn 会根据本地的slaves中的配置决定在哪些台机器上启动NodeManager,而在hadoop1上启动HDFS会根据它本地的slaves配置 确定在哪些台机器上启动DataNode,一般情况下建议它们的slaves配置文件保持一致,不过不一致也可,如果不一致意味着NodeManager和DataNode不完全在同样的机器中启动。
Hadoop集群下Java操作方式
package liuxun.hadoop.ha.hdfs;import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URI;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;public class HDFSDemo_HA {public static void main(String[] args) throws Exception {Configuration conf = new Configuration();conf.set("dfs.nameservices", "ns1");conf.set("dfs.ha.namenodes.ns1", "nn1,nn2");conf.set("dfs.namenode.rpc-address.ns1.nn1", "hadoop1:9000");conf.set("dfs.namenode.rpc-address.ns1.nn2", "hadoop2:9000");conf.set("dfs.client.failover.proxy.provider.ns1","org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider");// FileSystem fs = FileSystem.get(new URI("hdfs://ns1"), conf);// 测试下载// InputStream in = fs.open(new Path("/profile"));// OutputStream out = new FileOutputStream("/Users/liuxun/Downloads/p.txt");// IOUtils.copyBytes(in, out, 4096, true);// 测试上传FileSystem fs = FileSystem.get(new URI("hdfs://ns1"), conf,"root");InputStream in = new FileInputStream("/Users/liuxun/Downloads/a.txt");OutputStream out = fs.create(new Path("/a"));IOUtils.copyBytes(in, out, 4096, true);}
}
Sqoop
Sqoop是一个用来将Hadoop和关系型数据库中的数据相互转移的工具,可以将一个关系型数据库(例如 : MySQL ,Oracle ,Postgres等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。
数据迁移工具——主要用于HDFS和关系型数据库之间数据的相互迁移
例如可以将关系型数据库中的历史数据迁移到HDFS上,运行MapReduce计算分析结果输出到HDFS上,再将结果迁移到关系型数据库中。而sqoop有自己独特的语法,底层采用MapReducer实现,可它以启动多个并行的MapReducer.它依赖于yarn和HDFS。
注意:sqoop不需要搭建集群,它可以安装在任意一台机器上
首先下载sqoop http://archive.apache.org/dist/sqoop/1.4.4/
我的安装位置是放在hadoop3上
上传安装包,解压到/cloud/下
tar -zxvf sqoop-1.4.4.bin__hadoop-2.0.4-alpha.tar.gz -C /cloud/
发现名称过长 进行重命名
mv sqoop-1.4.4.bin__hadoop-2.0.4-alpha/ sqoop-1.4.4
配置:如果安装配置了Hadoop 则不需要对sqoop的配置文件做任何配置,实际上它会查找环境变量$HADOOP_HOME 找到Hadoop的配置文件 然后就可以查找到ResourceManager和NameNode的位置。
(1) 首选将sqoop添加到环境变量
vim /etc/profile 修改成如下配置
export JAVA_HOME=/usr/java/jdk1.8.0_144
export HADOOP_HOME=/cloud/hadoop-2.7.4
export SQOOP_HOME=/cloud/sqoop-1.4.4
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$SQOOP_HOME/bi
n
使其生效:source /etc/profile
(2)将数据库连接驱动拷贝到$SQOOP_HOME/lib里
(3)将数据库开启远程连接
在使用之前首先保证要操作的数据库开启远程连接 MySQL开启远程连接的方法如下
GRANT ALL PRIVILEGES ON myshop.* TO 'root'@'192.168.0.30’ IDENTIFIED BY ‘root’ WITH GRANT OPTION;
FLUSH PRIVILEGES;
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY ‘root’ WITH GRANT OPTION;
FLUSH PRIVILEGES
注意:*.* 所有数据库所有表 'root'@'%' 允许任意主机以root用户身份连接 IDENTIFIED BY 表示连接时的密码
(4)使用(可以查看安装包中的文档)

第一类:数据库中的数据导入到HDFS上
① 指定输出哪些列
sqoop import --connect jdbc:mysql://192.168.0.103:3306/myshop --username root --password root --table product --columns 'pid,pname,market_price,shop_price'
② 指定输出路径、指定数据分隔符
sqoop import --connect jdbc:mysql://192.168.0.103:3306/myshop --username root --password root --table product --columns 'pid,pname,market_price,shop_price' --target-dir '/sqoop/td1' --fields-terminated-by '\t'
③ 指定Map数量 -m
sqoop import --connect jdbc:mysql://192.168.0.103:3306/myshop --username root --password root --table product --columns 'pid,pname,market_price,shop_price' --target-dir '/sqoop/td2' --fields-terminated-by '\t' -m 2
(只会生成两个part文件 part-m-00000和part-m-00001 说明sqoop底层只是使用了map没有使用reducer)
④ 增加where条件, 注意:条件必须用引号引起来
sqoop import --connect jdbc:mysql://192.168.0.103:3306/myshop --username root --password root --table product --columns 'pid,pname,market_price,shop_price' --where 'pid>4 and pname like "%装%"' --target-dir '/sqoop/td3' --fields-terminated-by '\t' -m 2
⑤ 增加query语句(使用 \ 将语句换行)
sqoop import --connect jdbc:mysql://192.168.0.103:3306/myshop --username root --password root --query 'select * from product where pid > 6 and pname like "%套%" and $CONDITIONS' --split-by product.pid --target-dir '/sqoop/td4' --fields-terminated-by '\t' -m 3
注意:如果使用--query这个命令的时候,需要注意的是where后面的参数,AND $CONDITIONS这个参数必须加上
而且存在单引号与双引号的区别,如果--query后面使用的是双引号,那么需要在$CONDITIONS前加上\即\$CONDITIONS
如果设置map数量为1个时即-m 1,不用加上--split-by ${tablename.column},否则需要加上
第二类:将HDFS上的数据导出到数据库中(不要忘记指定分隔符)
首先在数据库中创建和product字段一样的表
create table tab_back like product;
命令:
sqoop export --connect jdbc:mysql://192.168.0.103:3306/myshop --username root --password root --export-dir '/sqoop/td3' --table tab_back -m 1 --fields-terminated-by '\t'
成功执行,刷新数据库,发现tab_back表中有了数据
shell使用技巧
Hadoop详解(五)——ZooKeeper详解,ZooKeeper伪分布搭建和集群搭建,Hadoop集群搭建,sqoop工具的使用相关推荐
- HUE配置文件hue.ini 的zookeeper模块详解(图文详解)(分HA集群)
不多说,直接上干货! 我的集群机器情况是 bigdatamaster(192.168.80.10).bigdataslave1(192.168.80.11)和bigdataslave2(192.168 ...
- 08-Hadoop之Zookeeper详解
Zookeeper入门 一. zookeeper 概述 1.1 概述 zookeeper 是一个开源的分布式协调系统,为分布式应用提供协调服务的Apache项目. 工作机制:从设计角度:是一个基于观察 ...
- 大数据学前准备--zookeeper详解与集群搭建(保姆级教程)
前言 本人是才学完大数据的无业游民,我将会总结学习收获或发表自己的学习心得,期望给初学者也为自己今后复习提供一些帮助. 我将陆续发布大数据阶段所学,包括但不限于(hadoop,hive,hbase,p ...
- Springboot 整合 Dubbo/ZooKeeper 详解 SOA 案例
摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢! "看看星空,会觉得自己很渺小,可能我们在宇宙中从来就是一个偶然.所以,无论什么事情,仔 ...
- Zookeeper详解---从入门到精通
Zookeeper 1. Zookeeper 概念 Zookeeper 是一个分布式协调服务,可用于服务发现,分布式锁,分布式领导选举,配置管理等. Zookeeper 提供了一个类似于 Linux ...
- Zookeeper详解(三)——开源客户端curator
开源客户端curator (true re de) curator是Netflix公司开源的一个zookeeper客户端,后捐献给apache,curator框架在zookeeper原生API接口上进 ...
- Hadoop 新 MapReduce 框架 Yarn 详解
Hadoop MapReduceV2(Yarn) 框架简介 原 Hadoop MapReduce 框架的问题 对于业界的大数据存储及分布式处理系统来说,Hadoop 是耳熟能详的卓越开源分布式文件存储 ...
- Hadoop之Yarn工作机制详解
Hadoop之Yarn工作机制详解 目录 Yarn概述 Yarn基本架构 Yarn工作机制 作业提交全过程详解 1. Yarn概述 Yarn是一个资源调度平台,负责为运算程序提供服务器运算资源,相当于 ...
- Hadoop之OutputFormat数据输出详解
Hadoop之OutputFormat数据输出详解 目录 OutputFormat接口实现类 自定义OutputFormat 1. OutputFormat接口实现类 OutputFormat是Map ...
最新文章
- Linux 查看和删除进程
- main执行之前与之后
- JAVA异常处理分析(中)
- FROONT – 超棒的可视化响应式网页设计工具
- 【转】XP/2000无法使用“缩略图查看”、右键无“设置桌面背景”选项问题详解...
- 包含天,时,分,秒的倒计时
- android ui自动化框架选型,Appium UI 自动化框架之我见 (开源)
- 如何使用 MySQL 的 IDE 导出导入数据表文件(以 Navicat for MySQL 导出导入 Excel 文件为例)
- 97.用好浏览器的缓存
- 从零开始实现霍夫变换检测图像直线算法 python
- 【Prufer Sequence +简单排列组合】bzoj 1005: [HNOI2008]明明的烦恼
- python上的表白代码_用Python实现表白代码
- cocos2d-html5 仿微信打飞机游戏
- 基于FPGA的可控倒计时计数器
- 口袋妖怪金心银魂详细图文攻略(上)及游戏下载
- 戴尔寄希望于区块链在印度服务器市场保持竞争力
- 域名与服务器如何绑定?
- 贝叶斯(朴素贝叶斯,正太贝叶斯)及OpenCV源码分析
- CSS box-shadow 详解
- linux 服务器内存清理内存缓存 详细说明 java jvm
热门文章
- 关于使用福昕阅读器电脑卡问题(使用ubuntu)!
- SQL Server 怎样使用SQL输出建表语句
- 虚幻4打包安卓的问题
- JAVA JDK1.6 https协议下载问题记录
- iOS: UIBezierPath简介及静态图形实现
- 辉崽崽的博客开通了,仅此记录一下
- 正则表达式筛出多余符号、只留英文字母
- Swagger3.0与Swagger2对比
- python丨输入出生日期计算自己年龄
- python二郎成长笔记(一)(pip升级,python入门,基础,python2和3不同格式带来的问题,头文件引用的格式,变量的类型,__name__ == '__main__')