setTimeout 에 파라미터를 넘기는 법

1. string로 만들어 호출하는 법
   setTimeout( fn 및 param에 대한 스트링, 딜레이시간)   

* 기본 호출

    setTimeout("updateTimeout('value')", 5000);

 * 반복 호출

   setTimeout("updateTimeout(0)", 5000);

   function updateTimeout(i) {

       if (i == 100) return;

       $("#updateVal").val(i++);

       setTimeout("updateTimeout('"+i+"')"5000);
   }

       
    
 2. 외부에서 파라미터 전달(전역변수 사용과 큰 차이가 없다)

 for (var i = 1; i < 100; i++) {

          (function(i) {
               setTimeout(function() {
                     $("#updateVal").val(i);
                }, i * 5000);
         }(i));
    }

 
3. setTimeout 을 재구현

   기본적으로 setTimeout  의 3번째 파라미터 부터는 setTimeout에서 호출하는 function 의 파라미터로 전달 된다. 단. IE 를 제외한 다른 브라우져에서는 전달이 가능하다.

즉 아래와 같은 형태가 된다.

  setTimeout(fn, delayTime , param1, param2 ...)  

  fn(param1, param2 ...)
  {
     내부 구현
  }


  IE 에서 이기능을 제공하기 위해서는  setTimeout 을 재구현하여 사용할 수가 있다.

  var orgTimeout = setTimeout;

   window.setTimeout = function() {
      var func, delay;
      func= arguments[0];
      delay= arguments[1];

      if (arguments.length > 2) {
         var arg = Array.prototype.slice.call(arguments, 2);
         return orgTimeout (function() {
                    func.apply(null, arg);
                }, delay);
       } else {
               return orgTimeout (func, delay);
      }
    };
   
    setTimeout(updateTimeout, 5000, 0);   // 호출가능 해짐


'IT > javascript' 카테고리의 다른 글

String fommat 2  (0) 2015.08.03
javascript 의 arguments  (0) 2014.12.03
javascript 에서 string.format 사용  (0) 2014.11.24
yuicommpressor (js /css 압축)  (0) 2014.11.24
setTimeout , setInterval , clearTimeout , clearInterval 사용  (0) 2014.11.22

기본 카운터의 구현은 이전 포스트에서 다른적이 있다. 

 

hadoop 에서는 이미 counter 를 많이 사용하고 있다.

hadoop 에 jar를 올려 실행하면 실행결과 최종에 나오는 값들이 모두 카운터를 통해 구현된 값이다. 

해당 jar 실행시 아래와 같은 최종 결과가 나온다

counter 는 총 43개 이며 해당 카운터에 mapreduce 프로그램이 동작할 사용한 주요 값들을 확인할 수 있다.

대표적으로 map, combine, reduce 에 input 된 record 수와 output된 record 수를 확인 할 수 있있으며, 실행시간 shuffle 된 byte 수도 확인이 가능한다.

이것을 통해 튜닝포인트를 잡을 수가 있게 된다.

 

기본 실행 결과 예시> combiner 를 구현하지 않은 경우

INFO mapreduce.Job: Counters: 43

        File System Counters

                FILE: Number of bytes read=37834707

                FILE: Number of bytes written=76663746

                FILE: Number of read operations=0

                FILE: Number of large read operations=0

                FILE: Number of write operations=0

                HDFS: Number of bytes read=1397535171

                HDFS: Number of bytes written=21

                HDFS: Number of read operations=36

                HDFS: Number of large read operations=0

                HDFS: Number of write operations=2

        Job Counters

                Launched map tasks=11

                Launched reduce tasks=1

                Data-local map tasks=11

                Total time spent by all maps in occupied slots (ms)=88360

                Total time spent by all reduces in occupied slots (ms)=11532

        Map-Reduce Framework

                Map input records=2007594

                Map output records=2007593

                Map output bytes=33819515

                Map output materialized bytes=37834767

                Input split bytes=1474

                Combine input records=0

                Combine output records=0

                Reduce input groups=4

                Reduce shuffle bytes=37834767

                Reduce input records=2007593

                Reduce output records=1

                Spilled Records=4015186

                Shuffled Maps =11

                Failed Shuffles=0

                Merged Map outputs=11

                GC time elapsed (ms)=1029

                CPU time spent (ms)=26570

                Physical memory (bytes) snapshot=10722308096

                Virtual memory (bytes) snapshot=23048646656

                Total committed heap usage (bytes)=12089032704

        Shuffle Errors

                BAD_ID=0

                CONNECTION=0

                IO_ERROR=0

                WRONG_LENGTH=0

                WRONG_MAP=0

                WRONG_REDUCE=0

        File Input Format Counters

                Bytes Read=1397533697

        File Output Format Counters

                Bytes Written=21

