프로그래밍/Hadoop ETC 2017. 3. 22. 09:06

1) Submit job:
$ oozie job -oozie htp://localhost:11000/oozie -config oozieProject/workflowHdfsAndEmailActions/job.properties -submit job: 0000001-130712212133144-oozie-oozi-W
 
2) Run job:
$ oozie job -oozie htp://localhost:11000/oozie -start 0000001-130712212133144-oozie-oozi-W
 
3) Check the status:
$ oozie job -oozie htp://localhost:11000/oozie -info 0000001-130712212133144-oozie-oozi-W
 
4) Suspend workflow:
$ oozie job -oozie htp://localhost:11000/oozie -suspend 0000001-130712212133144-oozie-oozi-W
 
5) Resume workflow:
$ oozie job -oozie htp://localhost:11000/oozie -resume 0000001-130712212133144-oozie-oozi-W
 
6) Re-run workflow:
$ oozie job -oozie htp://localhost:11000/oozie -config oozieProject/workflowHdfsAndEmailActions/job.properties -rerun 0000001-130712212133144-oozie-oozi-W
 
7) Should you need to kill the job:
$ oozie job -oozie htp://localhost:11000/oozie -kill 0000001-130712212133144-oozie-oozi-W
 
8) View server logs:
$ oozie job -oozie htp://localhost:11000/oozie -logs 0000001-130712212133144-oozie-oozi-W
 
Logs are available at:
/var/log/oozie on the Oozie server.

//
프로그래밍/ElasticSearch 2016. 8. 30. 08:52
Elasticsearch 의 Decay function 들을 사용해보고 그 과정들을 기록해보고자 한다.
Elasticsearch에서 검색을 하다보면 일반 수치 필드에 대한 scoring 이 필요할 때가 있다. 예를 들면 유투브의 VIEW 수에 따라 높을수록 High score 를 갖게 하는 것이다. 물론 sort 쿼리로 view수를 내림차순으로 하게 할 수도 있지만, 다른 필드와의 복합적인 연산이 어려워진다.
그래서 Elasticsearch 에서 제공하는 decay_function들을 사용할 필요가 생기게 된다. decay_function 을 이용하여 수치적(numerical) 필드에 대한 nomalized scoring을 할 수 있다.
Elastic공식 문서에서 보게 되면 본 목적은 지리적 거리(geographic) 혹은 수치적 데이터에서 검색하려는 수치 인근의 데이터를 높은 순위로 검색하게 하기 위함이다. 또한 0~1 까지로 nomalize score 를 내어주기 때문에 다른 쿼리들과 같이 사용하여 복합 score 를 만들어내기도 좋다. 아래는 그 예시이다.
function_score": {

"DECAY_FUNCTION": {
    "FIELD_NAME": {
          "origin": "11, 12",
          "scale": "2km",
          "offset": "0km",
          "decay": 0.33
    }
}


//
프로그래밍 2016. 7. 7. 11:34

sudo apt-get install libmysqlclient-dev


'프로그래밍' 카테고리의 다른 글

git 변경된 파일 무시하기.  (0) 2016.07.04
Java 메모리 관리(스택프레임)  (1) 2016.06.05
유니코드와 인코딩에 대하여  (0) 2016.06.04
strategy pattern(전략 패턴)  (0) 2016.05.29
templete method 패턴  (0) 2016.05.29
//
프로그래밍 2016. 7. 4. 15:17

