精华内容
下载资源
问答
  • 入心入耳评价语,宜搭宜建共育桥——官幼开展“如何巧妙地好幼儿评语”专题研讨活动好评语是幼儿园老师的一项基本功,也是幼儿教师日常工作的重要部分,更是对孩子一学期成长反馈的重要形式。为了帮助教师们更好地...

    入心入耳评价语,宜搭宜建共育桥

    ——官幼开展“如何巧妙地写好幼儿评语”专题研讨活动

    写好评语是幼儿园老师的一项基本功,也是幼儿教师日常工作的重要部分,更是对孩子一学期成长反馈的重要形式。为了帮助教师们更好地观察幼儿,以幼儿为主体,写出符合幼儿表现,贴近幼儿生活的评语,从而提高教师的评语撰写能力。近日小官庄镇中心幼儿园小班年级组向全园开展了《入心入耳评价语,宜搭宜建共育桥》专题研讨活动。

    4953b2de72c4e679b78a7e77b2798346.png
    044e66fec4638386aa6a721cdf6688cf.png
    4d6d6a61c4aef6aab21dc844eec60397.png
    4b45877875c41e12ad633eadf881c4e6.png
    c691ac7c3684282c5ed4fb8618bae607.png

    本次活动由小班年级组长陈玉杰老师主持,她从1、撰写幼儿评语时存在哪些问题。2、结合我们的实际,应给出哪些解决策略?两方面提出问题,活动中教师们踊跃发言,最后陈老师根据教师们的发言进行了总结,她分别从评语的概念鉴定、并列举了大量的优秀评语范例,活用指南,让老师们用心自主、扎实掌握评语撰写的一般格式和要求,从而写出客观真实且富有特色的评语。

    此次研讨活动让教师更明确了评语撰写的原则和方法,更新了教师们的教育理念。相信在以后的期末评价和家园沟通中能起到重要作用。(小官庄镇中心幼儿园:李娟;来源:宝应生活网)

    展开全文
  • 下面的内容主要加工自[MRUnit Tutorial](https://cwiki.apache.org/confluence/display/MRUNIT/MRUnit+Tutorial),Tutorial中另外还介绍了Counter的测试(也就是如何获取Counter)和Configuration传参数(如何在Mock...

    写不写测试是个人选择问题,对于我自己而言,写测试不是为了有X格,而是为了对代码更有信心。

      MapReduce的测试确实没有那么方便,但是还是有办法的。下面的内容主要加工自MRUnit Tutorial,Tutorial中另外还介绍了Counter的测试(也就是如何获取Counter)和Configuration传参数(如何在Mock中获取conf对象)。

    1. 基本功 - JUnit

      如果不会这个我还能说什么呢,还好很少有人不会。

    坐标junit:junit

    import org.junit.*;
    
    public class TestCases{
      @Test
      public void testXXX(){
       assertEquals(1 == 1);  
      }
    }

      这一部分是代码功能性测试的基础,一般来说是与环境不太相关的都可以用JUnit来做函数级的测试。这部分完成之后才有必要进行下面的Mapper、Reducer测试。

    2. MapReduce Mock - MRUnit

    坐标

    <dependency>
        <groupId>org.apache.mrunit</groupId>
        <artifactId>mrunit</artifactId>
        <version>1.1.0</version>
        <classifier>hadoop2</classifier>
        <scope>test</scope>
    </dependency>

      注意:需要显式地指定classifier来指定hadoop1还是hadoop2,两者在API上是有区别的。
      
      下面以测试WordCount为例说明如何对各个部分写测试。

    2.1 测试Mapper

    • 初始化一个MapDriver
    WordCount.Map mapper = new WordCount.Map();
    mapDriver = MapDriver.newMapDriver(mapper);
    • 给定输入检查输出
    @Test
    public void testMapper() throws IOException {
        mapDriver.withInput(new LongWritable(), new Text("a b a"))
                .withAllOutput(Lists.newArrayList(
                        new Pair<Text, IntWritable>(new Text("a"), new IntWritable(1)),
                        new Pair<Text, IntWritable>(new Text("b"), new IntWritable(1)),
                        new Pair<Text, IntWritable>(new Text("a"), new IntWritable(1))
                ))
                .runTest();
    }

      大部分情况下,测试不太可能写得这么优雅,比如遇到了float/double,这个时候就需要把结果取出来判断(这种方式显然才是更灵活的)。

    @Test
    public void testMpper2() throws IOException {
        mapDriver.withInput(new LongWritable(), new Text(
                "a b a"));
        List<Pair<Text, IntWritable>> actual = mapDriver.run();
    
        List<Pair<Text, IntWritable>> expected = Lists.newArrayList(
                new Pair<Text, IntWritable>(new Text("a"), new IntWritable(1)),
                new Pair<Text, IntWritable>(new Text("b"), new IntWritable(1)),
                new Pair<Text, IntWritable>(new Text("a"), new IntWritable(1))
        );
    
        // apache commons-collection: 判断元素相等,考虑了每个元素的频次
        assertTrue(CollectionUtils.isEqualCollection(actual, expected));
    
        assertEquals(actual.get(0).getSecond().get(), 1);
    }

    2.2 测试Reducer

    • 与Mapper类似,需要先初始化一个ReduceDriver
    WordCount.Reduce reducer = new WordCount.Reduce();
    reduceDriver = ReduceDriver.newReduceDriver(reducer);
    • 给定输入检查输出
    @Test
    public void testReducer() throws IOException {
        List<IntWritable> values = Lists.newArrayList();
        values.add(new IntWritable(1));
        values.add(new IntWritable(1));
        reduceDriver.withInput(new Text("a"), values);
        reduceDriver.withOutput(new Text("a"), new IntWritable(2));
        reduceDriver.runTest();
    }

    2.3 测试整个流程

    • 需要初始化三个部分——MapDriver, ReduceDriverMapReduceDriver
    WordCount.Map mapper = new WordCount.Map();
    WordCount.Reduce reducer = new WordCount.Reduce();
    mapDriver = MapDriver.newMapDriver(mapper);
    reduceDriver = ReduceDriver.newReduceDriver(reducer);
    mapReduceDriver = MapReduceDriver.newMapReduceDriver(mapper, reducer);
    • 设定Map的输入,检查Reduce的输出
    @Test
    public void testMapReduce() throws IOException {
        mapReduceDriver.withInput(new LongWritable(), new Text("a b a"))
                .withInput(new LongWritable(), new Text("a b b"))
                .withAllOutput(Lists.newArrayList(
                        new Pair<Text, IntWritable>(new Text("a"), new IntWritable(3)),
                        new Pair<Text, IntWritable>(new Text("b"), new IntWritable(3))))
                .runTest();
    }

    3. 附录

    <dependencies>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-client</artifactId>
            <version>2.6.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.mrunit</groupId>
            <artifactId>mrunit</artifactId>
            <version>1.1.0</version>
            <classifier>hadoop2</classifier>
        </dependency>
    </dependencies>
    • 代码
    package du00.tests;
    
    import com.google.common.collect.Lists;
    import org.apache.commons.collections.CollectionUtils;
    import org.apache.hadoop.io.IntWritable;
    import org.apache.hadoop.io.LongWritable;
    import org.apache.hadoop.io.Text;
    
    import org.apache.hadoop.mrunit.mapreduce.MapDriver;
    import org.apache.hadoop.mrunit.mapreduce.MapReduceDriver;
    import org.apache.hadoop.mrunit.mapreduce.ReduceDriver;
    import org.apache.hadoop.mrunit.types.Pair;
    import org.junit.*;
    
    import static org.junit.Assert.*;
    
    import java.io.IOException;
    import java.util.List;
    
    public class WordCountTest {
        MapDriver<LongWritable, Text, Text, IntWritable> mapDriver;
        ReduceDriver<Text, IntWritable, Text, IntWritable> reduceDriver;
        MapReduceDriver<LongWritable, Text, Text, IntWritable, Text, IntWritable> mapReduceDriver;
    
        @Before
        public void setUp() {
            WordCount.Map mapper = new WordCount.Map();
            WordCount.Reduce reducer = new WordCount.Reduce();
            mapDriver = MapDriver.newMapDriver(mapper);
            reduceDriver = ReduceDriver.newReduceDriver(reducer);
            mapReduceDriver = MapReduceDriver.newMapReduceDriver(mapper, reducer);
        }
    
        @Test
        public void testMapper() throws IOException {
            mapDriver.withInput(new LongWritable(), new Text("a b a"))
                    .withAllOutput(Lists.newArrayList(
                            new Pair<Text, IntWritable>(new Text("a"), new IntWritable(1)),
                            new Pair<Text, IntWritable>(new Text("b"), new IntWritable(1)),
                            new Pair<Text, IntWritable>(new Text("a"), new IntWritable(1))
                    ))
                    .runTest();
        }
    
        /**
         * 有时候结果会比较复杂,取出来抽取结果的一部分比较会是比较好的选择。比如对象的某个字段是double类型的。
         *
         * @throws IOException
         */
        @Test
        public void testMpper2() throws IOException {
            mapDriver.withInput(new LongWritable(), new Text(
                    "a b a"));
            List<Pair<Text, IntWritable>> actual = mapDriver.run();
    
            List<Pair<Text, IntWritable>> expected = Lists.newArrayList(
                    new Pair<Text, IntWritable>(new Text("a"), new IntWritable(1)),
                    new Pair<Text, IntWritable>(new Text("b"), new IntWritable(1)),
                    new Pair<Text, IntWritable>(new Text("a"), new IntWritable(1))
            );
    
            // apache commons-collection: 判断元素相等,考虑了每个元素的频次
            assertTrue(CollectionUtils.isEqualCollection(actual, expected));
    
            assertEquals(actual.get(0).getSecond().get(), 1);
        }
    
        @Test
        public void testReducer() throws IOException {
            List<IntWritable> values = Lists.newArrayList();
            values.add(new IntWritable(1));
            values.add(new IntWritable(1));
            reduceDriver.withInput(new Text("a"), values);
            reduceDriver.withOutput(new Text("a"), new IntWritable(2));
            reduceDriver.runTest();
        }
    
        @Test
        public void testMapReduce() throws IOException {
            mapReduceDriver.withInput(new LongWritable(), new Text("a b a"))
                    .withInput(new LongWritable(), new Text("a b b"))
                    .withAllOutput(Lists.newArrayList(
                            new Pair<Text, IntWritable>(new Text("a"), new IntWritable(3)),
                            new Pair<Text, IntWritable>(new Text("b"), new IntWritable(3))))
                    .runTest();
        }
    }
    展开全文
  • Spark测试与普通的程序流程是一样的,稍加设置即可。下面以scalatest为测试工具简单介绍一下Spark测试的写法。

    Spark测试与写普通的程序流程是一样的,稍加设置即可。下面以scalatest为测试工具简单介绍一下Spark测试的写法:

    1. 前置条件:scalatest

    并不是一定要使用scalatest,junit也能用,但是那样就太不Scala了。ScalaTest有点DSL的意思,最开始接触的时候还是让人很难受的,习惯就好,习惯就好,也并没有那么不能接受。

    • 添加依赖
    <dependency>
      <groupId>org.scalatest</groupId>
      <artifactId>scalatest_2.10</artifactId>
      <version>2.2.4</version>
      <scope>test</scope>
    </dependency>
    • 选择测试的样式(Selecting testing styles)
      推荐FlatSpec,这样显得Scala一点。如果实在是有困难可以考虑Funsuite式的,接受起来应该容易一些。下面的例子均是FlatSpec

    • 基本测试模式

    import org.scalatest._
    
    class IPv4Spec extends FlatSpec with Matchers{
      "ipv4" should "retain ip part" in {
        RealtimeTracker.ipv4.findFirstIn("10.201.10.2:4531") should be (Some("10.201.10.2"))
        RealtimeTracker.ipv4.findFirstIn("10.201.10.2") should be (Some("10.201.10.2"))
      }
    }

    文件名记得定义为xxxxSpec,同事说函数式语言里面都这样……

    • 跑测试
      1. IDE: ScalaIDE(Eclipse)与IntelliJ IDEA中均支持直接在IDE中跑测试,点小测试跑单个小测试,点文件跑整个文件的所有测试。
      2. Maven: 需要有scalatest插件支持,具体坐标如下
    <!-- disable surefire -->
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.7</version>
        <configuration>
            <skipTests>true</skipTests>
        </configuration>
    </plugin>
    <!-- enable scalatest -->
    <plugin>
        <groupId>org.scalatest</groupId>
        <artifactId>scalatest-maven-plugin</artifactId>
        <version>1.0</version>
        <configuration>
            <reportsDirectory>${project.build.directory}/surefire-reports</reportsDirectory>
            <junitxml>.</junitxml>
            <filereports>WDF TestSuite.txt</filereports>
        </configuration>
        <executions>
            <execution>
                <id>test</id>
                <goals>
                    <goal>test</goal>
                </goals>
            </execution>
        </executions>
    </plugin>

    2. 利用ScalaTest写Spark测试

    2.1 构造数据

      写MapReduce测试如果不用MRUnit就需要构造小文件,对于Spark来说就有更简单的方法了

      val rdd = sc.parallelize(Seq(1, 2, 3))

    有了这个手工构造的数据集,就可以开始基于RDD做测试了。

    2.2 测试的基础环境

    import org.apache.spark._
    import org.scalatest._
    
    trait SparkSpec extends BeforeAndAfterAll {
      this: Suite =>
    
      private val master = "local[2]"
      private val appName = this.getClass.getSimpleName
    
      private var _sc: SparkContext = _
    
      def sc = _sc
    
      val conf: SparkConf = new SparkConf()
        .setMaster(master)
        .setAppName(appName)
        .set("spark.driver.allowMultipleContexts", "true")
        .set("spark.ui.enabled", "false") // 去掉UI
    
      override def beforeAll(): Unit = {
        super.beforeAll()
        _sc = new SparkContext(conf)
      }
    
      override def afterAll(): Unit = {
        if (_sc != null) {
          _sc.stop()
          _sc = null
        }
        super.afterAll()
      }
    }

    有了这个trait之后,继承下来就可以拥有一个可操作的sc变量(函数),而初始化和扫尾则有trait类来保证。

    2.3 测试案例

    import org.scalatest._
    
    class WordCountSpec extends FlatSpec with SparkSpec with Matchers {
      "words" should "be counted" in {
        val counts = sc.parallelize(Seq("a b c", "a b d"))
          .flatMap(line => line.split("\\s").map(s => (s, 1)))
          .reduceByKey(_ + _)
          .collectAsMap()
    
        counts should contain("a" -> 2)
        counts should contain theSameElementsAs (Map("a" -> 2, "b" -> 2, "c" -> 1, "d" -> 1))
      }
    }

    2.4 Spark其它部件的测试

    在想办法做Spark Streaming的测试的时候找到了mkuthan这个项目,还是不错的。Spark Streaming做测试时需要调整每一个样本进入Stream的时间,在这个项目中做了一些手脚完成了时间的手工控制。同样的,Spark Streaming用于测试之前需要对程序进行 面向测试 的分解,如果main函数写到底是没办法测的。从spark-unit-testint这里可以看出,首先需要做的是对程序进行分解,第一步是完成与Spark无关的功能函数级的测试,第二步是完成RDD相关的函数测试,第三步才是结合Streaming进行测试。一步一步来,看来还真是急不得……

    展开全文
  • 最近做Spark Streaming任务时用到了HBase做中间状态查询和存储,顺手了一些测试,小小总结了一下各部分测试的写法。

    最近做Spark Streaming任务时用到了HBase做中间状态查询和存储,顺手写了一些测试,小小总结了一下各部分测试的写法。话说这里为什么不用redis呢?Redis作为kv存储系统还是太简单了,HBase可以让你少操很多很多心,这里就不跑题了。

      想提笔写的时候搜到了几篇类似的,这还是让我犹豫了一下还要不要再写。不过别人的毕竟是别人的,如果能够引入一些差异,写写就还是有意义的。
    1. How-to: Test HBase Applications Using Popular Tools
    2. CSDN上的翻译:使用常用工具测试HBase应用

    1. HBase和各类测试方法

    1. 利用HBaseTestObj的HBase的Put测试。个人认为没什么用,要检查Put还不如直接检查进入Put之前的内容。
    2. 使用MRUnit来测试MapReduce的HBase表输入输出,这一部分可以参照前一篇的MapReduce测试,本质与1是一致的,就是检查Put对象(取出Put对象中的内容做比较,不要费神去自己构造Put对象了,神烦)。
    3. 使用HBase Mini Cluster的HBaseTestingUtility进行集成测试,网上的介绍是说启动一次需要20-30秒,实测结果是比一般的测试慢不了多少,建议就直接使用这个,简单并且统一,不用专门为了测试而测试。下面的例子都是以HBase Mini Cluster为基础进行的测试。
    4. FakeHBase,没有尝试使用,看起来挺好的。

        一般来说只会使用其中的一种,选一个就好。

    2. 测试用例

    2.1 测试基本环境

    • 引入以下依赖,根据自己的情况进行调整,需要解决掉与原有依赖的冲突(下面的HBase的版本是公司内部版,酌情替换掉吧)
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-common</artifactId>
        <version>2.4.0</version>
        <type>test-jar</type>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.hbase</groupId>
        <artifactId>hbase</artifactId>
        <version>0.94.11</version>
        <type>test-jar</type>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-hdfs</artifactId>
        <version>2.4.0</version>
        <type>test-jar</type>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-hdfs</artifactId>
        <version>2.4.0</version>
        <scope>test</scope>
    </dependency>
    • 测试的before/after单元中HTable的建立与关闭(虽然是Scala代码,但是应该不影响理解)。
    class HBaseTest extends FlatSpec with BeforeAndAfterAll {
      private var utility: HBaseTestingUtility = _
      private var table: HTable = _
    
      override protected def beforeAll(): Unit = {
        super.beforeAll()
        utility = new HBaseTestingUtility()
        utility.startMiniCluster()
        // 建表,分配列族
        table = utility.createTable(
          "ip-profile".getBytes,
          Array(FAMILY_A.getBytes, FAMILY_B.getBytes)
        )
      }
    
      override protected def afterAll(): Unit = {
        super.afterAll()
        table.close()
        utility.shutdownMiniCluster()
      }

    2.2 写测试

      验证一个写入和读出这个一般来说这一步意义不大,因为HBase里面只有一种类型的数据——Bytes。如果使用的是HBase提供的一系列方法

    byte[] Bytes.toBytes(long t);
    byte[] Bytes.toBytes(int t);
    byte[] Bytes.toBytes(byte t);
    byte[] Bytes.toBytes(String t);

    是不会有问题的。需要验证的是在某个逻辑序列之后输出到HBase的结果的验证。但是由于这里使用的是Mini cluster,具体操作上来说与普通的HBase表的put/get/delete并没有差异。需要注意的是HTable的获得不能够再由conf文件创建得到

    HTable hTable = new HTable(conf, "tableName")

      如果之前有直接使用conf来获得表的函数,在这里需要进行拆分成类似于def ipGeographicQuery(hTable: HTable, ...)这样的。要适应测试也是需要对代码进行一些修改的。剩下的就没有什么了,都是普通的操作。下面是一段没有逻辑的代码:

    val put = new Put(key)
    put.add(col.family(), col.qualifier(),  ThriftSerde.serialize(u))
    table.put(put)
    
    val get = new Get(key)
    get.add(col.family(), col.qualifier(), ThriftSerde.serialize(u))
    val rs = table.put(get)
    val thriftObj = new ThriftObj()
    ThriftSerde.deserialize(thriftObj, rs.getValue(col.family(), col.qualifier()))

    基本上意思就是,如果使用mini-cluster就没有什么需要专门为测试特殊处理的地方了。

    展开全文
  • 如何制作专题

    2015-03-23 11:49:25
    1、首先要明确的一点就是我们... 3月8日,爱她,更爱健康的她 清明节为自己一句墓志铭 你的初吻是给了香烟吗(世界无烟日) 成年人也要过儿童节 今天,谁和我一起守护卢沟桥 对爸爸的爱该怎么说出口(父亲节) 拿什么
  • 原标题:数据分析系列篇(6):如何写好一个专题的分析报告感谢关注天善智能,走好数据之路↑↑↑欢迎关注天善智能,我们是专注于商业智能BI,人工智能AI,大数据分析与挖掘领域的垂直社区,学习,问答、求职一站式搞定...
  • 估计很多人会说用[color=#FF0000]{catpos($catid)}[/color],告诉你吧,我试了,不行,因为前提是在专题里用. 当然换了{catpos($specialid)} 也不行,难道v9专题不能用面包屑的功能,非要二次开发吗!晕 这可是最起码...
  • 本篇总结内容如下:     前言     spring mvc实现原理     初始化工作     代码实现   ...上一篇文章...
  • 这是第276篇原创完整导图前两个部分:Python读写csv文件专题教程(1)Python读写csv文件专题教程(2)2.5 时间相关parse_dates如果导入的某些列为时间类型,但是导入时没有为此参数赋值,导入后就不是时间类型,如下:In...
  • 分布式专题如何使用zookeeper实现分布式锁 在分布式中,避免不了使用分布式锁,在前面的专题中,我们已经说过使用Redis实现分布式锁,这里我将给大家演示如何使用zookeeper实现分布式锁。 首先,给大家介绍下实现...
  • 如何写综述

    2009-12-28 09:18:00
    如何写综述综述是对某一方面的专题搜集大量情报资料后经综合分析而写成的一种学术论文, 它是科学文献的一种。 文献综述是反映当前某一领域中某分支学科或重要专题的最新进展、学术见解和建议的它往往能反映出有关...
  • 第275篇原创上篇:Python读写csv文件专题教程(1)2.3 通用解析框架dtype承接前文,test.csv读入后数据框如下:In [6]: df = pd.read_csv('test.csv',sep='\s+') In [7]: df ...
  • 当当 小编闪现必有好事发生对的 增长技能的图书馆讲座来啦这次是什么呢跟随着小编往下看看吧新媒体、小技巧打造高效率——如何利用万方数据好论文主讲人:张晓美时间:2020年10月26日(周一)19:00-19:45讲座形式:...
  • 分析类别:首先需要知道自己报告的类别,如你需要做 昨天的交易分析,...分析流程:数据分析一般都是一次性的,一般都是专题分析报告。提需求的方式,是我们有一个问题需要解决(解释性,探索性,描述性,预测性)。而...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,004
精华内容 401
关键字:

如何写专题