简述yarn编程过程,再简述mr编程过程,说明二者有何关系?

简述yarn编程过程,再简述mr编程过程,说明二者有何关系?,第1张

Yarn 和 MapReduce (MR) 都是空迅 Hadoop 的组件,其中 Yarn 是一个资源管理器,而 MR 是一个分布式计算框架。下面分别介绍它们的编程过程和关系:

Yarn 编程过程:

1. 编写 Yarn 应用程序的客户端代码,该代码通常由一个提交 Yarn 应用程序的命令和一些相关的配置参数组成。

2. 在客户端代码中,需要定义 Yarn 应用程序所需要的资源(如 CPU、内存、磁盘等)以及执行的任务数等。

3. 通过客户端代码将应用程序提交给 Yarn,由 Yarn 根据资源需求和调度策略来分配资源,并在集群中启动应用程序的各个任务。

MR 编程过程:

1. 编写 Map 函数和 Reduce 函数。

2. 将数据分袜察割成多个块,并在多个计算节点上开启 Map 任务来处理每个块的数据。

3. Reduce 任务将 Map 产生的中间输出结果进行合并,生成最终的结果。

Yarn 和 MR 的关系:Yarn 提供了一个资源管理器和调度器,可以将多个 MR 任务分配到不同的计算节点上执行,从而实现了分布式计算的功能。由于 MR 常常需要处理大规模的数据,因此需要 Yarn 这样的分布式计算平台来斗好此提供资源调度和管理的支持。因此,两者是密不可分的关系。

MR素性检测算法

转载地址: http://m.blog.csdn.net/blog/spirtsong/38273187

素数是除了自身和1以外,没有其它素数因子的自然数。自从欧几里得证明了有无穷个素数以后,人们就企图寻找一个可以构造所有素数的公式,寻找判定一个自然数是不是素数的方法。因为素数的地位非常重要。

鉴别一个自然数是素数还是合数,这个问题在中世纪就引起人们注意,当时人们试图寻找质数公式,到了高斯时代,基本上确认了简单的质数公式是不存在的,因此,高斯认为对素性判定是一个相当困难的问题。从此以后,这个问题吸引了大批数学家。 素性判断算法可分为两大类,确定性算法及随机算法。前者可给出确定的结果但通常较慢,后者则反之。

这里主要讲米勒拉宾算法,最后提供c++实现代码。

要测试  是否为素数,首先将  分解为 。在每次测试开始时,先随机选一个 介于 的整数 ,之后如果对所有的 ,若 且 ,则 N 是合数。否则, 有  的概率为素数。

Miller- Rabin算法随机生成底数a,进行多次调用函数进行测试,Miller-Rabin检测也存在伪素数的问题,但是与费马检测不同,MR检测的正确概率不 依赖被检测数p,而仅依赖于检测次数。已经证明,如果一个数p为合数,那么Miller-Rabin检测的证据数量不少于比其小的正整数的3/4,换言 之,k次检测后得到错误结果的概率为(1/4)^k。我们在实际应用中一般可以测试15~20次。

1 #include <iostream>2 #include <cmath>3 using namespace std4  5 long long qpow(int a,int b,int r)//快速幂 6 { 7     long long ans=1,buff=a8     while(b) 9     {10         if(b&1)ans=(ans*buff)%r11         buff=(buff*buff)%r12         b>>=113     }14     return ans15 }16 bool Miller_Rabbin(int n,int a)//米勒拉宾素数测试17 {18     int r=0,s=n-1,j19     if(!(n%a))20         return false21     while(!(s&1)){22         s>>=123         r++24     }25     long long k=qpow(a,s,n)26     if(k==1)27         return true28     for(j=0j<rj++,k=k*k%n)29         if(k==n-1)30             return true31     return false32 }33 bool IsPrime(int n)//判断是否是素数34 {35     int tab[]={2,3,5,7}36     for(int i=0i<4i++)37     {38         if(n==tab[i])39             return true40         if(!Miller_Rabbin(n,tab[i]))41             return false42     }43     return true44 }45 int main()46 {47     long long n48     while(1)49     {50        cin >>n51     cout <<IsPrime(n)<<endl52     }53 54     return 055 }

在一次检验中,该算法出错的巧亩可能顶多是四分之一。如果我们独立地和随机地选择 a 进行重复检验,一旦此算法报告 n 是合数,我们就可以确信 孝握森n 肯定不是素数。但如果此算法重复检验 25 次报告都报告说 n 可能是素数,则我们可以说 n “几乎肯定是素数”。因为这样一个 25 次的检验过程给出关于它的输入的错误信息的概率小于 (1/4)25。这种机会小于 1015 分之一。即使我们以这样一个过程验证了十亿个不同的素数,预料出错的概率仍将小于百万分之一。因此如果真出了错,与其说此算法重复地猜测错,倒不如说由于 硬件的失灵或宇宙射线的原因,皮橡我们的计算机在它的计算中丢了一位。这样的概率性算法使我们对传统的可靠性标准提出一个问号:我们是否真正需要有素性的严格 证明。(以上文字引用自 Donald E.Knuth 所著的《计算机程序设计艺术 第2卷 半数值算法(第3版)》第 359 页“4.5.4 分解素因子”中的“算法P(概率素性检验)”后面的说明)