웹서버에서 로그파일같은게 계속 걸릴때, 

 git update-index --assume-unchanged ./logs/*

'프로그래밍' 카테고리의 다른 글

pip install mysql-python 실패시에  (0) 2016.07.07
Java 메모리 관리(스택프레임)  (1) 2016.06.05
유니코드와 인코딩에 대하여  (0) 2016.06.04
strategy pattern(전략 패턴)  (0) 2016.05.29
templete method 패턴  (0) 2016.05.29
//
프로그래밍 2016. 6. 5. 17:44
자바 메모리 할당 및 관리에 대하여 궁금하여 몇개의 블로그 및 책을 참조하여 정리해본다.

물론 GC까지 하면 좋겠지만... 그렇지는 않고 언어레벨에서의 컨셉정도로 정리해보고자 한다.

자바의 메모리는 3개의 구역으로 나눠볼 수 있다. 스태틱(메소드), 스택, 힙

정리를 해보면

1. 객체의 인스턴스는 힙 영역에 생성.

2. 로직에 모든 클래스와 import 패키지들을 스태틱 영역에 위치시킨다. static 변수 메소드도 위치한다.

3. 각종 파라미터, 메소드내에 지역변수들은 모두 스택영역에서 생겼다가 사라진다.(프레임 단위의 관리를 한다.)

4. 콜 스택 관리를 한다. one() -> two() -> three()  순으로 함수가 호출 되었다면 three가 종료될 때까지 two는 대기 하다가 상위 메소드가 끝나고 계속 진행된다.  리턴이 있다면 아래 스택프레임(two)에 전달이 되고, three() 메소드에 대해 할당되었던 스택프레임은 삭제된다.

5. 물론 변수 scope의 원리에서 알 수 있듯이 스택프레임 외부에서 접근 할 수 없다.

'프로그래밍' 카테고리의 다른 글

pip install mysql-python 실패시에  (0) 2016.07.07
git 변경된 파일 무시하기.  (0) 2016.07.04
유니코드와 인코딩에 대하여  (0) 2016.06.04
strategy pattern(전략 패턴)  (0) 2016.05.29
templete method 패턴  (0) 2016.05.29
//
프로그래밍 2016. 6. 4. 23:08

API 몇개를 만들던 중 문자열이 심심치 않게 깨지는(euc-kr -> utf-8)  그리고 기타 특수문자들의 전송에 있어서 json 디코딩이 안되는 이런 뭐 몇가지 문제를 겪다가 기본 인코딩 원리 및 정확한 처리 방법을  알 필요가 있다고 생각하며 정리해본다.  

결국 바이트?비트? 전송을 어떤 크기로 잘라서 읽어 들여 특정 맵핑(표준 정의)에 맞추어 본다고 정리 할 수 있을듯 하다.(나만의 정리)

크게 본다면 문자를 표현하는것은 아스키를 처음으로 시작된다. 0x00 ~ 0xff 까지 255개의 문자를 정의한다. 

여기서 중요하게 생각해볼 것은 한글과 그것의 인코딩이다. 위에서 말한 아스키는 한글을 표현하기에 부족하다. 보통 중국,한국,일어에 사용되기 위해서는 더 큰 범위의 처리 방법이 필요한 것이다.

그렇다면 한글은 어떻게 표현되는것인가? 크게 조합형과 완성형으로 나누며, N바이트 완성형/조합형 식으로 나누어 볼 수 있다. 조합형이란 한글의 초/중/종성(19,21,28)에 각 코드를 부여하고 조합(11172개)하여 표현하게  하는 것이다. 그에 반해 완성형은 지금 쓰고 있는 글자 처럼 완성된 글자에 코드를 부여하는 방식이다. 

2바이트 조합형/완성형을 알아보면 

조합형에서는 초/중/종성에 각 5bit를 할당하여 맵핑하고, 처음 1bit(msb)는 1로 마킹하여 한글임을 표시하였다. 

완성형은 각 음절을 코드와 1:1 맵핑시킨 것이다. ISO 2022 표준을 기준으로 하였으며, 이것은 0xA1A1 ~ 0xFEFE(8836개)를 사용하였다. 하지만 한자에 4888, 러시아 1598을 사용하여 한글에는 2350개 밖에 사용되지 않았다. 그래서 몇개의 문자를 표현할 수 없었다. 그러다가 MS가 추가 재정하여 나머지 8822자를 추가하였다. 통합형 한글 코드, 확장 완성형이라고 한다.

이제 유니코드ㄱㅏ 나올 때이다. 중어, 일어등을 표현하기 위해서는 EUR-JP, EUC-CN 뭐 등등의 인코딩이 쓰인다. 하지만 우리는 이것들을 모두 사용하는 문서들을 표현해야한다. 어떻게 모든 문자를 표현하게 할가? 기존의 한가지 글자에 대한 표현방식을 사용할 수 없어, 나온 것이 유니코드이다. 이 모든것을 모아서 만들어낸것이다.  한글 11172 문자가 모두 표현가능하다.

유니코드에서는 코드포인트라는 것을 사용한다. A의 유니코드값은 U+0041로 표현한다. 31bit문자 집합이며, 현재까지 21bit내에서 다 표현이 가능하다고 한다. 

한글은 u+1100 ~ u+11FF사이에 한글 자모, u+AC00 ~ u+D7AF 사이의 한글 소리 마디 영역에 표현되어 있다.

유니코드의 인코딩 방식(utf-8)을 알아보자. 

U+0000~U+007F

 7

그대로 인코딩

U+0080~U+07FF

11         

110xxxxx 10xxxxxx

U+0800~U+FFFF

16

1110xxxx 10xxxxxx 10xxxxxx

U+10000~U+1FFFFF    

21

11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

문자를 2진수로 표현 후 xxx부분에 기존 비트값을 넣어준다. 

"한글" 을 코드 포인트로 보면 U+D55C U+AE00인데, 이를 UTF-8 인코딩하면, 0xED 0x95 0x9C 0xEA 0xB8 0x80이 된다.

그리고 한글의 범위는 AC00 ~ D7AF 이므로 한글은 3바이트 인코딩으로 다 가능하게 된다.




'프로그래밍' 카테고리의 다른 글

git 변경된 파일 무시하기.  (0) 2016.07.04
Java 메모리 관리(스택프레임)  (1) 2016.06.05
strategy pattern(전략 패턴)  (0) 2016.05.29
templete method 패턴  (0) 2016.05.29
git fetch from remote  (0) 2016.04.07
//
프로그래밍 2016. 5. 29. 17:42
이전 포스트 ("http://smile2x.tistory.com/entry/templete-method-%ED%8C%A8%ED%84%B4-2") 에 이은 내용이다.
이번 내용은 스트레티지 패턴인데, 다른 점은 각 객체가 갖어야 할 다른 행동을 갖은 객체로 빼는 것이다.
아래서 주입이라는 단어를 사용하는데, 객체생성할 때 전략객체를 파라미터로 전달하는 것으로 알면 된다. 세가지의 협동? 으로 이루어지는데,
1. 각자 다른 전략(행동) 메소드를 갖는 전략(strategy) 객체
2. 전략 객체를 사용하는 객체 소비자(사용 클래스)
3. 전략 객체를 만들고, 사용객체에 주입하는 클라이언트

흐름 :
행동(전략)을 추상화 하는 interface 를 두고, 사용할 전략(strategy) 객체를 만들때 인터페이스를 통해 객체를 만들게 된다.
해당 interface를 구현하는 구현체(전략 클래스)들을 만든다.
해당 전략객체(인터페이스로 만들어진)를 사용(injection) 하여 객체를 사용한다.
전략행동의 인터페이스 를 만든다.
public interface Strategy {
	public abstract void runStrategy();

}
각 용도별 해당 인터페이스의 구현체를 만들어준다.
public class StrategyGun implements Strategy{
	public void runStrategy() {
		// TODO Auto-generated method stub
		System.out.println("빵빵, 총");		
	}

}

public class StrategySword implements Strategy{

	public void runStrategy() {
		// TODO Auto-generated method stub
		System.out.println("칼칼칼");		
	}

}
만들어진 전략을 사용하는 사용자 클래스를 만든다. interface class의 타입(Strategy) 으로 선언하고 나중에 파라미터는 구현체 타입의 instance 를 전달한다.
public class Soldier {
	public void run(Strategy strategy){
		strategy.runStrategy();
	}

}
아래는 실제 전략을 만들고 컨텍스트(사용클래스에) 주입하는 코드. new StrategyGun() 으로 생성하고, 해당 Strategy를 run 메소드에 주입하고 있다. 이렇게 함으로써 soldier 클래스 행동의 중복을 피하고, 앞으로 추가되는 무기류에 대해 Strategy의 구현체를 만들어주기만 하면 대응이 가능하도록 된 것이다.
 public class client {
	public static void main(String [] args){
		Strategy strategy = null;
		Soldier soldier = new Soldier();
		
		strategy = new StrategyGun();
		soldier.run(strategy);
		
		strategy  = new StrategySword();
		soldier.run(strategy);		
	}

}

'프로그래밍' 카테고리의 다른 글

Java 메모리 관리(스택프레임)  (1) 2016.06.05
유니코드와 인코딩에 대하여  (0) 2016.06.04
templete method 패턴  (0) 2016.05.29
git fetch from remote  (0) 2016.04.07
특정 주기로 로그 삭제  (0) 2016.01.05
//
프로그래밍 2016. 5. 29. 17:37
oop의 개념정도로 비즈니스 로직을 자주 코드 했는데, 디자인 패턴등의 책을 보고 적용해보고, 대략 비슷하면서도 정확히 집고 넘어가야할 내용이라고 생각들어 그 중 하나인 템플릿메소드 패턴, 스트레티지, 탬플릿 콜백 패턴에 대해서 쓰임새, 어디에 쓰면 좋을지 등을 생각해보고 정리하고자 한다.
큰 목적은 클래스간의 결합도를 낮추고, 기능응집도를 높이기 위한 작업들이다. 더 풀어 이야기 해보면 클래스간 의존도(특정 클래스의 인스턴스를 만들고 작동하기 위해서 여기저기 클래스들이 얽혀 있게되는 것)을 줄이는 것이다.
이렇게 함으로써 추후 변경되는 사항(요구사항은 언제든 바뀔 수 있기 때문에) 에 최소한의 비용(시간, human resource)를 들임으로써 수정에 용이성을 더할 수 있겠다.
이전에는 추상화를 위한 클래스를 여럿 만듦으로써 메모리등의 성능적인 측면에 의심이 많이 들었는데, 이런 작은 비용때문에 추후 유지관리에 힘들게 된다면 더 손실이 크다고 볼 수 있다. (이것은 자바의 메모리 할당과정을 보면서 조금 안심? 하게 되었는데, 추후 자바의 메모리 구조에 대해 더 포스팅하면서 정리해보도록 하겠다.) 아래는 탬플릿 메소드 패턴이다. 모 클래스( 해당 객체의 행동을 결정하는 행동 함수들을 모두 모아 놓고, 하위 상속객체에서 특정 행동 메소드를 오버라이드 하여 각 파생 클래스의 행동을 다시 만들어줄 수 있다. 행동 프레임?은 같지만 행동의 모양? 특성?이 다를 때 이용할 수 있겠다. 동물이 태어나고 울음 행동을 한다는 흐름은 같은데, 각 동물들의 울음소리가 다르다. 최상위 클래스 animal을 두고 dog, cat이 해당 메소드를 오버라이드 하여 울음 소리가 다르게 된다.
public abstract class Animal {
	public void play(){
		System.out.println("come on");
		playOut();
		runSomething();
		System.out.println("good");
	}
	public abstract void playOut();
	
	void runSomething(){
		System.out.println("HI HI");
	}
}
public class Cat extends Animal{
	@Override
	public void playOut() {
		System.out.println("miya~ miya~");
	}
	@Override
	public void runSomething(){
		System.out.println("고양이 HI HI");
	}
}
public class Dog extends Animal{
	@Override
	public void runSomething(){
		System.out.println("개 HI HI");
	}

	@Override
	public void playOut() {
		// TODO Auto-generated method stub
		System.out.println("wow wow");	
	}
}
public class main {
	public static void main(String[] args) {
		Animal a1 = new Dog();
		Animal a2 = new Cat();
		
		a1.play();
		
		a2.play();
	}
}
즉 정리하면 상위 클래싀의 메소드에서 하위 클래스가 오버라이딩한 메소드를 호출하는 내용이라고 할 수 있겠다.

'프로그래밍' 카테고리의 다른 글

유니코드와 인코딩에 대하여  (0) 2016.06.04
strategy pattern(전략 패턴)  (0) 2016.05.29
git fetch from remote  (0) 2016.04.07
특정 주기로 로그 삭제  (0) 2016.01.05
scrapy 설치 오류  (0) 2015.12.22
//
프로그래밍/Hadoop ETC 2016. 5. 10. 14:17
hadoop fs -getmerge /output/dir/on/hdfs/ /desired/local/output/file.txt


//
프로그래밍 2016. 4. 7. 11:30
git fetch <remote> <rbranch>:<lbranch> 
git checkout <lbranch>


'프로그래밍' 카테고리의 다른 글

strategy pattern(전략 패턴)  (0) 2016.05.29
templete method 패턴  (0) 2016.05.29
특정 주기로 로그 삭제  (0) 2016.01.05
scrapy 설치 오류  (0) 2015.12.22
vi에서 여러줄 주석처리 & 삭제  (0) 2015.10.01
//