Hadoop 2.0:主流开源云架构(四)

news2024/11/24 14:05:09

目录

    • 五、Hadoop 2.0访问接口
      • (一)访问接口综述
      • (二)浏览器接口
      • (三)命令行接口
    • 六、Hadoop 2.0编程接口
      • (一)HDFS编程
      • (二)Yarn编程


五、Hadoop 2.0访问接口

(一)访问接口综述

  Hadoop 2.0分为相互独立的几个模块,访问各个模块的方式也是相互独立的,但每个模块访问方式可分为:浏览器接口、Shell接口和编程接口。

(二)浏览器接口

Web地址配置文件配置参数
HDFShttp://NameNodeHostName:50070hdfs-site.xml{dfs.namenode.http-address}
Yarnhttp://ResourceManagerHostName:8088yarn-site.xml{yarn.resourcemanager.webapp.address}
MapReducehttp://JobHistoryHostName:19888mapred-site.xml{mapreduce.jobhistory.webapp.address}

  在Hadoop 2.0里,MapReduce是Yarn不可缺少的模块,这里的JobHistory是一个任务独立模块,用来查看历史任务,和MapReduce并行处理算法无关。

(三)命令行接口

1. HDFS

  以tar包方式部署时,其执行方式是HADOOP_HOME/bin/hdfs,当以完全模式部署时,使用HDFS用户执行hdfs即可。

在这里插入图片描述
2. Yarn

  以tar包方式部署时,其执行方式是HADOOP_HOME/bin/yarn,当以完全模式部署时,使用Yarn用户执行yarn即可。

在这里插入图片描述
  每一条命令都包含若干条子命令,Yarn的Shell命令也主要分为用户命令和管理员命令。

3. Hadoop

  以tar包方式部署时,其执行方式是HADOOP_HOME/bin/Hadoop,当以完全模式部署时,在终端直接执行hadoop。

在这里插入图片描述
  这个脚本既包含HDFS里最常用命令fs(即HDFS里的dfs),又包含Yarn里最常用命令jar,可以说是HDFS和Yarn的结合体。此外,distcp用mapreduce来实现两个Hadoop集群之间大规模数据复制。

4. 其他常用命令

  sbin/目录下的脚本主要分为两种类型:启停服务脚本和管理服务脚本。其中,脚本hadoop-daemon.sh可单独用于启动本机服务,方便本机调试,start/stop类脚本适用于管理整个集群,读者只要在命令行下直接使用这些脚本,它会自动提示使用方法。

在这里插入图片描述

六、Hadoop 2.0编程接口

(一)HDFS编程

在这里插入图片描述
1. HDFS编程实例

【例1】 请编写一简单程序,要求实现在HDFS里新建文件myfile,并且写入内容“china cstor cstor cstor china”。

代码如下:

public class Write {
    public static void main(String[] args) throws IOException {
        Configuration conf = new Configuration();       //实例化配置文件
        Path inFile = new Path("/user/joe/myfile");      //命名一个文件
        FileSystem hdfs = FileSystem.get(conf);         //获取文件系统
        FSDataOutputStream OutputStream = hdfs.create(inFile);   //获取文件流
        outputStream.writeUTF("china cstor cstor cstor china");   //使用流向文件里写内容
        outputStream.flush();
        outputStream.close();
    }
}

假定程序打包后称为hdfsOperate.jar,并假定以joe用户执行程序,主类为Write,主类前为包名,则命令执行如下:

[joe@cMaster~]$ hadoop jar hdfsOperate.jar cn.cstor.data.hadoop.hdfs.write.Write

成功执行上述命令后,可使用如下两种方式确认文件已经写入HDFS。
第一种方式:使用Shell接口,以joe用户执行如下命令:

[joe@cMaster~]$ hdfs dfs -cat ls            #类似于Linux的ls,列举HDFS文件
[joe@cMaster~]$ hdfs dfs -cat myfile        #类似于Linux的cat,查看文件

第二种方式:使用Web接口,浏览器地址栏打开http://namenodeHostName:50070,点击Browse the filesystem,进入文件系统,接着查看文件/user/jioe/myfile即可。

