2016년 12월 6일 화요일

G1 GC

G1 GC는 Generational GC의 단점을 보완한다!

-> CMS GC를 대체하기 위한 Low-Pause & Concurrent Garbage Collector 임.
-> Stop-The-World에 의한 Pause Time을 예측할 수 있음(Soft Real-Time)
-> Compaction을 동반하므로, Fragmentation을 줄일 수 있음
-> 세대별(Generational)로 객체를 관리하며 Parallel/Concurrent 수행방식은 기존의 Collector아 비슷하나, Young영역과 Old영역의 구분을 특정하지 않는 일정한 크기의 Region으로 관리됨

주요 point :
*예측
*Compaction

- - - - - - - - - -
단계 :

Evacuation Pause : Minor GC와 동일한 작업으로, Young 영역을 G 한다. (STW 발생)
Concurrent Cycle : Old 영역을 GC하기 위한 사전 단계로, live 객체를 Marking 한다.
Mixed GC : Old 영역에 대한 GC를 마무리하는 단계로, Young 영역과 Old 영역을 동시에 GC한다.


- - - - - - - - - -
Evacuation Pause
 - 대부분의 단계가 Parallel로 수행
 - STW 발생

Ext Root Scanning : 각 GC Thread들이 Global, Register, Thread stack 등에서 root 노드 검색
Update RS : Remembered Set* 정보를 갱신
Scan RS : 업데이트 된 remembered Set 정보를 기반으로 Reference를 가진 객체들를 탐색
Object Copy : Scan RS에서 탐색한 객체들을 다른 Region으로 복사. Eden -> Survivor , Survivior -> Old
Termination : 종료 Thread가 다른 Thread 들의..

*용어설명
*Remembered Set : 해당 Region내의 각체로 Refernece하는 객체들의 목록
*Collection Set : GC시 수집될 Region들의 목록

- - - - - - - - - -
Concurrent Cycle
 - IHOP에서 지정한 수치가 넘어가면 Trigger됨.
 - initial-mark 이후 수행됨 (initial-mark는 Young GC시 함께 수행)

Root Region Scan
Concurrent mark
Remark
Cleanup : Region 내 살아있는 객체 정보를 갱신하고, Empty region을 식별(STW 발생)
Concurrent Cleanup : Empty Region을 Reset하고, 미사용 영역에 추가함(Empty Region이 없으면 Skip)

*용어설명
*IHOP(InitiatingHeapOccupancyPercent) : Heap이 일정 비율만큼 차지하면 Marking을 수행하도록 하는 옵션. 기본값은 45(%)

- - - - - - - - - -
Mixed GC
 - Evacuation Pause(Young GC)와 동일
 - Young 영역과 Old 영역이 동시에 수집됨
 - 여러 번으로 나누어 수행됨
 - STW 발생