위의 결과를 보면 combiner 가 구현되지 않았기 때문에 combine input records 와 output records 가 0 이며,

reduce 에서 shuffle 된 bytes 와 records 수가 매우 높은 것을 알 수 있다.

그에 따라 reduce 에서 해당 값을 처리하기 위해 11532 ms 를 소모했다.

 

아래 결과는 combiner 를 구현한 경우이다.

INFO mapreduce.Job: Counters: 43

        File System Counters

                FILE: Number of bytes read=908

                FILE: Number of bytes written=998468

                FILE: Number of read operations=0

                FILE: Number of large read operations=0

                FILE: Number of write operations=0

                HDFS: Number of bytes read=1397535171

                HDFS: Number of bytes written=21

                HDFS: Number of read operations=36

                HDFS: Number of large read operations=0

                HDFS: Number of write operations=2

        Job Counters

                Launched map tasks=11

                Launched reduce tasks=1

                Data-local map tasks=11

                Total time spent by all maps in occupied slots (ms)=86586

                Total time spent by all reduces in occupied slots (ms)=5220

        Map-Reduce Framework

                Map input records=2007594

                Map output records=2007593

                Map output bytes=33819515

                Map output materialized bytes=968

                Input split bytes=1474

                Combine input records=2007593

                Combine output records=44

                Reduce input groups=4

                Reduce shuffle bytes=968

                Reduce input records=44

                Reduce output records=1

                Spilled Records=88

                Shuffled Maps =11

                Failed Shuffles=0

                Merged Map outputs=11

                GC time elapsed (ms)=1057

                CPU time spent (ms)=24930

                Physical memory (bytes) snapshot=10712588288

                Virtual memory (bytes) snapshot=23029968896

                Total committed heap usage (bytes)=12059148288

        Shuffle Errors

                BAD_ID=0

                CONNECTION=0

                IO_ERROR=0

                WRONG_LENGTH=0

                WRONG_MAP=0

                WRONG_REDUCE=0

        File Input Format Counters

                Bytes Read=1397533697

        File Output Format Counters

                Bytes Written=21

첫번째의 결과와 다른 것은 combiner (각 datanode 에서 동작하여 분산처리됨)의 구현을 통해 reduce 에서 취합되는 데이터의 양을 최소화 시켰다. 즉 combine output 은 44 records 로 줄였으며, 그로 인해 reduce 의 input shuffle 등의 값이 현저하게 주는 것을 확인할 수 있다.

결과를 보면 maps 의 소모시간은 조금 증가하였지만, reduce 의 소모시간은 반으로 준 것을 확인할 수 있다. 

이와 같이 counter 는 개발자의 데이터 공유뿐만 아니라 mapreduce 동작의 기본값을 확인 할 수 있기 때문에 활용도가 매우 높다.

이런 기본 counter 값도 reduce 동작중 획득하여 사용할 수 있다.

mapreduce 프로그래밍을 하면 counter가 필요한 곳은 대부분 reducer 이다

counter 는 job 안에 존재하며,

reducer의 context 가 가진 counter 를 조회한다면 그 값은 mapper 들에서 취합된 값이 아니므로 항상 0 이 나온다

 

