Zookeeper
如果公司是租用的服务器或是使用的云主机(阿里云主机,华为云主机),那么/etc/hosts里面要配置的是内网IP地址和主机名的映射关系。
集群:主机名,ip,配置。安装的软件:zookeeper,jdk,hadoop。有时HDFS中可能由多个NameNode组成,一个是active状态,另一个处于挂起状态,如果一个NameNode出现问题,zookeeper会实现协调切换。
Zookeeper是Google的Chubby一个开源的实现,是Hadoop的分布式协调服务。负载均衡,数据同步等内容。确保有三台,允许1台机器宕掉。5台机器:允许2台机器。必须是是奇数台。至少要3台。Zookeeper集群,高可靠性。Zookeeper Service的功能就是将服务器进行协调,还有很多功能,数据同步等。
Zookeeper集群:一个Leader,其他的机器都是Follower。leader宕掉,从其他的Follower中选取一个。最基本功能:数据同步。Leader检测到数据发生变化,leader会进行数据同步。需要上锁。同步完成后才能给变量。
为什么使用Zookeeper?类似于(锁),进行协调,保证数据的并发
大分部分布式应用需要一个主控,协调器或控制器来管理物理分布的子进程(如资源,任务分配等)。
目前,大部分应用需要开发私有的协调程序,缺乏一个通用的机制。
协调程序的反复编写浪费,且难以形成通用,伸缩性好的协调器
ZooKeeper:提供通用的分布式锁服务,用以协调分布式应用。
在Hadoo2.0,使用Zookeeper的事件处理确保整个集群只有一个活跃的NameNode,存储配置信息等。
HBase,使用Zookeeper的事件处理确保整个集群只有一个HMaster,察觉HRegisonServer联机和宕机,存储访问控制列表等。
Zookeeper的特征
Zookeeper是简单的/富有表现力/高可用性/松耦合交互方式/资源库。
首先安装zookeeper,解压,里面的结构类似于jdk,hadoop。
zkServer.sh zkCli.sh 常用 zoo_sample.cfg:例子配置文件。
配置单节点的zk。修改配置文件 mv zoo_sanple,cfg zoo.cfg 将例子的cfg修改名为zoo.cfg即可 ./ZkServer.sh start 多了一个进程:jQuorumPeerMain。
同样启动一个客户端。ls /这个/代表zk系统的根。在不同的命令状态下代表不同的命令状态。
命令:create /itcast0106 8000$ 暂时理解为zookeeper里面存放的是文件夹。文件夹:itcast0106,里面的内容是8000
Zookeeper集群的搭建:
查看zookeeper里面的内容。conf/目录下的zoo.cfg,主要修改里面的内容。将安装好的拷贝到其他的节点即可。
1.将zoo_sample.cfg修改为zoo.cfg。
1.tickTime:CS通信心跳事件:Client Server。Client和Server端的心跳时间。tickTime=2000 这是个长链接。也就是每个ticktime会发送一个心跳
2.initLimit:LF初始通信时限。如果有一台启动了,另外的没启动,超过这个时限就认为启动失败。最多容忍心跳数:initLimit:5 ->10s。
3.syncLimit:LF同步通信时限。修改数据后进行时间同步,发送失败容忍的次数:syncLimit=2,修改数据
4.dataDir:数据文件目录 一般指定非tmp目录
5.clientPort:客户端链接端口。默认:2181
6.服务器名称与地址:集群信息,得知道哪个是老大(服务器编号(必须小写,不许重复),服务器编号=主机名:端口(LF通信端口):端口(选举端口)):必须是server,每一台server都有自己的一台id。直接在最后
server.N=YYY:A:B
server.1=192.168.8.1:2888:3888 //配置ip或者主机名都ok。
server.2=hadoop01:2888:3888
server.3=hadoop01:2888:3888
2.配置联系 server.1=itcast04:2888:3888(官方端口)
server.2=itcast05:2888:3888
server.3=itcast06:2888:3888
每个zookeeper都有自己的id,不许重复。 首先要配置一个数据存放的地址 创建一个data目录,保存各种数据,此时还需要一个myid的文件:vim myid:1 其中myid新建并且放置在
cp:拷贝 scp:走ssh的拷贝 /itcast/root@itcast05:/ 拷贝到05的根下。
不需要修改conf目录,只需要修改myid就可以了,在目录下修改2就OK了。
需要几个集群就拷贝几份就OK了。需要和配置文件保持一致。这时就可以运行zookeeper了。3台集群必须要等其他机器启动。mode:leader。两台就可以启动组成一个集群了。
数据同步:
./zkCli.sh:起一个zookeeper链接自己,get /zookeeper就可以得到一些数据。只要在04下增加数据,05上面也会自动进行同步,这就是最基本的功能。 quit:退出客户端
./zkServer.sh status:查看状态 kill-9 4750 把该进程干掉。此时leader就会自动进行切换。
Zookeeper->用来修改宕掉的NameNode。否则整个集群就不允许使用了。
Hadoop2.0:将NameNodes进行抽象->1个NameService有两个NameNode。有人进行协调->zookeeper。确保只有一个活跃的NameNode。另外一个是standby。如果一个宕掉,需要进行切换。
HDFS:解决高可靠(多个NameNode)
Hadoop2.0对NameNode进行一个抽象:NameService 一个NameService下面有两个NameNode。 通过Zookeeper进行协调选举。 确保只有一个活跃的NameNode。standby。一旦主宕掉,standby会切换成Active。内存是瓶颈,因为NameNode存放的元数据在内存中。可以水平扩展NameService,也可以水平扩展DataNode。链接哪个NameNode都可以无限扩展。
HA:高可靠性。ZKFC:发送指令,监控NameNode的状态,每个NameNode都有一个ZKFC,用来监控NameNode,如果失去联系了会发送信息给zookeeper。ZookeeperFailoverController。没问题前:两个NameNode,一个是Active,一个是standby。会把edits文件实时写入到一个介质中,standby会实时同步过去。这时两个内容就一模一样了。 同样挂掉之后也能从里面读取内容。一个写,一个读。ZK是同步的,如果知道一个宕掉了,ZK会知道的,然后发送任务给另外一个standby的NameNode,让它进行切换。
存储edits的介质:两种解决方式:NFS网络文件传输。网络文件系统。 或者JournalNode来存放共享数据。
规划: 101 NameNode/DFSZKfailoverController HDFS
102 NameNode/DFSZKFailoverController HDFS
103 ResourceManager Yarn (M/R)
104 DataNode(小弟)/NodeManager(小弟,最好在一起)/jOURNALNode(用来存放共享的edits,NameNode将数据存放在JournalNode中)/ HDFS小弟 MR小弟 临时文件
105 DataNode/NodeManager/jOURNALNode(用来存放共享的edits)/QuorumPeerMain
106 DataNode/NodeManager/jOURNALNode/QuorumPeerMain zookeeper
2.安装配置hadoop集群
现在需要修改6个配置文件。 现在多一个slaves。决定了小弟在哪台机器上。
第一个配置内容:vim hadoop-env.sh 第一个修改tomcat。
第二个配置文件:core-site.xml 要多添加一个属性
1.配置ns hdfs://ns1随便起(知名NS) NameService 2.指定hadoop临时目录 3.指定zookeeper地址。
第三个配置文件:hdfs-site.xml
NS下面有两个NameNode,中间的映射关系就需要到hdfs中去配置
配置nn1的RPC通信地址
和zk相关联
出现故障但是没有进行党掉,该FailController汇报信息, 切换另外一台NameNode。目前两个Active,此时就第一台机器发送一个SSH指令,让该进程kill掉。 隔离机制 出现问题但是没有宕掉/如果都宕掉,没汇报给zk,如果ZK很长时间没有收到FC了,另外一个FC会进行超时检测,就会切换调用脚本就发送SHELL
sshfence
shell(/bin/true) 调用shell脚本
私钥存放的地址
指定宕机后切换时间
接近10个属性。1.链接的ns有哪些。2.指定ns1下面的namenode的内容:nn1,nn2
3.配置nn1的通信地址 4.nn1的http通信地址 5.nn2的RPC通信地址 6.nn2的http通信地址
7.指定NameNode的元数据在JournalNode上存放位置:因为040506上面有journal node。该进程依赖Zookeeper。 8.开启NameNode失败自动切换 9.配置失败自动切换实现方式
10.配置失败自动切换实现方式 11.配置隔离机制方法,多个机制:如果有两个Active的NameNode。需要发送ssh命令,把出问题的进程kill掉。隔离机制。sshfence 出现问题但是没有宕掉。另外一种方式:调用脚本完成切换:宕机断电。超时检测。 可以在里面进行输入shell脚本。 12.指定私钥的存放位置 13. ssh fence隔离机制超时时间
第四个配置文件mapred-site.xml(和以前一样)
指定mr框架为yarn方式即可。
第五个配置文件:yarn-site.xml(和以前一样,指定yarn的老大,指定reducer获取文件的方式:shuffle)
指定resourcemanager地址。
第六个:slaves
修改子节点,默认是本机,修改为4.5.6 itcast04 itcast05 itcast06 就是DataNode
先启动zookeeper集群,把配置好的hadoop拷贝到其他的机器上去,删除share文件下的doc文件
scp -r /itcast/ root@itcast02:/ 分贝拷贝到不同的机器上去就OK了
十分重要的步骤:对hadoop进行初始化。之前是格式化NameNode。 一定要先启动Zookeeper。删除share目录。里面很多配置文件,再利用scp的方式进行拷贝到其他的机器中去。搭建hadoop环境变量,拷贝配置文件。
严格按照下面的步骤:
1.启动zookeeper集群 2.启动journalnode进行jps命令检验。可以利用sbin下面的hadoop-daemon.sh start journalnode :启动一个journalnode进行。 04/05/06都要进行启动。->hadoop-daemons.sh:会读取本机里面的其他配置文件并自动启动journalnode. 多了一个进程。接着格式化 hdfs namenode -format 在1号机器上。格式化之后会多出来一个tmp目录。利用拷贝的方式scp -r 拷贝给itcast02上。 格式化zk:只要在01上执行:hdfs zkfc -formatZK。此时hadoop的客户端上面会多一个目录,多了hadoop-ha的目录。 启动HDFS:在itcast01上启动。 4,5,6上会自动启动DataNode。03上启动ResourceManager。
数据迁移工具:sqoop
Sqoop是个数据迁移的工作。可以将Hive与msql等内容进行迁移。将历史数据导入到HDFS中去。底层:Map/Reduce。部署一个就可以了。需要依赖HDFS和Yarn。如果该机器上指定了NameNode和RS的位置,那么就可以直接启动了,而不需要配置了。会自动寻找NameNode和Resoure Manager。 sqoop:常用命令。还没安装HAT_HOME
sqoop 命令 参数 sqoop
将数据库里面的内容导入到HDFS中去。./sqoop import --connect jdbc:mysql://192.168.1.100:3306/itcast --username root --password 123 --table trade_detail 驱动包 一共有4个结果文件,起了几个mapper就有几个结果文件。
进阶:./sqoop import --connect jdbs:mysql://192.168.1.100:3306/itcast --username root --password 123 --table trade_detail --target-dir /sqoop/td1 -m 2 --fields-terminated-by '\t' --columns "id,account,income"
--target-dir /sqoop/td1:指定存放的HDFS目录 -m2起两个map
--fields-terminated-by '\t' 利用\t来进行分割 --columns"id,account,income"指定要导的列有哪些。
选择导出目录以及起的多少个个mapper,这里是2个reducer。指定了目录,利用\t的方式进行分割,同时--columns指定了要导入的哪些列。
同时可以指定where条件:
./sqoop import --connect jdbs:mysql://192.168.1.100:3306/itcast --username root --password 123 --table trade_detail --target-dir /sqoop/td1 -m 2 --fields-terminated-by '\t' --where 'id>2 and id <=9'
导入多个表:指定sql语句:里面必须在where子句里面包含一个变量and $CONDITIONS
./sqoop import --connect jdbs:mysql://192.168.1.100:3306/itcast --username root --password 123 --query 'select * from trade_detail where id >5 and $CONDITIONS' -m 1 --target-dir /sqoop/td4 这里只能起一个map,否则要进行修改。因为不知道哪个mappder读取哪些数据
./sqoop import --connect jdbs:mysql://192.168.1.100:3306/itcast --username root --password 123 --query 'select * from trade_detail where id >5 and $CONDITIONS' -m 2 --target-dir /sqoop/td5 --split-by trade_detail.id 可以根据id来分割数据,这样就可以起两个mapper了。$CONDITIONS是一个变量,作用是告诉该语句有多少条数据,然后每个mapper应该读取哪些数据,1-5给第一个,6-10个第二个。动态语句传递。
导出数据:
./sqoop export --connect jdbc:mysql://192.168.1.100:3306/itcast --export-dir '/sqoop/td3' --table td_0106 -m 1 --fields-terminated-by '\t' 这里有个默认的分隔符,这里指定一下\t
安装和配置,添加sqoop到环境变量,将数据库驱动导入到lib目录下。where条件必须要引号引起来。如果没有其他条件则是where CONDITIONS。如果有的话则需要添加,并且要有一个AND。
shell是个编程语言
Shell入门:
vim test.sh-> #! bin/sh:使用哪种shell
echo "123"
sh test.sh 或者 chmod u+x test.sh
定义一个变量:STR="HELLO TOM"
echo "$STR"
如何进行调试:vim test.sh 需要在test.sh的最上面加一句:set -x :会把变量的数值都打印出来。
调wordcout: hadoop jar 路径(example.jar) wordcount /wc.txt /wcout2
运行的时候不打印日志:成为一个后台进程执行。A:跳转末尾
hadoop jar 路径(example.jar) wordcount /wc.txt /wcout2>>root/logs 2>&1 & 成为一个后台进程
#调试#set-x 打印echo "123" 定义变量STR="HELLO" echo"$STR"
获取当前时间:date CURRENT=`date+%Y%m%d` //把返回值赋给前面的变量,需要加一个`号
echo $CURRENT
date +%Y-%m-%d 2018-07-09
定时器:crontab -e 编辑当前用户的定时器。* * * * * bin/echo 123123 >> /root/time
在这里面写echo的全路径 这里的5个星:分钟,小时,日,月,星期
定时器中:
效果:每隔1分钟执行一次: