hadoop入门5

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。

hadoop入门5_第1张图片

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都可以无限扩展。

hadoop入门5_第2张图片

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地址。

hadoop入门5_第3张图片

 

第三个配置文件:hdfs-site.xml

NS下面有两个NameNode,中间的映射关系就需要到hdfs中去配置

hadoop入门5_第4张图片


                ns可以有多个,目前只有1个,ns1
dfs.nameservices
ns1        


                指定ns下面有几个NameNode
dfs.ha.namenodes.ns1
nn1,nn2

        配置nn1的RPC通信地址

dfs.namenode.rpc-address.ns1.nn1
itcast01:9000



dfs.namenode.http-address.ns1.nn1
itcast01:50070



dfs.namenode.rpc-address.ns1.nn2
itcast02:9000



dfs.namenode.http-address.ns1.nn2
itcast02:50070

    和zk相关联

dfs.namenode.shared.edits.dir
qjournal://itcast01:8485;itcast02:8485;itcast02:8485/ns1



dfs.journalnode.edits.dir
/itcast/hadoop-2.4.1/journal



dfs.ha.automatic-failover.enabled
true



dfs.client.failover.proxy.provider.ns1
org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider

    出现故障但是没有进行党掉,该FailController汇报信息, 切换另外一台NameNode。目前两个Active,此时就第一台机器发送一个SSH指令,让该进程kill掉。  隔离机制   出现问题但是没有宕掉/如果都宕掉,没汇报给zk,如果ZK很长时间没有收到FC了,另外一个FC会进行超时检测,就会切换调用脚本就发送SHELL

dfs.ha.fencing.methods

sshfence
shell(/bin/true)                调用shell脚本


        私钥存放的地址

dfs.ha.fencing.ssh.private-key-files
/home/hadoop/.ssh/id_rsa

           指定宕机后切换时间             

dfs.ha.fencing.ssh.connect-timeout
30000

接近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方式即可。

hadoop入门5_第5张图片

 

第五个配置文件:yarn-site.xml(和以前一样,指定yarn的老大,指定reducer获取文件的方式:shuffle)

指定resourcemanager地址。

hadoop入门5_第6张图片

第六个: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  

hadoop入门5_第7张图片

运行的时候不打印日志:成为一个后台进程执行。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

hadoop入门5_第8张图片

hadoop入门5_第9张图片

定时器:crontab -e 编辑当前用户的定时器。* * * * *    bin/echo 123123 >> /root/time

在这里面写echo的全路径  这里的5个星:分钟,小时,日,月,星期

定时器中:

效果:每隔1分钟执行一次:

hadoop入门5_第10张图片

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(hadoop)