따라서, reducer 를 동작중인 job 을 획득하여 counter 를 조회하여야 한다.

보통 reduce 메소드가 돌기전에 획득해 놓고 사용하기 때문에 setup 에서 구현한다.

 

 long totalVal = 0;


 @Override

 public void setup(Context context) throws IOException, InterruptedException{

   Configuration conf = context.getConfiguration();

   Cluster cluster = new Cluster(conf);

  Job currentJob = cluster.getJob(context.getJobID());

  totalCount = currentJob.getCounters().findCounter(MATCH_COUNTER.TOTAL_COUNT).getValue();  }

 

jquery 의 when 은 deferreds 에 대한 처리 이후 실행될 함수를 정의하여 사용한다.
deferreds 란 ?
처리가 바로 완료되지 않는 작업들로 생각하면 된다. 대표적인 ajax 가 이에 포함된다.

기본 사용법
ex>

$.when($.ajax("/when.jsp")).done(function(){

console.log("완료 후 실행");
})


ajax 가 처리된 이후 done 에서 구현거나 참조된 function 이 실행됨

두개의 작업이 모두 처리된 후 수행되기를 원할 경우에는
ex>
$.when( $.ajax("/one.jsp")$.ajax("/two.jsp")).done(function(){
console.log("one, two 처리 후 실행");
});
 
 
해당 deferreds  가 실패시에 처리가 필요할 경우에는
$.when($.ajax("when.jsp")).then(successCallbackFn, errorCallbackFn);
var successCallbackFn = function(){
console.log("성공 처리 후 실행");
};
var errorCallbackFn= function(){
console.log("성공 처리 후 실행");
};
이와 같이 사용할 수 있다


'IT > jquery' 카테고리의 다른 글

[제이쿼리(jQuery)] lesson 5  (0) 2014.11.24
[제이쿼리(jQuery)] lesson 4  (0) 2014.11.24
[제이쿼리(jQuery)] lesson 3  (0) 2014.11.24
[제이쿼리(jQuery)] lesson 2  (0) 2014.11.24
[제이쿼리(jQuery)] lesson 1  (0) 2014.11.24

mapper 는 기본적으로 자신의 데이터노드에서 동작하기 때문에 여러 데이터노드의 경우 서로의 값의 공유할 수가 없다.

그에 때문에 hadoop 에서는 counter 를 통해 서로의 정보를 업데이트하여 reducer 에게 전달할 수 있다.

(단 long에 대한 증가/감소만 가능)

 

카운터의 등록은 enum 으로 등록하여야 하며, 필요한 enum 을 개발자는 생성해야 한다.

 

 아래와 같은 enum 을 생성했다며

 

 public static enum MATCH_COUNTER {

  TOTAL_COUNT

 };

 

  mapper 에서는 아래와 같은 로직을 통해 특정 값을 증가 시킬 수 있다.

  @Override

  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);

             context.getCounter(MATCH_COUNTER.TOTAL_COUNT).increment(1); 

             // counter 증가

       }

  }

 

 

