'프로그래밍'에 해당되는 글 100건
- 2019/03/13 용비 Visual Studio Code를 이용한 Maven Project 시작하기
- 2019/03/13 용비 Windows에서 OpenJDK 사용
- 2019/03/11 용비 Java Singleton Class
- 2016/03/21 용비 (Chapter 3) 17. Actions
- 2015/03/27 용비 CentOS 6.4에서 Nginx 1.6.2 설치하기
package com.dev.sampleClass Loading 시점에 Singleton Class Instance가 생성된다. 가장 쉽게 Signleton Class를 생성하는 방법이지만, Client에서 요청이 없을 때에도 항상 생성되므로 불필요한 리소스를 사용하게 된다. 또한 대부분 파일 시스템이나 데이터베이스에 접속하는 경우 Singleton Class를 사용하는데 Exception을 처리할 수 없다.
public class EagerInitSingleton {
private static final EagerInitSingleton = new EagerInitSingleton();
private EagerInitSingleton () {}
public static EagerInitSingleton getInstance() {
return instance;
}
}
package com.dev.sample
public class StaticBlockSingleton {
private static StaticBlockSingleton instance;
private StaticBlockSingleton () {}
static {
try {
instance = new StaticBlockSingleton();
}
catch (Exception e) {
throw new RuntimeException(e.printStackTrace());
}
}
public static StaticBlockSingleton getInstance() {
return instance;
}
}
package com.dev.sampleSingle Thread 환경에서 잘 동작한다. 하지만, 동시에 여러 개의 Thread가 접근할 경우 여러 개의 Instance가 생성될 수 있다. 그런 경우 Singleton Pattern이 깨지고, 서로 다른 Singleton Instance를 사용하게 될 수 있다.
public class LazyInitSingleton {
private static LazyInitSingleton instance;
private LazyInitSingleton() {}
public static LazyInitSingleton getInstance() {
if (instance == null) {
instance = new LazyInitSingleton();
}
return instance;
}
}
package com.dev.samplesynchronized 키워드를 사용하여 한번에 하나의 Thread만 호출할 수 있도록 만들 수 있다. 하지만 모든 Thread의 요청에 대해 synchronized를 실행하므로 성능상 오버헤드가 발생한다.
public class ThreadSafeSingleton {
private static ThreadSafeSingleton instance;
private ThreadSafeSingleton() {}
public static synchronized ThreadSafeSinfleton getInstance() {
if (instance == null) {
instance = new ThreadSafeSingleton();
}
return instance;
}
}
package com.dev.sample위와 같은 Double Checked Locking 원리를 이용하면, 조건을 만족시키는 경우 (instance == null) 한 번만 synchronized block이 실행되므로 하나의 Singleton Class Instance만 생성된다. synchronized로 인한 성능 이슈를 해소할 수 있다.
public class DoubleCheckThreadSafeSingleton {
private static DoubleCheckThreadSafeSingleton instance;
private DoubleCheckThreadSafeSingleton() {}
public static DoubleCheckThreadSafeSingleton getInstance() {
if(instance == null) {
synchronized (DoubleCheckThreadSafeSingleton.class) {
if (instance == null) {
instance = new DoubleCheckThreadSafeSingleton();
}
}
}
return instance;
}
}
package com.dev.samplegetInstance() method를 호출 할 때, SingletonHelper 클래스가 생성되고 Singleton intance는 static final 키워드로 인해 한번만 생성된다. 대부분 <6>번의 경우를 많이 사용한다.
public class HelperSingleton {
private HelperSingleton() {}
private static class SingletonHelper {
private static final HelperSingleton instance = new HelperSingleton();
}
public static HelperSingleton getInstance() {
return SingletonHelper.instance;
}
}
그동안 서로간의 변형을 통해서 어떻게 RDD를 생성하는지를 알아보았다. 하지만, 어떤 경우에는 Dataset을 가지고 직접적으로 어떤 일을 하고 싶을 수도 있다. Action은 RDD operation의 두 번째 형태이다. Action은 driver program에 마지막 값을 되돌려 주거나 외부 storage system에 데이터를 쓰는 작업을 수행한다. Action은 RDD를 호출하는 곳에서 필요로 하는 변형에 대해서 평가하기 때문에 실제적인 ouput을 만들어낼 필요가 있다.
앞의 섹션의 log example에서 계속해서 살펴보자면 badLinesRDD에 대해 어떤 정보를 출력하고 싶을 수도 있다. 그렇게 하기 위해서는 2가지 action을 사용할 수 있다. count()는 숫자를 센 값을 리턴하고, take()는 RDD의 element collection을 리턴한다. 샘플코드는 3-15, 3-17에서 볼 수 있다.
Example 3-15. Python error count using actions
print "Input had " + badLinesRDD.count() + " concerning lines"
print "Here are 10 examples: "
for line in badLinesRDD.take(10):
print line
Example 3-16. Scala rror count using actions
println("Input had " + badLinesRDD.count() + " concerning lines")
println("Here are 10 examples:")
badLinesRDD.take(10).foreach(println)
Example 3-17. Java error count using actions
System.out.println("Input had " + badLinesRDD.count() + " concerning lines")
System.out.println("Here are 10 examples:")
for (String line : badLinesRDD.take(10)) {
System.out.println(line);
}
위의 예제에서, driver program에서 작은 숫자의 RDD element를 추출하기 위해서 take()를 사용했다. Driver에 정보를 출력하기 위해서 반복하여 출력했다. RDD는 전체 RDD를 추출하기 위해서 collect() 함수를 가지고 있다. 만약 프로그램 필터에서 RDD를 아주 작은 크기로 줄여서 내부적으로 다루고자 하는 경우에 유용하게 사용할 수 있다. 다만, 전체 dataset은 collect()를 사용하여 하나의 machine의 메모리 크기에 적합해야 한다는 것을 유념해야 한다. 따라서 collect()는 large dataset을 대상으로는 사용하지 않아야 한다.
대부분의 경우, RDD는 driver에 직접적으로 collect()함수를 사용하여 데이터를 추출할 수 없다. 왜냐하면 dataset이 너무 크기 때문이다. 이러한 경우에는 HDFS나 Amazon S3와 같은 분산 저장환경에 데이터를 쓰는 경우가 일반적이다. 또한 saveAsTextFile() action, saveAsSequenceFile()이나 다양한 내장된 형태로 다른 많은 action을 사용하여 RDD의 내용을 저장할 수 있다. 데이터를 추출하는 다른 option에 대해서는 Chapter 5에서 다룰 것이다.
새로운 action을 매번 호출할 때마다 전체 RDD가 "맨 처음부터"(from scratch) 계산되어야 한다는 것을 아는 것이 중요하다. 이러한 비효율성을 피하기 위해서 44페이지에서 "Persistence (Caching)"으로 다루는 중간 결과를 유지할 수 있다.
최신 stable 버전인 nginx 1.6.2를 설치하려고 다운로드를 받았다.
예전 기억을 되살려서 설치를 해보니 다음과 같은 과정을 거치면 깔끔하게 설치가 끝난다.
root 계정 로그인
Terminal 실행
> yum -y install gcc-c++
> yum -y install pcre* openssl* zlib*
> ./configure
--prefix=/home/userid/nginx
--sbin-path=/home/userid/nginx/nginx
--conf-path=/home/userid/nginx/nginx.conf
--pid-path=/home/userid/nginx/nginx.pid
서버 실행
> nginx -s [start | stop | restart | reload]
댓글을 달아 주세요
댓글 RSS 주소 : http://www.yongbi.net/rss/comment/838