圆周率π的近似计算(三)-MapReduce分布式计算入门_mapreduce计算圆周率(2)

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新大数据全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip204888 (备注大数据)
img

正文

public class SolvingPiMapper extends Mapper<LongWritable, Text, Text, Text> {       
    /**
     * key 输入 读取文件的起始位置
     * value 输入 文件中一行的内容
     * context 输出 <k,v>形式
     */
    @Override
    protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, Text>.Context context)
            throws IOException, InterruptedException {
        //将从文件中读取的随机试验次数解析出来
        String num = value.toString();
        Integer totle = new Integer(num);
        //声明随机试验中落点在扇形中数量
        int sum = 0;
        //进行随机试验并统计
        for(int i=0;i<totle;i++){
            double x = Math.random();
            double y = Math.random();
            if((x*x+y*y)<1){
                sum++;
            }
        }
        //将最后结果输出
        context.write(new Text("PI"), new Text(totle+"--"+sum));
    }
}

  1. 给出 reduce 方法
public class SolvingPiReducer extends Reducer<Text, Text, Text, DoubleWritable> {
    /**
     * name 输入的 "PI"
     * message 输入的"totle--num"
     * context 输出的<k,v>
     * 所有键位"PI"的输入都用这个方法进行处理
     */
    @Override
    protected void reduce(Text name, Iterable<Text> message, Reducer<Text, Text, Text, DoubleWritable>.Context context)
            throws IOException, InterruptedException {
        //声明试验进行的总数
        long sumTotle =0;
        //声明落点在扇形区域中的总数
        long sumOrder =0;
        //解析输入的message信息,从这提取上述两个值
        for (Text text : message) {
            String[] nums = text.toString().split("--");
            sumTotle+= new Integer(nums[0]);
            sumOrder+= new Integer(nums[1]);
        }
        //System.out.println("π的近似值为"+sumOrder*4.0/sumTotle);
        //输出最后结果
        context.write(name,new DoubleWritable(sumOrder*4.0/sumTotle));
    }
}

解析 map 方法返回的信息,进行汇总并输出最后结果.
3. 定义一个主类,用来描述job并提交job

public class SolvingPiRunner {
    //把业务逻辑相关的信息(哪个是 mapper,哪个是 reducer,要处理的数据在哪里,输出的结果放在哪里……)描述成一个 job 对象
    //把这个描述好的 job 提交给集群去运行
    public static void main(String[] args) throws Exception {
        //用户自定义输入
        System.out.println("请输入你想分的片数:");
        Scanner sc = new Scanner(System.in);
        int pice=new Integer(sc.nextLine());
        System.out.println("请输入你每片执行多少次:");
        String line=sc.nextLine();
        //按照分片生成文件(在实际环境中需要在hdfc中创建文件)
        for(int i=0;i<pice;i++){
            BufferedWriter bw = new BufferedWriter(new FileWriter(new File("D:\\hadoop\\input\\"+(i+1)+".txt")));
            bw.write(line);
            bw.close();
        }

        //把业务逻辑相关的信息(哪个是 mapper,哪个是 reducer,要处理的数据在哪里,输出的结果放在哪里……)描述成一个 job 对象
        //把这个描述好的 job 提交给集群去运行
        Configuration conf = new Configuration();
        Job job = Job.getInstance(conf);
        //知道这个job所在jar包
        job.setJarByClass(SolvingPiRunner.class);

        job.setMapperClass(SolvingPiMapper.class);
        job.setReducerClass(SolvingPiReducer.class);
        //设置我们的业务逻辑Mapper类的输出key 和  value 的数据
        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(Text.class);
        //设置我们的业务逻辑Reducer 类的输出Key和value 的数据类型
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(DoubleWritable.class);
        //指定要处理的数据所在的位置
        FileInputFormat.setInputPaths(job, "D:\\hadoop\\input\\*.txt");
        //指定处理完成后,结果所保存的位置
        FileOutputFormat.setOutputPath(job, new Path("D:\\hadoop\\output\\result"));
        //向yarn集群提交这个job

        boolean res = job.waitForCompletion(true);
        System.exit(res?0:1);
    }
}

在windows环境下模拟集群环境执行测试;

遇到的问题
  • 启动问题报错
Exception in thread "main" java.io.IOException: (null) entry in command string: null chmod 0700 D:\tmp\hadoop-lxc\mapred\staging\lxc1332581434\.staging
        at org.apache.hadoop.util.Shell$ShellCommandExecutor.execute(Shell.java:773)
        at org.apache.hadoop.util.Shell.execCommand(Shell.java:869)
        at org.apache.hadoop.util.Shell.execCommand(Shell.java:852)
        at org.apache.hadoop.fs.RawLocalFileSystem.setPermission(RawLocalFileSystem.java:733)
        at org.apache.hadoop.fs.RawLocalFileSystem.mkOneDirWithMode(RawLocalFileSystem.java:491)
        at org.apache.hadoop.fs.RawLocalFileSystem.mkdirsWithOptionalPermission(RawLocalFileSystem.java:532)
        at org.apache.hadoop.fs.RawLocalFileSystem.mkdirs(RawLocalFileSystem.java:509)
        at org.apache.hadoop.fs.FilterFileSystem.mkdirs(FilterFileSystem.java:312)
        at org.apache.hadoop.mapreduce.JobSubmissionFiles.getStagingDir(JobSubmissionFiles.java:133)
        at org.apache.hadoop.mapreduce.JobSubmitter.submitJobInternal(JobSubmitter.java:144)
        at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1290)
        at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1287)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.security.auth.Subject.doAs(Subject.java:422)
        at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1746)
        at org.apache.hadoop.mapreduce.Job.submit(Job.java:1287)
        at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:1308)
        at test.demo.SolvingPiRunner.main(SolvingPiRunner.java:54)

解决方法


报错二
Exception in thread "main" java.lang.RuntimeException: Error while running command to get file permissions : java.io.IOException: (null) entry in command string: null ls -F D:\hadoop\input\1.txt
    at org.apache.hadoop.util.Shell$ShellCommandExecutor.execute(Shell.java:773)
    at org.apache.hadoop.util.Shell.execCommand(Shell.java:869)
    at org.apache.hadoop.util.Shell.execCommand(Shell.java:852)
    at org.apache.hadoop.fs.FileUtil.execCommand(FileUtil.java:1097)
    at org.apache.hadoop.fs.RawLocalFileSystem$DeprecatedRawLocalFileStatus.loadPermissionInfo(RawLocalFileSystem.java:659)
    at org.apache.hadoop.fs.RawLocalFileSystem$DeprecatedRawLocalFileStatus.getPermission(RawLocalFileSystem.java:634)
    at org.apache.hadoop.fs.LocatedFileStatus.<init>(LocatedFileStatus.java:49)
    at org.apache.hadoop.fs.FileSystem$4.next(FileSystem.java:1733)


**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注大数据)**
![img](https://img-blog.csdnimg.cn/img_convert/56ea1a4a28c358657388cb4e22c1c604.png)

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

。**

**需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注大数据)**
[外链图片转存中...(img-3RSJ9D4Q-1713385064222)]

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值