이렇게 증가된 값은 아래와 같이 사용할 수 있다.

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

    Configuration conf = new Configuration();

    Job job = Job.getInstance(conf, "word count");

    .... 중략

    job.waitForCompletion(true)

    long totalCnt = job.getCounters().findCounter(MATCH_COUNTER.TOTAL_COUNT)).getValue();  

     ... 중략

  }

 

 

 

 namenode 1  :  outdata { "a","b","c"} 3개

 namenode 2  :  outdata { "d,"f"} 2개

 

counter 의 값은 5가 된다.

하이브(Hive) 사용시 

jdbc 접속을 위해서는 hive 의 service 를 구동해야 한다.

 

HIVE_PORT=10001 ./hive --service hiveserver 

or

hive --service hiveserver -p 10001

'IT > 빅데이터(bigData)' 카테고리의 다른 글

여러 기능의 맵리듀스를 하나의 jar 로 묶을때  (0) 2014.11.22
Hadoop 의 Counter 이야기  (0) 2014.11.22
Reduce 에서 counter 조회  (0) 2014.11.22
hadoop counter 사용  (0) 2014.11.21
MapReduce 프로그래밍  (0) 2014.11.21

Hadoop 의 기본예제인 WordCount 를 기반으로 설명한다.

프로그래밍은 아래와 같은 4가지 부분에 대하여 작성한다.

 

기본 분산처리된 데이터는 각 네임노드의 mapper 와 combiner 의 context에 저장된 값이 reducer 로 취합되며

reduce 취합시에는 key 로 정렬된다.

 

흐름은 아래와 같다.

 

 Job 등록 및 시작


Mapper

Combiner

shuffle 

Reducer

 최종결과 hdfs에 저장

 

 


Mapper 작성

Mapper를 작성시에는 Mapper <KEYIN,  VALUEIN,  KEYOUT, VALUEOUT> 클래스의 KEYIN, VALUEIN, KEYOUT, VALUEOUT의 4가지를 정의 하여 상속한다.  Map 의 경우에는 KEYIN key, VALUEIN value, Context context  3가지 파라미터로 구현하며, Type 은 클래스에서 정의 한 타입과 동일하게 구현한다.

 public static class TokenizerMapper

       extends Mapper<Object, Text, Text, IntWritable>{

 

    private final static IntWritable one = new IntWritable(1);

    private Text word = new Text();

 

    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);

      }

    }

}

 

 

 

Mapper 구현 부분의 map 함수가 파일을 TextInputFormat 형태로데이터의 한줄(line)씩 읽은 값이 파리미터 Text value 로 받는다이 값을StringTokenizer 를 이용하여 (line)  token 으로 나누고 key-value pair  <word, 1>  Combiner 또는 Reducer 에 전달한다.

 

 

Combiner 작성

Combiner  Reduce 의 동일한 ReduceContext <KEYIN, VALUEIN, KEYOUT, VALUEOUT>를 상속하여 구현한다.

 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();

      }

      result.set(sum);

      context.write(key, result);

    }

  }

 

 

WordCount  combine를 정의하며.  map 의 결과물 (output)  local combiner 에게 전달되어 정렬되고합산되어 Reducer 에 전달된다.

 

 

Reducer 작성

Reduce 의 동일한 ReduceContext <KEYIN, VALUEIN, KEYOUT, VALUEOUT>를 상속하여 구현한다.

 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();

      }

      result.set(sum);

      context.write(key, result);

    }

  }

 

 

 

Reducer 구현 부분의 reduce 함수는 각 key 별로 shuffle되어 같은 값으로 모아진 Iterable<IntWritable> values 를 카운팅하여 해당 Text 값을 key 로 개수를 최종값으로 저장한다.

 

 

Job 등록

위와 같은 방식으로 작성된 Mapper, Combiner, Reducer  Job 으로 등록하여 실행한다.

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

    Configuration conf = new Configuration();

    Job job = Job.getInstance(conf, "word count");

    job.setJarByClass(WordCount.class);

    job.setMapperClass(TokenizerMapper.class);

    job.setCombinerClass(IntSumReducer.class);

    job.setReducerClass(IntSumReducer.class);

    job.setOutputKeyClass(Text.class);

    job.setOutputValueClass(IntWritable.class);

    FileInputFormat.addInputPath(job, new Path(args[0]));

    FileOutputFormat.setOutputPath(job, new Path(args[1]));

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

  }

} 

 

 

run 함수는 input/output 경로나, key-value 의 타입, input/output 의 포맷등을 JobConf 를 통해서 job 의 여러 성질을 정의한다.그리고 JobClient.runJob 을 호출하여 job 을 실행하고 진행상황을 모니터한다.


이 경우에는 combiner 와 reducer 에 같은 클래스를 등록했다. 두 클래스를 다루는 자세한 내용은 이후에 다루도록 하겠다

+ Recent posts