06hadoop1

一.zookeeper

1.zookeeper watcher(监听机制)
watch机制是zookeeper自动监控某一个znode节点的生死和状态变化(节点创建,节点删除,节点改变,子节点改变);如果监控的事件发生了会触发执行行为;
提供了分布式数据发布和订阅功能,一对多的订阅关系
watch机制有三个过程:客户端向服务器注册watcher;服务端事件发生触发watcher;客户端回调watcher得到触发事件情况
2.watcher机制的特点:
a:一次性触发(命令行)
在这里插入图片描述
事件发生触发监听,一个watcher event就会被发送到设置监听的客户端,这种效果是一次性的,后续再次发生同样的事件,不会再次触发。
b.事件封装
ZooKeeper使用WatchedEvent对象来封装服务端事件并传递。
WatchedEvent包含了每一个事件的三个基本属性:
通知状态(keeperState),事件类型(EventType)和节点路径(path)
c:event异步发送
watcher的通知事件从服务端发送到客户端是异步的。
d:先注册再触发
Zookeeper中的watch机制,必须客户端先去服务端注册监听,这样事件发送才会触发监听,通知给客户端。
4.zookeeper JavaAPI操作
a:原生的
b:curator框架:curator-framework:对底层zookeeper的api的封装
curator-reclipes:封装了一些高级特性:擦车事件监听选举分布式锁,分布式计数器
引入maven依赖
在这里插入图片描述
在这里插入图片描述


