tag 标签: 一课

相关资源
  • 所需E币: 0
    时间: 2023-12-22 10:13
    大小: 3.93KB
    上传者: 开心就很好了
    Java并发编程从入门到进阶多场景实战,众所周知,并发编程是优秀工程师的标准之一,但知识庞杂,复杂性高,常常让人望而却步。但如果没有掌握背后的核心原理,你开发的代码可能会成为难以调试和优化的头疼问题。在此,我将通过上百个案例场景驱动教学+动画直观演示,帮助大家深入、直观地理解并发编程核心概念和底层原理。助力大家在实际工作和面试中都能尽早脱颖而出。首先,我们先来了解关于并发的基本概念。并发情况主要会引出三个基本概念,分别是原子性、可见性、有序性三个基本概念Java中线程的状态分为6种:1.初始(NEW):新创建了一个线程对象,但还没有调用start()方法。2.运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running)两种状态笼统的称为“运行”。线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取CPU的使用权,此时处于就绪状态(ready)。就绪状态的线程在获得CPU时间片后变为运行中状态(running)。3.阻塞(BLOCKED):表示线程阻塞于锁。4.等待(WAITING):进入该状态的线程需要等待其他线程做出一些特定动作(通知或中断)。5.超时等待(TIMED_WAITING):该状态不同于WAITING,它可以在指定的时间后自行返回。6.终止(TERMINATED):表示该线程已经执行完毕。其实我们可以通过job.setPartitionerClass来设置分区类,不过目前我们是没有设置的,那框架中是不是有默认值啊,是有的,我们可以通过job.getPartitionerClass方法看到默认情况下会使用HashPartitioner这个分区类那我们来看一下HashPartitioner的实现是什么样子的/**Partitionkeysbytheir{@linkObject#hashCode()}.*/@InterfaceAudience.Public@InterfaceStability.StablepublicclassHashPartitioner<K,V>extendsPartitioner<K,V>{ /**Use{@linkObject#hashCode()}topartition.*/ publicintgetPartition(Kkey,Vvalue,             intnumReduceTasks){  return(key.hashCode()&Integer.MAX_VALUE)%numReduceTasks; }}下面我们来具体跑一个这份数据,首先复制一份WordCountJob的代码,新的类名为WordCountJobSkewpackagecom.imooc.mr;importorg.apache.hadoop.conf.Configuration;importorg.apache.hadoop.fs.Path;importorg.apache.hadoop.io.LongWritable;importorg.apache.hadoop.io.Text;importorg.apache.hadoop.mapreduce.Job;importorg.apache.hadoop.mapreduce.Mapper;importorg.apache.hadoop.mapreduce.Reducer;importorg.apache.hadoop.mapreduce.lib.input.FileInputFormat;importorg.apache.hadoop.mapreduce.lib.output.FileOutputFormat;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importjava.io.IOException;/** *数据倾斜-增加Reduce任务个数 * *Createdbyxuwei */publicclassWordCountJobSkew{  /**   *Map阶段   */  publicstaticclassMyMapperextendsMapper<LongWritable,Text,Text,LongWritable>{    Loggerlogger=LoggerFactory.getLogger(MyMapper.class);    /**     *需要实现map函数     *这个map函数就是可以接收<k1,v1>,产生<k2,v2>     *@paramk1     *@paramv1     *@paramcontext     *@throwsIOException     *@throwsInterruptedException     */    @Override    protectedvoidmap(LongWritablek1,Textv1,Contextcontext)        throwsIOException,InterruptedException{      //输出k1,v1的值      //System.out.println("<k1,v1>=<"+k1.get()+","+v1.toString()+">");      //logger.info("<k1,v1>=<"+k1.get()+","+v1.toString()+">");      //k1代表的是每一行数据的行首偏移量,v1代表的是每一行内容      //对获取到的每一行数据进行切割,把单词切割出来      String[]words=v1.toString().split("");      //把单词封装成<k2,v2>的形式      Textk2=newText(words[0]);      LongWritablev2=newLongWritable(1L);      //把<k2,v2>写出去      context.write(k2,v2);    }  }  /**   *Reduce阶段   */  publicstaticclassMyReducerextendsReducer<Text,LongWritable,Text,LongWritable>{    Loggerlogger=LoggerFactory.getLogger(MyReducer.class);    /**     *针对<k2,{v2...}>的数据进行累加求和,并且最终把数据转化为k3,v3写出去     *@paramk2     *@paramv2s     *@paramcontext     *@throwsIOException     *@throwsInterruptedException     */    @Override    protectedvoidreduce(Textk2,Iterable<LongWritable>v2s,Contextcontext)        throwsIOException,InterruptedException{      //创建一个sum变量,保存v2s的和      longsum=0L;      //对v2s中的数据进行累加求和      for(LongWritablev2:v2s){        //输出k2,v2的值        //System.out.println("<k2,v2>=<"+k2.toString()+","+v2.get()+">");        //logger.info("<k2,v2>=<"+k2.toString()+","+v2.get()+">");        sum+=v2.get();//模拟Reduce的复杂计算消耗的时间        if(sum%200==0){          Thread.sleep(1);        }      }      //组装k3,v3      Textk3=k2;      LongWritablev3=newLongWritable(sum);      //输出k3,v3的值      //System.out.println("<k3,v3>=<"+k3.toString()+","+v3.get()+">");      //logger.info("<k3,v3>=<"+k3.toString()+","+v3.get()+">");      //把结果写出去      context.write(k3,v3);    }  }  /**   *组装Job=Map+Reduce   */  publicstaticvoidmain(String[]args){    try{      if(args.length!=3){        //如果传递的参数不够,程序直接退出        System.exit(100);      }      //指定Job需要的配置参数      Configurationconf=newConfiguration();      //创建一个Job      Jobjob=Job.getInstance(conf);      //注意了:这一行必须设置,否则在集群中执行的时候是找不到WordCountJob这个类的      job.setJarByClass(WordCountJobSkew.class);      //指定输入路径(可以是文件,也可以是目录)      FileInputFormat.setInputPaths(job,newPath(args[0]));      //指定输出路径(只能指定一个不存在的目录)      FileOutputFormat.setOutputPath(job,newPath(args[1]));      //指定map相关的代码      job.setMapperClass(MyMapper.class);      //指定k2的类型      job.setMapOutputKeyClass(Text.class);      //指定v2的类型      job.setMapOutputValueClass(LongWritable.class);      //指定reduce相关的代码      job.setReducerClass(MyReducer.class);      //指定k3的类型      job.setOutputKeyClass(Text.class);      //指定v3的类型      job.setOutputValueClass(LongWritable.class);      //设置reduce任务个数      job.setNumReduceTasks(Integer.parseInt(args[2]));      //提交job      job.waitForCompletion(true);    }catch(Exceptione){      e.printStackTrace();    }  }}针对这个操作我们需要去修改代码,在这里我们再重新复制一个类,基于WordCountJobSkew复制,新的类名是WordCountJobSkewRandKeypackagecom.imooc.mr;importorg.apache.hadoop.conf.Configuration;importorg.apache.hadoop.fs.Path;importorg.apache.hadoop.io.LongWritable;importorg.apache.hadoop.io.Text;importorg.apache.hadoop.mapreduce.Job;importorg.apache.hadoop.mapreduce.Mapper;importorg.apache.hadoop.mapreduce.Reducer;importorg.apache.hadoop.mapreduce.lib.input.FileInputFormat;importorg.apache.hadoop.mapreduce.lib.output.FileOutputFormat;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importjava.io.IOException;importjava.util.Random;/** *数据倾斜-把倾斜的数据打散 * *Createdbyxuwei */publicclassWordCountJobSkewRandKey{  /**   *Map阶段   */  publicstaticclassMyMapperextendsMapper<LongWritable,Text,Text,LongWritable>{    Loggerlogger=LoggerFactory.getLogger(MyMapper.class);    Randomrandom=newRandom();    /**     *需要实现map函数     *这个map函数就是可以接收<k1,v1>,产生<k2,v2>     *@paramk1     *@paramv1     *@paramcontext     *@throwsIOException     *@throwsInterruptedException     */    @Override    protectedvoidmap(LongWritablek1,Textv1,Contextcontext)        throwsIOException,InterruptedException{      //输出k1,v1的值      //System.out.println("<k1,v1>=<"+k1.get()+","+v1.toString()+">");      //logger.info("<k1,v1>=<"+k1.get()+","+v1.toString()+">");      //k1代表的是每一行数据的行首偏移量,v1代表的是每一行内容      //对获取到的每一行数据进行切割,把单词切割出来      String[]words=v1.toString().split("");      //把单词封装成<k2,v2>的形式      Stringkey=words[0];      if("5".equals(key)){        //把倾斜的key打散,分成10份        key="5"+"_"+random.nextInt(10);      }      Textk2=newText(key);      LongWritablev2=newLongWritable(1L);      //把<k2,v2>写出去      context.write(k2,v2);    }  }  /**   *Reduce阶段   */  publicstaticclassMyReducerextendsReducer<Text,LongWritable,Text,LongWritable>{    Loggerlogger=LoggerFactory.getLogger(MyReducer.class);    /**     *针对<k2,{v2...}>的数据进行累加求和,并且最终把数据转化为k3,v3写出去     *@paramk2     *@paramv2s     *@paramcontext     *@throwsIOException     *@throwsInterruptedException     */    @Override    protectedvoidreduce(Textk2,Iterable<LongWritable>v2s,Contextcontext)        throwsIOException,InterruptedException{      //创建一个sum变量,保存v2s的和      longsum=0L;      //对v2s中的数据进行累加求和      for(LongWritablev2:v2s){        //输出k2,v2的值        //System.out.println("<k2,v2>=<"+k2.toString()+","+v2.get()+">");        //logger.info("<k2,v2>=<"+k2.toString()+","+v2.get()+">");        sum+=v2.get();        //模拟Reduce的复杂计算消耗的时间        if(sum%200==0){          Thread.sleep(1);        }      }      //组装k3,v3      Textk3=k2;      LongWritablev3=newLongWritable(sum);      //输出k3,v3的值      //System.out.println("<k3,v3>=<"+k3.toString()+","+v3.get()+">");      //logger.info("<k3,v3>=<"+k3.toString()+","+v3.get()+">");      //把结果写出去      context.write(k3,v3);    }  }  /**   *组装Job=Map+Reduce   */  publicstaticvoidmain(String[]args){    try{      if(args.length!=3){        //如果传递的参数不够,程序直接退出        System.exit(100);      }      //指定Job需要的配置参数      Configurationconf=newConfiguration();      //创建一个Job      Jobjob=Job.getInstance(conf);      //注意了:这一行必须设置,否则在集群中执行的时候是找不到WordCountJob这个类的      job.setJarByClass(WordCountJobSkewRandKey.class);      //指定输入路径(可以是文件,也可以是目录)      FileInputFormat.setInputPaths(job,newPath(args[0]));      //指定输出路径(只能指定一个不存在的目录)      FileOutputFormat.setOutputPath(job,newPath(args[1]));      //指定map相关的代码      job.setMapperClass(MyMapper.class);      //指定k2的类型      job.setMapOutputKeyClass(Text.class);      //指定v2的类型      job.setMapOutputValueClass(LongWritable.class);      //指定reduce相关的代码      job.setReducerClass(MyReducer.class);      //指定k3的类型      job.setOutputKeyClass(Text.class);      //指定v3的类型      job.setOutputValueClass(LongWritable.class);      //设置reduce任务个数      job.setNumReduceTasks(Integer.parseInt(args[2]));      //提交job      job.waitForCompletion(true);    }catch(Exceptione){      e.printStackTrace();    }  }}调用parallelize()时,有一个重要的参数可以指定,就是将集合切分成多少个partition。Spark会为每一个partition运行一个task来进行处理。Spark默认会根据集群的配置来设置partition的数量。我们也可以在调用parallelize()方法时,传入第二个参数,来设置RDD的partition数量,例如:parallelize(arr,5)scala代码如下:packagecom.imooc.scalaimportorg.apache.spark.{SparkConf,SparkContext}/** *需求:使用集合创建RDD *Createdbyxuwei */objectCreateRddByArrayScala{ defmain(args:Array[String]):Unit={  //创建SparkContext  valconf=newSparkConf()  conf.setAppName("CreateRddByArrayScala")//设置任务名称  .setMaster("local")//local表示在本地执行  valsc=newSparkContext(conf)  //创建集合  valarr=Array(1,2,3,4,5)  //基于集合创建RDD  valrdd=sc.parallelize(arr)  valsum=rdd.reduce(_+_)  println(sum)  //停止SparkContext  sc.stop() }}
  • 所需E币: 0
    时间: 2023-10-8 09:20
    大小: 1.6KB
    上传者: huangyasir1990
    前端必学40个精选案例实战一课吃透HTML5+CSS3+JS教程下载,47章全,2023年9月完结!HTML5是构建Web内容的一种语言描述方式。HTML5是互联网的下一代标准,是构建以及呈现互联网内容的一种语言方式,被认为是互联网的核心技术之一。HTML产生于1990年,1997年HTML4成为互联网标准,并广泛应用于互联网应用的开发。HTML5是Web中核心语言HTML的规范,用户使用任何手段进行网页浏览时看到的内容原本都是HTML格式的,在浏览器中通过一些技术处理将其转换成为了可识别的信息。HTML5在从前HTML4.01的基础上进行了一定的改进,虽然技术人员在开发过程中可能不会将这些新技术投入应用,但是对于该种技术的新特性,网站开发技术人员是必须要有所了解的。HTML5-新特性HTML5的一些最有趣的新特性:新的语义元素,比如<header>,<footer>,<article>,and<section>。新的表单控件,比如数字、日期、时间、日历和滑块。强大的图像支持(借由<canvas>和<svg>)强大的多媒体支持(借由<video>和<audio>)强大的新API,比如用本地存储取代cookie。HTML是一种标记语言,5代表版本号,现在已经是第五个版本了。通过一系列标签可以将网络上的文档格式统一,使分散的互联网资源连接为一个逻辑整体。HTML文本是由HTML命令组成的描述性文本,HTML命令可以说明文字,图形、动画、声音、表格、链接等。超文本是一种组织信息的方式,它通过超级链接方法将文本中的文字、图表与其他信息媒体相关联。2.作用:前端领域,搭配css和js设计网页。3.HTML5遵循的标准:W3C标准:                1)结构化标准语言                2)表现标准语言                3)行为标准<metaname="keywords"content="相关词汇">   //只要在浏览器上搜索相关词汇就能找到该网页<metaname="description"content="描述上面名词的作用">注释:<!---->             //ctrl+/<!DOCTYPEhtml>//表示浏览器的使用规范,一般默认都是html的规范
  • 所需E币: 0
    时间: 2023-10-8 09:34
    大小: 1.85KB
    上传者: 开心就很好了
    【2023最新】前端必学40个精选案例实战一课吃透HTML5+CSS3+JS教程下载CSS3是CSS(层叠样式表)技术的升级版本,于1999年开始制订,2001年5月23日W3C完成了CSS3的工作草案,主要包括盒子模型、列表模块、超链接方式、语言模块、背景和边框、文字特效、多栏布局等模块。CSS演进的一个主要变化就是W3C决定将CSS3分成一系列模块。浏览器厂商按CSS节奏快速创新,因此通过采用模块方法,CSS3规范里的元素能以不同速度向前发展,因为不同的浏览器厂商只支持给定特性。但不同浏览器在不同时间支持不同特性,这也让跨浏览器开发变得复杂1-1、基本概念层叠样式表(CascadingStyleSheets)是一种用来表现HTML或XML等文件样式的计算机语言CSS不仅可以静态地修饰网页,还可以配合各种脚本语言动态地对网页各元素进行格式化。CSS能够对网页中元素位置的排版进行像素级精确控制,支持几乎所有的字体字号样式,拥有对网页对象和模型样式编辑的能力1-2、发展历程CSS1.0:网页基本样式CSS2.0:DIV(块)+CSS,提出HTML与CSS结构分离的思想,网页变得简单,利于SEOCSS2.1:浮动,定位CSS3.0:圆角,阴影,动画…浏览器兼容性CSS全称为层叠样式表,它主要是用于定义HTML内容在浏览器内的显示样式,如文字大小、颜色、字体加粗等。使用CSS样式的一个好处是通过定义某个样式,可以让不同网页位置的文字有着统一的字体、字号或者颜色等。CSS代码语法css样式由选择器和声明组成,而声明又由属性和值组成选择器{属性:值}例如:p{color:red;}选择器,指明网页中要应用样式规则的元素,如本例中是网页中所有的段<p>的文字将变成蓝色,而其他的元素不会受到影响。声明:在{}中的的就是声明,属性和值之间用英文冒号“:”分隔。当有多条声明时,中间可以英文分号“;”分隔。CSS代码插入从CSS样式代码插入的形式来看可以分为内联式、嵌入式和外部式三种。内联式就是把css代码直接写在现有的HTML标签中,如下面代码:<pstyle="color:red">这里文字是红色。</p>嵌入式就是把css样式代码写在<style>...</style>标签之间。外部式外部式css样式就是把css代码写一个单独的外部文件中,这个css样式文件以“.css”为扩展名,在<head>内使用<link>标签将css样式文件链接到HTML文件内,如下面代码:<linkhref="base.css"rel="stylesheet"type="text/css"/>
  • 所需E币: 0
    时间: 2022-4-22 09:37
    大小: 2.2MB
    上传者: 步控电子科技
    步骤编程学习_跑马灯 简介
  • 所需E币: 1
    时间: 2022-3-1 14:59
    大小: 22.98MB
    上传者: 西风瘦马
    3205288_Python程序设计第一课清华出版社高清PDF书籍
  • 所需E币: 5
    时间: 2022-1-22 17:06
    大小: 361.33KB
    上传者: samewell
    51单片机汇编学习资料第一课预备:从51_STM8到STM32的全过程.pdf