在上一篇博文中,散仙已经讲了Hadoop的单机伪分布的部署,本篇,散仙就说下,如何eclipse中调试hadoop2.2.0,如果你使用的还是hadoop1.x的版本,那么,也没事,散仙在以前的博客里,也写过eclipse调试1.x的hadoop程序,两者最大的不同之处在于使用的eclipse插件不同,hadoop2.x与hadoop1.x的API,不太一致,所以插件也不一样,我们只需要使用分别对应的插件即可. 

下面开始进入正题: 

序号    名称    描述  

1    eclipse    Juno Service Release 4.2的本  

2     *** 作系统    Windows7  

3    hadoop的eclipse插件    hadoop-eclipse-plugin-2.2.0.jar  

4    hadoop的集群环境    虚拟机Linux的Centos6.5单机伪分布式  

5    调试程序    Hellow World  

遇到的几个问题如下: 

Java代码  

java.io.IOException: Could not locate executable null\bin\winutils.exe in the Hadoop binaries.

解决办法: 

在org.apache.hadoop.util.Shell类的checkHadoopHome()方法的返回值里写固定的 

本机hadoop的路径,散仙在这里更改如下: 

Java代码  

private static String checkHadoopHome() {

// first check the Dflag hadoop.home.dir with JVM scope

//System.setProperty("hadoop.home.dir", "...")

String home = System.getProperty("hadoop.home.dir")

// fall 伏棚back to the system/user-global env variable

if (home == null) {

home = System.getenv("HADOOP_HOME")

}

try {

// couldn't find either setting for hadoop's home directory

if (home == null) {

throw new IOException("HADOOP_HOME or hadoop.home.dir are not set.")

}

if (home.startsWith("\"") && home.endsWith("\"")) {

home = home.substring(1, home.length()-1)

}

// check that the home setting is actually a directory that exists

File homedir = new File(home)

if (!homedir.isAbsolute() || !homedir.exists() || !homedir.isDirectory()) {

throw new IOException("Hadoop home directory " + homedir

+ " does not exist, is not a directory, or is not an absolute path.")

}

home = homedir.getCanonicalPath()

} catch (IOException ioe) {

if (LOG.isDebugEnabled()) {

LOG.debug("Failed to 码厅胡detect a valid hadoop home directory", ioe)

}

home = null

}

//固定本机的hadoop地址迟拦

home="D:\\hadoop-2.2.0"

return home

}

第二个异常,Could not locate executable D:\Hadoop\tar\hadoop-2.2.0\hadoop-2.2.0\bin\winutils.exe in the Hadoop binaries.  找不到win上的执行程序,可以去下载bin包,覆盖本机的hadoop跟目录下的bin包即可 

第三个异常: 

Java代码  

Exception in thread "main" java.lang.IllegalArgumentException: Wrong FS: hdfs://192.168.130.54:19000/user/hmail/output/part-00000, expected: file:///

at org.apache.hadoop.fs.FileSystem.checkPath(FileSystem.java:310)

at org.apache.hadoop.fs.RawLocalFileSystem.pathToFile(RawLocalFileSystem.java:47)

at org.apache.hadoop.fs.RawLocalFileSystem.getFileStatus(RawLocalFileSystem.java:357)

at org.apache.hadoop.fs.FilterFileSystem.getFileStatus(FilterFileSystem.java:245)

at org.apache.hadoop.fs.ChecksumFileSystem$ChecksumFSInputChecker.<init>(ChecksumFileSystem.java:125)

at org.apache.hadoop.fs.ChecksumFileSystem.open(ChecksumFileSystem.java:283)

at org.apache.hadoop.fs.FileSystem.open(FileSystem.java:356)

at com.netease.hadoop.HDFSCatWithAPI.main(HDFSCatWithAPI.java:23)

出现这个异常,一般是HDFS的路径写的有问题,解决办法,拷贝集群上的core-site.xml和hdfs-site.xml文件,放在eclipse的src根目录下即可。 

第四个异常: 

Java代码  

Exception in thread "main" java.lang.UnsatisfiedLinkError: org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/StringI)Z

出现这个异常,一般是由于HADOOP_HOME的环境变量配置的有问题,在这里散仙特别说明一下,如果想在Win上的eclipse中成功调试Hadoop2.2,就需要在本机的环境变量上,添加如下的环境变量: 

(1)在系统变量中,新建HADOOP_HOME变量,属性值为D:\hadoop-2.2.0.也就是本机对应的hadoop目录 

(2)在系统变量的Path里,追加%HADOOP_HOME%/bin即可 

以上的问题,是散仙在测试遇到的,经过对症下药,我们的eclipse终于可以成功的调试MR程序了,散仙这里的Hellow World源码如下: 

Java代码  

package com.qin.wordcount

import java.io.IOException

import org.apache.hadoop.fs.FileSystem