```java
<dependencies>
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>2.12.0</version>
        </dependency>

        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>2.12.0</version>
        </dependency>

        <dependency>
            <groupId>com.google.collections</groupId>
            <artifactId>google-collections</artifactId>
            <version>1.0</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>1.7.25</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <!-- java编译插件 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.2</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
        </plugins>
   </build>

节点操作代码:
在这里插入图片描述
在这里插入图片描述


```java
```java
package com.hlzq.zookeeper;
import org.apache.curator.RetryPolicy;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.apache.zookeeper.CreateMode;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.nio.charset.StandardCharsets;
import java.util.List;

public class Demo1Zooke {

    private CuratorFramework client=null;

    @Before //单元测试前先执行before里的代码
    public  void init(){
        //1.定制重试
        ExponentialBackoffRetry retry = new ExponentialBackoffRetry(1000, 3);
        //2.获取客户
        String cli="node1:2181,node2:2181,node3:2181";
         client = CuratorFrameworkFactory.newClient(cli, retry);
        //3.启动客户端
        client.start();
    }
    @After
    public  void clos(){
        //5.关闭连接
        client.close();
    }
    //1.创建znode节点
    @Test
    public void test1CreatZnode() throws Exception {
        //1.定制重试策略
        RetryPolicy backoffRetry = new ExponentialBackoffRetry(1000, 3);//多态
        //2.获取客户端对象
        String server_list="node1:2181,node2:2181,node3:2181";//192.168.88.161:2181,192.168.88.162:2181,192.168.88.163:2181可以用
        CuratorFramework client = CuratorFrameworkFactory.newClient(server_list, backoffRetry);
        //3.启动客户端
        client.start();
        //4.创建节点
//       4.1 client.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT)//创建永久节点
//              .forPath("/aaa/bbb/cccc","null".getBytes());//withmode什么类型节点,forpath路径
//       4.2 client.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT_SEQUENTIAL)//创建永久序列化节点
//                .forPath("/app1/bbb/cccc");//withmode什么类型节点,forpath路径
//       4.3 client.create().creatingParentsIfNeeded().withMode(CreateMode.EPHEMERAL)//创建临时节点;client.close()关闭后临时节点消失
//                .forPath("/appale");//withmode什么类型节点,forpath路径
        client.create().creatingParentsIfNeeded().withMode(CreateMode.EPHEMERAL_SEQUENTIAL)//创建临时序列化节点;client.close()关闭后临时节点消失
                .forPath("/appale");//withmode什么类型节点,forpath路径
        //CreateMode.PERSISTENT
        //GetACLBuilder acl = client.getACL();
        //System.out.println(acl);
        //5.关闭连接
        //client.close();
    }
    @Test
    //删除节点
    public void test2Delter() throws Exception {
        //4.删除节点
        client.delete().deletingChildrenIfNeeded().forPath("/app1");//递归删除deletingChildrenIfNeeded()
    }
    @Test
    //修改值
    public  void test3change() throws Exception {
        client.setData().forPath("/as","{pory:3602}".getBytes());
    }
    @Test
    //获取值
    public void test4getZnode() throws Exception {
        byte[] bytes = client.getData().forPath("/as");
        System.out.println(new String(bytes));
        List<String> strings = client.getChildren().forPath("/as");
        System.out.println(strings);
    }
}

当你get获取没有数据的节点时,会得到一个IP地址
watch机制Java代码实现:
在这里插入图片描述
5.zookeeper选举机制:
5.1zookeeper集群的角色:follower leader observer(观察者)
5.2 zookeeper监听机制:通过向某一节点注册提供监听能力,当节点发生某些改变(添加,删除,修改)触发watcher,得到触发事件。
5.3zookeeper的选举机制:
第一种:第一次启动,第二种lead挂了

zookeeper默认的算法:fastleaderelection,采用投票数大于半数则胜出
服务器id:myid服务器编号越大权重越大。
选举状态:looking竞选状态;follower 随从同步leader;observer观察者不参与投票 ;leading领导者;
数据id:version越大数据越新权重越大;
逻辑时钟:投票次数
第一次和myid还有启动顺序有关;
在这里插入图片描述
非全新选举(leader宕机):剩余主机不过半,否则挂掉不能正常工作;
数据的新旧:mzxid相同

在这里插入图片描述
mzxid不相等时:
在这里插入图片描述
二.大数据导论和Hadoop

2.1大数据:海量数据的存储和计算
2.2特点:大 ,种类多, 价值密度低,快,信(数据质量)
2.3大数据的分析步骤:需求分析 --》数据收集–》数据处理–》数据分析–》数据展现–》报告撰写
2.4Hadoop介绍:Java开源框架包含hdfs(分布式文件系统)mapreduce(分布式运算)yarn(作业调度和集群资源管理)
在这里插入图片描述
扩展能力强,成本低 ,高效,可靠
在这里插入图片描述
1.0只有MapReduce和hdfs;2.0

2.5Hadoop架构
在这里插入图片描述
高可用集群
在这里插入图片描述
最完美
在这里插入图片描述
2.5Hadoop安装搭建
1.在这里插入图片描述
2.环境准备:
重新编译hadoop
上传,安装,更改配置文件:在这里插入图片描述
在这里插入图片描述
vim core-site.xml
在该文件中的标签中添加以下配置,

在这里添加配置

cd /export/server/hadoop-2.7.5/etc/hadoop
vim core-site.xml
配置内容如下:

<!-- 用于设置Hadoop的文件系统,由URI指定 -->
	 <property>
		    <name>fs.defaultFS</name>
		    <value>hdfs://node1:8020</value>
	 </property>
<!-- 配置Hadoop存储数据目录,默认/tmp/hadoop-${user.name} -->
	 <property>
		   <name>hadoop.tmp.dir</name>
		   <value>/export/server/hadoop-2.7.5/hadoopDatas/tempDatas</value>
	</property>

	<!--  缓冲区大小,实际工作中根据服务器性能动态调整 -->
	 <property>
		   <name>io.file.buffer.size</name>
		   <value>4096</value>
	 </property>

	<!--  开启hdfs的垃圾桶机制,删除掉的数据可以从垃圾桶中回收,单位分钟 -->
	 <property>
		   <name>fs.trash.interval</name>
		   <value>10080</value>
	 </property>

配置 hdfs-site.xml

配置一下内容

<!-- 指定SecondaryNameNode的主机和端口 -->
<property>
		<name>dfs.namenode.secondary.http-address</name>
		<value>node2:50090</value>
</property>
<!-- 指定namenode的页面访问地址和端口 -->
<property>
	<name>dfs.namenode.http-address</name>
	<value>node1:50070</value>
</property>
<!-- 指定namenode元数据的存放位置 -->
<property>
	<name>dfs.namenode.name.dir</name>
	<value>file:///export/server/hadoop-2.7.5/hadoopDatas/namenodeDatas</value>
</property>
<!--  定义datanode数据存储的节点位置 -->
<property>
	<name>dfs.datanode.data.dir</name>
	<value>file:///export/server/hadoop-2.7.5/hadoopDatas/datanodeDatas</value>
</property>	
<!-- 定义namenode的edits文件存放路径 -->
<property>
	<name>dfs.namenode.edits.dir</name>
	<value>file:///export/server/hadoop-2.7.5/hadoopDatas/nn/edits</value>
</property>

<!-- 配置检查点目录 -->
<property>
	<name>dfs.namenode.checkpoint.dir</name>
	<value>file:///export/server/hadoop-2.7.5/hadoopDatas/snn/name</value>
</property>

<property>
	<name>dfs.namenode.checkpoint.edits.dir</name>
	<value>file:///export/server/hadoop-2.7.5/hadoopDatas/dfs/snn/edits</value>
</property>
<!-- 文件切片的副本个数-->
<property>
	<name>dfs.replication</name>
	<value>3</value>
</property>

<!-- 设置HDFS的文件权限-->
<property>
	<name>dfs.permissions</name>
	<value>false</value>
</property>
<!-- 设置一个文件切片的大小:128M-->
<property>
	<name>dfs.blocksize</name>
	<value>134217728</value>
</property>

配置 mapred-site.xml

<configuration>
  在这里添加配置
</configuration>
vim  mapred-site.xml
配置一下内容:
	<!-- 指定分布式计算使用的框架是yarn -->
	<property>
			<name>mapreduce.framework.name</name>
			<value>yarn</value>
	</property>

	<!-- 开启MapReduce小任务模式 -->
	<property>
		<name>mapreduce.job.ubertask.enable</name>
		<value>true</value>
	</property>
	
	<!-- 设置历史任务的主机和端口 -->
	<property>
		<name>mapreduce.jobhistory.address</name>
		<value>node1:10020</value>
	</property>

	<!-- 设置网页访问历史任务的主机和端口 -->
	<property>
		<name>mapreduce.jobhistory.webapp.address</name>
		<value>node1:19888</value>
	</property>

配置mapred-env.sh

vim  mapred-env.sh

export JAVA_HOME=/export/server/jdk1.8.0_241

配置 yarn-site.xml

vim yarn-site.xml
添加以下配置:

<!-- 配置yarn主节点的位置 -->
	<property>
		<name>yarn.resourcemanager.hostname</name>
		<value>node1</value>
	</property>

	<property>
		<name>yarn.nodemanager.aux-services</name>
		<value>mapreduce_shuffle</value>
	</property>
	
	<!-- 开启日志聚合功能 -->
	<property>
		<name>yarn.log-aggregation-enable</name>
		<value>true</value>
	</property>
	<!-- 设置聚合日志在hdfs上的保存时间 -->
	<property>
		<name>yarn.log-aggregation.retain-seconds</name>
		<value>604800</value>
	</property>
	<!-- 设置yarn集群的内存分配方案 -->
	<property>    
		<name>yarn.nodemanager.resource.memory-mb</name>    
		<value>2048</value>
	</property>
	<property>  
        	 <name>yarn.scheduler.minimum-allocation-mb</name>
         	<value>2048</value>
	</property>
	<property>
		<name>yarn.nodemanager.vmem-pmem-ratio</name>
		<value>2.1</value>
	</property>

配置 slaves

vim slaves
删除slaves中的localhost,然后添加以下内容:

node1
node2
node3

5.目录创建
创建Hadoop所需目录

mkdir -p /export/server/hadoop-2.7.5/hadoopDatas/tempDatas
mkdir -p /export/server/hadoop-2.7.5/hadoopDatas/namenodeDatas
mkdir -p /export/server/hadoop-2.7.5/hadoopDatas/datanodeDatas
mkdir -p /export/server/hadoop-2.7.5/hadoopDatas/nn/edits
mkdir -p /export/server/hadoop-2.7.5/hadoopDatas/snn/name
mkdir -p /export/server/hadoop-2.7.5/hadoopDatas/dfs/snn/edits

6.文件分发
将配置好的Hadoop目录分发到node2和node3主机。

scp -r /export/server/hadoop-2.7.5/ node2:/export/server/
 scp -r /export/server/hadoop-2.7.5/ node3:/export/server/
  1. 配置Hadoop的环境变量

注意,三台机器都需要执行以下命令

vim /etc/profile

添加以下内容:

export HADOOP_HOME=/export/server/hadoop-2.7.5
export PATH=:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH

配置完成之后生效
source /etc/profile

  1. 启动集群

8.1 启动方式
要启动Hadoop集群,需要启动HDFS和YARN两个集群。
注意:首次启动HDFS时,必须对其进行格式化操作。本质上是一些清理和准备工作,因为此时的HDFS在物理上还是不存在的。
在node1上执行格式化指令
hadoop namenode -format
方式1-单节点逐个启动
在node1主机上使用以下命令启动HDFS NameNode:
hadoop-daemon.sh start namenode

在node1、node2、node3三台主机上,分别使用以下命令启动HDFS DataNode:
hadoop-daemon.sh start datanode
在node1主机上使用以下命令启动YARN ResourceManager:
yarn-daemon.sh start resourcemanager
在node1、node2、node3三台主机上使用以下命令启动YARN nodemanager:
yarn-daemon.sh start nodemanager

以上脚本位于/export/server/hadoop-2.7.5/sbin目录下。如果想要停止某个节点上某个角色,只需要把命令中的start改为stop即可。
8.2 方式2-脚本一键启动
启动HDFS
start-dfs.sh

启动Yarn
start-yarn.sh

启动历史任务服务进程
mr-jobhistory-daemon.sh start historyserver

8.3 方式3-全部一键启动
启动HDFS和Yarn
start-all.sh
9.停止集群:stop-dfs.sh、stop-yarn.sh、mr-jobhistory-daemon.sh stophistoryserver
10. 集群的页面访问
10.1IP访问
一旦Hadoop集群启动并运行,可以通过web-ui进行集群查看,如下所述:
查看NameNode页面地址:
http://192.168.88.161:50070/
在这里插入图片描述

查看Yarn集群页面地址:
http://192.168.88.161:8088/cluster
在这里插入图片描述

查看MapReduce历史任务页面地址:
http://192.168.88.161:19888/jobhistory
在这里插入图片描述

10.2主机名访问
请注意,以上的访问地址只能使用IP地址,如果想要使用主机名,则对Windows进行配置。
配置方式:
1、打开Windows的C:\Windows\System32\drivers\etc目录下hosts文件
2、在hosts文件中添加以下域名映射
192.168.88.161 node1 node1.itcast.cn
192.168.88.162 node2 node2.itcast.cn
192.168.88.163 node3 node3.itcast.cn

配置完之后,可以将以上地址中的IP替换为主机名即可访问,如果还不能访问,则需要重启Windows电脑,比如访问NameNode,可以使用http://node1:50070/ 。
11.hadoop上传文件
命令 hadoop fs -put 文件名 /

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值