【例2】 请编写一简单程序,要求输出HDFS里刚写入的文件myfile的内容。

代码如下:

public class Read {
    public static void main(String[] args) throws IOException {
        Configuration conf = new Configuration();
        Path inFile = new Path("/user/joe/myfile");      //HDFS里欲读取文件的绝对路径
        FileSystem hdfs = FileSystem.get(conf);
        FSDataIutputStream inputStream = hdfs.open(inFile);   //获取输出流
        System.out.println("myfile:"+inputStream.readUTF());   //使用输出流读取文件
        inputStream.close();
    }
}

下面是命令执行方式及其结果:

[joe@cMaster~]# hadoop jar hdfsOperate.jar cn.cstor.data.hadoop.hdfs.read.Read
myfile: china cstor cstor china

【例3】 请编写一简单代码,要求输出HDFS里文件myfile相关属性(如文件大小、拥有者、集群副本数,最近修改时间等)。

代码如下:

public class Status {
    public static void main(String[] args)throws Exception {
        Configuration conf = new Configuration();
        Path file = new Path("/user/joe/myfile");
        System.out.println("FileName:"+file.getName());
        FileSystem hdfs = file.getFileSystem(conf);
        FileStatus[] fileStatus = hdfs.listStatus(file);
        for (FileStatus status: fileStatus) {
            System.out.println("FileOwner:"+status.getOwner());
            System.out.println("FileReplication:"+status.getReplication();
            System.out.println("FileModificationTime:"+new Date(status.getModificationTime());
            System.out.println("FileBlockSize:"+status.getBlockSize());
        }
    }
}

程序执行方式及其结果如下:

[joe@cMaster~] Hadoop jar hdfsOperate.jar cn.cstor.data.Hadoop.hdfs.file.Status
FileName: myfile
FileOwner: joe
FileReplication: 3
FileModification Time: Tue Nov 12 05:24:02 PST 2013 

上面我们通过三个例题介绍了HDFS文件最常用操作,但这仅仅是三个小演示程序,在真正处理HDFS文件流时,可以使用缓冲流将底层文件流一层层包装,可大大提高读取效率。

2. HDFS编程基础

(1)Hadoop统一配置文件类Configuration

  Hadoop的每一个实体(Common,HDFS,Yarn)都有与其相对应的配置文件,Configuration类是联系几个配置文件的统一接口。

  Hadoop各模块间传递的一切值都必须通过Configuration类实现,其他方式均无法获取程序设置的参数,若想实现参数最好使用Configuration类的get和set方法。

(2)取得HDFS文件系统接口

  在Hadoop源代码中,HDFS相关代码大都存放在org.apache.Hadoop.hdfs包里。但是,我们编写代码操作HDFS里的文件时,不可以调用这些代码,而是通过org.apache.hadoop.fs包里的FileSystem类实现。

在这里插入图片描述
  FileSystem类是Hadoop访问文件系统的抽象类,它不仅可以获取HDFS文件系统服务,也可以获取其他文件系统(比如本地文件系统)服务,为程序员访问各类文件系统提供统一接口。

(3)HDFS常用流和文件状态类

  Common还提供了一些处理HDFS文件的常用流:fs包下的FSDataInputStream,io包下的缓冲流DataInputBuffer,util包下的LineReader等等。用户可以和Java流相互配合使用。

(二)Yarn编程

  Yarn是一个资源管理框架,由ResourceManager(RM)和NodeManager(NM)。但RM和NM不参与计算逻辑。称由ApplicationMaster和Client组成的处理逻辑相同的一类任务为逻辑实体,可以定义Map型、MapReduce型、MapReduceMap型和CPU密集型任务。

1. 概念和流程

  在资源管理框架中,RM负责资源分配,NodeManager负责管理本地资源。在计算框架中,Client负责提交任务,RM启动任务对应的ApplicationMaster。

(1)编程时使用的协议

① ApplicationClientProtocol:Client<–>ResourceManager。

Client通知RM启动任务(如要求RM启动ApplicationMaster),获取任务状态或终止任务时使用的协议。

② ApplicationMasterProtocol:ApplicationMaster<–>ResourceManager。

ApplicationMaster向RM注册/注销申请资源时用到的协议。

③ ContainerManager:ApplicationMaster<–>NodeManager。

ApplicationMaster启动/停止获取NM上的Container状态信息时所用的协议。

(2)一个Yarn任务的执行流程简析

  Client提交任务时,通过调用ApplicationClientProtocol#getNewApplication从RM获取一个ApplicationId,然后再通过ApplicationClientProtocol#submitApplication提交任务。

  ApplicationMaster则负责此次任务的处理全过程,RM会选定一个Container来启动ApplicationMaster,ApplicationMaster会通过心跳包与RM保持通信,ApplicationMaster须向RM注销自己。

(3)编程步骤小结

① Client端

步骤1:获取ApplicationId
步骤2:提交任务

② ApplicationMaster端

步骤1:注册
步骤2:申请资源
步骤3:启动Container
步骤4:重复步骤2、3,直至任务完成
步骤5:注销

Yarn提供了三个Application-Master实现:DistributedShell、unmanaged-am-launcher、MapReduce。

2. 实例分析

  DistributedShell是Yarn自带的一个应用程序编程实例,相当于Yarn编程中的“Hello World”,它的功能是并行执行用户提交的Shell命令或Shell脚本。
  从Hadoop官方网站下载Hadoop-2.2.0-src.tar.gz(Hadoop源码包)并解压后,依次进入Hadoop-yarn-project\Hadoop-yarn\Hadoop-yarn-applications,下面就是Yarn自带的两个Yarn编程实例。
  Client主要向RM提交任务,ApplicationMaster向RM申请资源,并与NM协商启动Container完成任务。

(1)Client类主要代码:

YarnClient yarnClient = YarnClient.createYarnClient();    //新建Yarn客户端
yarnClient.start();
启动Yarm客户端
YarnClientApplication app = yarnClient.createApplication();    //获取提交程序句柄
ApplicationSubmissionContext appContext = app.getApplicationSubmissionContext();   //获取上下文句柄
ApplicationId appId = appContext.getApplicationId();    //获取RM分配的appId 
appContext.setResource(capability);     //设置任务其他信息举例
appContext.setQueue(amQueue);
appContext.setPriority(priority);

//实例化ApplicationMaster对应的Container
ContainerLaunchContext amContainer = Records.newRecord(ContainerLaunchContext.class);
amContainer.setCommands(commands);       //参数commands为用户预执行的Shell命令
appContext.setAMContainerSpec(amContainer);    //指定ApplicationMaster的Container 
yarnClient.submitApplication(appContext);      //提交作业

  从代码中能看到,关于RPC的代码已经被上一层代码封装了,Client端编程简单地说就是获取YarmClientApplication,接着设置ApplicationSubmissionContext,最后提交任务。

(2)ApplicationMaster类最主要代码:

//新建RM代理
AMRMClientAsync amRMClient = AMRMClientAsync.createAMRMClientAsync(1000, allocListener);
amRMClient.init(conf);
amRMClient.start();
//向RM注册
amRMClient.registerApplicationMaster(appMasterHostname, appMasterRpcPort, appMasterTrackingUrl);
containerListener = createNMCallbackHandler();
//新建NM代理
NMClientAsync nmClientAsync = new NMClientAsyncImpl(containerListener);
nmClientAsync.init(conf);
nmClientAsync.start();
//向RM申请资源
for(int i=0; i<numTotalContainers; ++i) {
    ContainerRequest containerAsk = setupContainerAskForRM();
    amRMClient.addContainerRequest(containerAsk);
}
numRequestedContainers.set(numTotalContainers);
//设置Container上下文
ContainerLaunchContext ctx = Records.newRecord(ContainerLaunchContext.class);
ctx.setCommands(commands);
//要求NM启动Container 
nmClientAsync.startContainerAsync(container, ctx);
//containerListener汇报此NM完成任务后,关闭此NM
nmClientAsync.stop();
//向RM注销
amRMClient.unregisterApplicationMaster(appStatus, appMessage, null);
amRMClient.stop();

  源码中的ApplicationMaster有1000行,上述代码给出了源码里最重要的几个步骤。

3. 代码执行方式

默认情况下Yarn包里已经有分布式Shell的代码了,可以使用任何用户执行如下命令:

$Hadoop jar /usr/lib/Hadoop-yarn/Hadoop-yarn-applications-distributedshell.jar
> org.apache.Hadoop.yarn.applications.distributedshell.Client 
> -jar /usr/lib/Hadoop-yarn/Hadoop-yarn-applications-distributedshell.jar
> -shell_command  '/bin/date' -num_containers 100

4. 实例分析-MapReduce

在这里插入图片描述

Yarn框架处理MR程序时默认类
InputFormatTextInputFormat
RecordReaderLineRecordReader
InputSplitFileSplit
MapIdentityMapper
Combine不使用
PartitionerHashPartitioner
GroupCompatator不使用
ReduceIdentityReducer
OutputFormatFileOutputFormat
RecordWriterLineRecordWriter
OutputCommitterFileOutputCommitter

MapReduce编程示例——WordCount

下面是MapReduce自带的最简单代码, MapReduce算法实现统计文章中单词出现次数,源代码如下:

public class WordCount
    //定义map类,一般继承自Mapper类,里面实现读取单词,写出<单词,1>
    public static class TokenizerMapper extends Mapperc<Object, Text, Text, Int Writable> {
    private final static Int Writale one = new IntWritable(1);
    private Text word = new Text();
    //map方法,划分一行文本,读一单词写出一个<单词,1>
    public void map(Object key, Text value, Context context)throws IOException, InterruptedException {
        StringTokenizer itr = new StringTokenizer(value.toString());
        while(itr.hasMoreTokens()) {
        word.set(itr.nextToken());
        context.write(word, one);        //写出<单词,1>
    }}} 

//定义reduce类,对相同的单词,把它们<K,VList>中的VList值全部相加
public static class IntSumReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
    private IntWritable result = new IntWritable();
    public void reduce(Text key, Iterable<IntWritable> values, Context context throws IOException, InterruptedException {
        int sum = 0;
        for(IntWritable val: values) {
            sum += val.get();        //相当于<cstor,1><cstor,1>,将两个1相加
        }
        result.set(sum);
        context.write(key,result);      //写出这个单词,和这个单词出现次数<单词,单词出现次数>
    }}
    public static void main(String[] args) throws Exception {    //主方法,函数入口
        Configuration conf = new Configuration();        //实例化配置文件类
        Job job = new Job(conf, "WordCount");        //实例化Job类
        job.setInputFormatClass(TextInputFormat.class);      //指定使用默认输入格式类
        TextInputFormat.setInputPaths(job, inputPaths);       //设置待处理文件的位置
        job.setJarByClass(WordCount.class);        //设置主类名
        job.setMapperClass(TokenizerMapper.class);    //指定使用上述自定义Map类
        job.setMapOutputKeyClass(Text.class);     //指定Map类输出的<K,V>,K类型
        job.setMapOutputValueClass(IntWritable.class);      //指定Map类输出的-K,V>,V类型
        job.setPartitionerClass(HashPartitioner.class);      //指定使用默认的HashPartitioner类
        job.setReducerClass(IntSumReducer.class);     //指定使用上述自定义Reduce类
        job.setNumReduceTasks(Integer.parseInt(numOfReducer);    //指定Reduce个数
        job.setOutputKeyClass(Text.class);        //指定Reduce类输出的<K,V>K类型
        job.setOutputValueClass(Text.class);        //指定Reduce类输出的<K,V>,V类型
        job.setOutputFormatClass(TextOutputFormat.class);      //指定使用默认输出格式类
        TextOutputFormat.setOutputPath(job, outputDir);        //设置输出结果文件位置
        System.exit(job.waitForCompletion(true)?0:1);        //提交任务并监控任务状态
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1828030.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

最大连续子序列和问题详解

最大连续子序列和问题如下&#xff1a;给定一个数字序列&#xff0c;求i,j&#xff0c;使得最大&#xff0c;输出这个最大和。 这个问题如果用暴力来做&#xff0c;枚举左端点和右端点&#xff0c;需要的复杂度&#xff0c;而计算需要的复杂度&#xff0c;因此总时间复杂度为。…

表面声波滤波器——压电材料(2)

声表面波压电材料 压电效应&#xff1a; 1880年&#xff0c;法国物理学家居里兄弟(PCunie 和J.Curie)发现将重物置于α石英晶体上,品体部分表面会产生电荷&#xff0c;电荷量与所受压力成正比正压电效应&#xff1a;外加压力作应下在表面间产生电位差。 和逆压电效&#xff1a…

14 学习PID--步进电机梯形加减速实现原理

步进电机加减速使用的场景有那些呢&#xff1f;为什么要使用加减速呢&#xff1f; 硬件驱动细分器与软件的细分参数或定时器分频参数设置不当时启动电机时&#xff0c;会遇见步进电机有啸叫声但是不会转动&#xff0c;这是因为软件产生脉冲的频率大于步进电机的启动频率&#x…

Iptables深入浅出

1、iptables的基本概念 众所周知iptables是Linux系统下自带免费的包过滤防火墙。其实不然&#xff0c;iptables其实不是真正的防火墙&#xff0c;我们可以把它理解成一个客户端代理&#xff0c;用户通过iptables这个代理&#xff0c;将用户的安全设定执行到对应的”安全框架”…

【Oracle APEX开发小技巧1】转换类型实现显示小数点前的 0 以 及常见类型转换

在 apex 交互式式网格中&#xff0c;有一数值类型为 NUMBER&#xff0c;保留小数点后两位的项&#xff0c;在 展示时小数点前的 0 不显示。 效果如下&#xff1a; 转换前&#xff1a; m.WEIGHT_COEFFICIENT 解决方案&#xff1a; 将 NUMBER&#xff08;20&#xff0c;2&#xf…

Python进阶:从函数到文件的编程艺术!!!

第二章&#xff1a;Python进阶 模块概述 函数是一段可重复使用的代码块&#xff0c;它接受输入参数并返回一个结果。函数可以用于执行特定的任务、计算结果、修改数据等&#xff0c;使得代码更具模块化和可重用性。 模块是一组相关函数、类和变量的集合&#xff0c;它们被封…

Android Media Framework(六)插件式编程与OMXStore

OpenMAX IL Spec阅读到上一节就结束了&#xff0c;这一节开始正式进入到Framework阅读阶段&#xff0c;我们将了解OpenMAX框架是如何与Android Framework连接的。 1、插件式编程 插件式编程&#xff08;Plugin-based Programming&#xff09;是一种软件开发模式&#xff0c;它…

docker login 报错: http: server gave HTTP response to HTTPS client

环境&#xff1a; 自建 Harbor、Docker 1. 问题分析 # 命令&#xff0c;这里用的是 IP&#xff0c;可以为域名 docker login -u test 172.16.51.182:31120 # 输入密码 Password:# 报错如下&#xff1a; Error response from daemon: Get "https://172.16.51.182:31120/…

Flutter IOS 打包上架踩坑

前言 Flutter 作为一款跨平台的移动应用开发框架&#xff0c;凭借其高效、灵活和美观的特性&#xff0c;受到了越来越多开发者的青睐。 然而&#xff0c;当开发者们倾注心血完成 Flutter iOS 应用开发后&#xff0c;如何将应用成功上架至苹果商店&#xff08;App Store&#…

关于QTcreator,19年大学时写的文章了,之前写在印象笔记现在拉过来,往事如烟呐

1.初来乍到&#xff0c;先按照书本写一个基础列程理解一下原理。 这里创建工程的时候选择Qdialog基类&#xff0c;dialog.h头文件&#xff0c;并且勾选了创建界面 &#xff08;勾选之后可以通过手动添加组块并且可以自生成他们的函数定义&#xff0c;如果没有勾选&#xff0c;…

R 初级教程之一

IT的发展目前已经相当的内卷&#xff0c;到处都在说24年是将来4年最难的一年&#xff01;确实是&#xff0c;眼下各大厂商都在疯狂的裁员砍掉不营利的业务&#xff0c;收紧业务&#xff0c;不再盲目的扩张。小公司更是水深火热&#xff0c;无以言表。近期有个医院联系让使用R给…

uniapp中unicloud接入支付宝订阅消息完整教程

经过无数次的尝试,终于还是让我做出来了 准备工作 设置接口加签方式 使用支付宝小程序订阅消息,首先要设置接口加签方式,需要下载支付宝开放平台密钥工具,按照步骤生成秘钥,然后按照支付宝设置密钥加签方式添加接口加签方式。 有一点需要注意的,因为要在云函数中使用,…

MyBatis源码--04:MyBatis缓存实现

缓存作用&#xff1a; 在程序访问数据库这个过程中&#xff0c;存在几个性能瓶颈&#xff1a; 网络通信非关系型数据库将数据存储在硬盘当中&#xff0c;需要进行硬盘操作Java对象复用问题&#xff08;Connection连接池&#xff0c;Statement对象&#xff09; 缓存在程序和数…

Python猫周刊赠书规则与书单

△△请给“Python猫”加星标 &#xff0c;以免错过文章推送 你好&#xff0c;我是猫哥。在创作《Python潮流周刊》一年多的时间里&#xff0c;我已累计通过抽奖赠书 80 本&#xff01;早期周刊是免费分享&#xff0c;所以参与人数很多&#xff0c;现在周刊转为付费后&#xff0…

Vue50-mixin混入

一、为什么要使用 mixin混入 两个组件共享一个配置。 二、使用 mixin混入 2-1、创建一个混合js文件 2-2、引入混合js文件 1、局部混合 在每个组件中都引入混合js文件 注意&#xff1a; 混合就是复用配置&#xff0c;vm实例中的所有的配置项&#xff0c;都能在混合.js文件中写…

springboot与flowable(10):网关服务(排他网关)

一、绘制流程图 排他网关用于对流程中的决策建模。当执行到这个网关时&#xff0c;会按照所有出口顺序流定义的顺序对它们进行计算。选择第一个条件为true的顺序流继续流程。例如员工请假时&#xff0c;小于等于3天由组长审批&#xff0c;大于3天由总监审批。流程案例&#xff…

前端:鼠标点击实现高亮特效

一、实现思路 获取鼠标点击位置 通过鼠标点击位置设置高亮裁剪动画 二、效果展示 三、按钮组件代码 <template><buttonclass"blueBut"click"clickHandler":style"{backgroundColor: clickBut ? rgb(31, 67, 117) : rgb(128, 128, 128),…

0614,表达式,语句

题目一&#xff1a; 许多简单的交互式程序都是基于菜单的&#xff1a;它们向用户显示可供选择的命令列表&#xff1b;一旦用户选择了某条命令&#xff0c;程序就执行相应的操作&#xff0c;然后提示用户输入下一条命令&#xff1b;这个过程一直会持续到用户选择 "退出&qu…

SqlSugar使用DbFirst对象根据数据库表结构创建实体类-C#

本文所述开发环境&#xff1a;.C#、NET8、Visual Studio2022 1. 在项目中安装SqlSugar 在Visual Studio2022中新建一个 C# 的控制台应用程序&#xff0c;框架选择 .Net8。新建后如下图所示&#xff1a; 然后打开NuGet程序包管理器 搜索 SqlSugarCore 并安装 安装后在解决方案…

微服务开发与实战Day09 - Elasticsearch

一、DSL查询 Elasticsearch提供了DSL&#xff08;Domain Specific Language&#xff09;查询&#xff0c;就是以JSON格式来定义查询条件。类似这样&#xff1a; DSL查询可以分为两大类&#xff1a; 叶子查询&#xff08;Leaf query clauses&#xff09;&#xff1a;一般是在特…