import org.apache.hadoop.fs.Path

import org.apache.hadoop.io.IntWritable

import org.apache.hadoop.io.LongWritable

import org.apache.hadoop.io.Text

import org.apache.hadoop.mapred.JobConf

import org.apache.hadoop.mapreduce.Job

import org.apache.hadoop.mapreduce.Mapper

import org.apache.hadoop.mapreduce.Reducer

import org.apache.hadoop.mapreduce.lib.input.FileInputFormat

import org.apache.hadoop.mapreduce.lib.input.TextInputFormat

import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat

import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat

/***

*

* Hadoop2.2.0测试

* 放WordCount的例子

*

* @author qindongliang

*

* hadoop技术交流群:  376932160

*

*

* */

public class MyWordCount {

/**

* Mapper

*

* **/

private static class WMapper extends Mapper<LongWritable, Text, Text, IntWritable>{

private IntWritable count=new IntWritable(1)

private Text text=new Text()

@Override

protected void map(LongWritable key, Text value,Context context)

throws IOException, InterruptedException {

String values[]=value.toString().split("#")

//System.out.println(values[0]+"========"+values[1])

count.set(Integer.parseInt(values[1]))

text.set(values[0])

context.write(text,count)

}

}

/**

* Reducer

*

* **/

private static class WReducer extends Reducer<Text, IntWritable, Text, Text>{

private Text t=new Text()

@Override

protected void reduce(Text key, Iterable<IntWritable> value,Context context)

throws IOException, InterruptedException {

int count=0

for(IntWritable i:value){

count+=i.get()

}

t.set(count+"")

context.write(key,t)

}

}

/**

* 改动一

* (1)shell源码里添加checkHadoopHome的路径

* (2)974行,FileUtils里面

* **/

public static void main(String[] args) throws Exception{

//      String path1=System.getenv("HADOOP_HOME")

//      System.out.println(path1)

//      System.exit(0)

JobConf conf=new JobConf(MyWordCount.class)

//Configuration conf=new Configuration()

//conf.set("mapred.job.tracker","192.168.75.130:9001")

//读取person中的数据字段

// conf.setJar("tt.jar")

//注意这行代码放在最前面,进行初始化,否则会报

/**Job任务**/

Job job=new Job(conf, "testwordcount")

job.setJarByClass(MyWordCount.class)

System.out.println("模式:  "+conf.get("mapred.job.tracker"))

// job.setCombinerClass(PCombine.class)

// job.setNumReduceTasks(3)//设置为3

job.setMapperClass(WMapper.class)

job.setReducerClass(WReducer.class)

job.setInputFormatClass(TextInputFormat.class)

job.setOutputFormatClass(TextOutputFormat.class)

job.setMapOutputKeyClass(Text.class)

job.setMapOutputValueClass(IntWritable.class)

job.setOutputKeyClass(Text.class)

job.setOutputValueClass(Text.class)

String path="hdfs://192.168.46.28:9000/qin/output"

FileSystem fs=FileSystem.get(conf)

Path p=new Path(path)

if(fs.exists(p)){

fs.delete(p, true)

System.out.println("输出路径存在,已删除!")

}

FileInputFormat.setInputPaths(job, "hdfs://192.168.46.28:9000/qin/input")

FileOutputFormat.setOutputPath(job,p )

System.exit(job.waitForCompletion(true) ? 0 : 1)

}

}

控制台,打印日志如下: 

Java代码  

INFO - Configuration.warnOnceIfDeprecated(840) | mapred.job.tracker is deprecated. Instead, use mapreduce.jobtracker.address

模式:  local

输出路径存在,已删除!

INFO - Configuration.warnOnceIfDeprecated(840) | session.id is deprecated. Instead, use dfs.metrics.session-id

INFO - JvmMetrics.init(76) | Initializing JVM Metrics with processName=JobTracker, sessionId=

WARN - JobSubmitter.copyAndConfigureFiles(149) | Hadoop command-line option parsing not performed. Implement the Tool interface and execute your application with ToolRunner to remedy this.

WARN - JobSubmitter.copyAndConfigureFiles(258) | No job jar file set.  User classes may not be found. See Job or Job#setJar(String).

INFO - FileInputFormat.listStatus(287) | Total input paths to process : 1

INFO - JobSubmitter.submitJobInternal(394) | number of splits:1

INFO - Configuration.warnOnceIfDeprecated(840) | user.name is deprecated. Instead, use mapreduce.job.user.name

INFO - Configuration.warnOnceIfDeprecated(840) | mapred.output.value.class is deprecated. Instead, use mapreduce.job.output.value.class

INFO - Configuration.warnOnceIfDeprecated(840) | mapred.mapoutput.value.class is deprecated. Instead, use mapreduce.map.output.value.class

INFO - Configuration.warnOnceIfDeprecated(840) | mapreduce.map.class is deprecated. Instead, use mapreduce.job.map.class

INFO - C


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8260047.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-14
下一篇 2023-04-14

发表评论

登录后才能评论

评论列表(0条)

保存