(살아있는 객체가 적은 Young/Old 영역들이 GC 및 Compaction의 대상이 됨(GC 목표시간/빈도 반영)

Ext Root Scanning
Update RS
Scan RS
Object Copy
Termination

- - - - - - - - - -
G1 GC를 요약하면 다음과 같다 !
 - JAVA 1.7부터 정식 지원
 - 여러개의 영역(Region)으로 나누어 관리되며, 각 영역의 역할(Eden/Young/Old)은 쉽게 변경이 가능
 - MinorGC는 Evacuation Pause로 수행, MajorGC는 최대한 Application과 동시에 수행할 수 있도록 Concurrent Cycle과 Mixed GC(Evacuation Pause)로 구부하여 수행됨
 - 각 Region에는 살아있는 객체 정보를 가지고 있으며, 이것을 바탕으로 먼저 Garbage 되어야 하는 Region을 결정
 - GC 수행 시 Compaction을 수행함으로 인해 Fragmentation을 줄여 연속된 메모리 할당에 효율적
 - 객체 크기가 Region의 1/2보다 큰 경우, humongous 영역으로 관리

장점 !
 - 상대적으로 GC 성능 우수
 - 수행시간 예측 가능, STW 지속시간을 줄일 수 있음
 - FullGC 지속시간 및 빈도를 줄일 수 있음

- - - - - - - - - -


2016년 7월 25일 월요일

dfs 알고리즘 : NQueen


package N_Queen;

import java.util.Scanner;

public class source {
static int n;
static int arr[][] = new int[15][15];
static boolean chk[] = new boolean[15];
public static void main(String[] args){

Scanner sc = new Scanner(System.in);
n = sc.nextInt();
System.out.println(back(1));
}
static int back(int k){
if (k==n+1) return 1;
int total=0;
for (int i=1;i<=n; i++){
if(chk[i]) continue;
boolean impossible = false;
for(int j=1; j<k; j++){
if (i-j>0 && arr[k-j][i-j]==1) impossible = true;
if (i+j<=n && arr[k-j][i+j]==1) impossible = true;
}
if(impossible) continue;
arr[k][i] = 1;
chk[i] = true;
total += back(k+1);
arr[k][i] = 0;
chk[i] = false;
}
return total;
}
}

2016년 2월 5일 금요일

composite key in hive with hbase

CREATE TABLE hbase_table_3(key string, value2 int)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES (
"hbase.columns.mapping" = ":key,a:b"
);


INSERT OVERWRITE TABLE hbase_table_3
SELECT coalesce(concat(stock_symbol,'-',year(trade_date)),'NULL'), count(*)
FROM stock_trade
group by coalesce(concat(stock_symbol,'-',year(trade_date)),'NULL');

2016년 1월 16일 토요일

Fitbit REST API : Getting an access_token

After Obtaining User's Consent,
Fitbit.com will redirect to your server.

This is a code for the server.

I'll store access_token and refresh_token.




@RequestMapping(value="/restTest", method=RequestMethod.GET)
public String restTest(@RequestParam(value="code", required=false) String code) {
    StringBuilder sb = new StringBuilder();
    if(code!=null) {
        HttpClient httpclient = HttpClients.createDefault();
        HttpPost httpPost = new HttpPost(REST_URL_TO_GET_TOKEN);
        httpPost.setHeader("Authorization",AUTH_APPID_APPSECRET);
        List<NameValuePair> nvps = new ArrayList<NameValuePair>();
        nvps.add(new BasicNameValuePair("client_id", CLIENT_ID));
        nvps.add(new BasicNameValuePair("grant_type", "authorization_code"));
        nvps.add(new BasicNameValuePair("redirect_uri", REDIRECT_URL));
        nvps.add(new BasicNameValuePair("code", code));
        StringBuilder contentSb = new StringBuilder();
        try {
            httpPost.setEntity(new UrlEncodedFormEntity(nvps));
            HttpResponse response = httpclient.execute(httpPost);
            HttpEntity resEntity = response.getEntity();
            if (resEntity != null) {
                BufferedReader rd = new BufferedReader(new InputStreamReader(
                        response.getEntity().getContent()));
                String line = null;
                while ((line = rd.readLine()) != null) {
                    contentSb.append(line);
                }
            }
            httpPost.abort();
        } catch (Exception e) {
            sb.append("Exception::" + e.getStackTrace().toString());
        }
        sb.append(contentSb.toString());

    } //if(code!=null)
    return sb.toString();
}




Authorization Header Example

This example assumes that the code URI parameter value in the callback URI was 1234567890.
POST https://api.fitbit.com/oauth2/token
Authorization: Basic Y2xpZW50X2lkOmNsaWVudCBzZWNyZXQ=
Content-Type: application/x-www-form-urlencoded

client_id=22942C&grant_type=authorization_code&redirect_uri=http%3A%2F%2Fexample.com%2Fcallback&code=1234567890
Example Response:
{
    "access_token": "eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE0MzAzNDM3MzUsInNjb3BlcyI6Indwcm8gd2xvYyB3bnV0IHdzbGUgd3NldCB3aHIgd3dlaSB3YWN0IHdzb2MiLCJzdWIiOiJBQkNERUYiLCJhdWQiOiJJSktMTU4iLCJpc3MiOiJGaXRiaXQiLCJ0eXAiOiJhY2Nlc3NfdG9rZW4iLCJpYXQiOjE0MzAzNDAxMzV9.z0VHrIEzjsBnjiNMBey6wtu26yHTnSWz_qlqoEpUlpc",
    "expires_in": 3600,
    "refresh_token": "c643a63c072f0f05478e9d18b991db80ef6061e4f8e6c822d83fed53e5fafdd7",
    "token_type": "Bearer",
    "user_id": "26FWFL"
}


2015년 12월 4일 금요일

카산드라에서 하둡으로



SSTable에 대한 이해(cassandra)
http://bcho.tistory.com/657


aeigisthus 참고

NETFILX Tech blod 내용 (2012.2)
http://techblog.netflix.com/2012/02/aegisthus-bulk-data-pipeline-out-of.html


--> rdb와 hdfs간의 데이터 이동은 여간해선 sqoop으로 해결.

hadoop install on my centos7

http://javaworld.tistory.com/77