Intellij 기본 vm 설정은 턱없이 낮다.



[~/Library/Preferences/IntelliJIdea2018.1] cat idea.vmoptions



-Xms100m

-Xmx750m

-XX:ReservedCodeCacheSize=240m

-XX:+UseCompressedOops

-Dfile.encoding=UTF-8

-XX:+UseConcMarkSweepGC

-XX:SoftRefLRUPolicyMSPerMB=50

-ea

-Dsun.io.useCanonCaches=false

-Djava.net.preferIPv4Stack=true

-XX:+HeapDumpOnOutOfMemoryError

-XX:-OmitStackTraceInFastThrow

-Xverify:none


-XX:ErrorFile=$USER_HOME/java_error_in_idea_%p.log

-XX:HeapDumpPath=$USER_HOME/java_error_in_idea.hprof

-Xbootclasspath/a:../lib/boot.jar




->

 

Intellij 설치하면 바로 jvm 메모리 설정을 변경할 것!!


-Xms1024m

-Xmx6144m

-XX:ReservedCodeCacheSize=240m

XX:+UseCompressedOops

-Dfile.encoding=UTF-8

-XX:+UseConcMarkSweepGC

-XX:SoftRefLRUPolicyMSPerMB=50

-ea

-Dsun.io.useCanonCaches=false

-Djava.net.preferIPv4Stack=true

-XX:+HeapDumpOnOutOfMemoryError

-XX:-OmitStackTraceInFastThrow

-Xverify:none


-XX:ErrorFile=$USER_HOME/java_error_in_idea_%p.log

-XX:HeapDumpPath=$USER_HOME/java_error_in_idea.hprof

-Xbootclasspath/a:../lib/boot.jar



Posted by '김용환'
,





2017년 우버에서 자기들이 사용하는 hoodie를 공유했다.


https://eng.uber.com/hoodie/





이게 개념적으로 kappa 아키텍처 (보통 우리가 쓰는 lamba 아키텍처의 다음 버전, incremtal )으로

HDFS에 metadata, index, data를 Spark 라이브러리로 구현한 오픈 소스(https://github.com/uber/hudi)이다.


스키마 이슈를 풀기 위해 avro를 사용하고 컬럼 기반의 최적화된 성능을 보장하기 위해 parquet를 사용다. 읽을 때는 컬럼 단위로 읽으니 Scan에 최적화된 Parquet, 저장할 때는 스키마 이슈없고 row단위로 저장하는 Avro를 사용한다. 컴파일 병렬화, 쿼리 병렬화, HDFS의 파일 이슈(쿼터)를 해결하기 위해 HDFS 블록 크기로 저장한다.


저장할 때 데이터를 정확히 partition 단위로 저장하고, HDFS 블록 크기만큼 채워서 저장한다. 그런식으로 계속 저장한다. 데이터의 변경은 bloom filter로 미리 저장한 위치를 빨리 찾도록 변경된 데이터를 추가하는 방식을 사용하고 있다. 


compaction은 시간제한이 걸려 있고 몇 분마다 비동기로 진행한다. 이때 compaction과 변경이 걸리면 이슈가 되니 lock을 zookeeper로 걸어 사용한다. 




유투브 발표 자료.








그리고 2018년 7월에 하나의 블로그를 올려놨다.

https://eng.uber.com/uber-big-data-platform/


나름 kappa 아키텍처 기반임에 틀림없다. 





중요한 포인트는 증분 데이터를 append함으로서 최종 값과 증분 값 모두 읽을 수 있다는 점이다. 





Posted by '김용환'
,



flask 코드에서 post 바디에 있는 json을 출력하는 코드이다.



요청의 헤더가 content-type:text/html이라면 아래 코드에서 request.get_json()의 값은 None이 된다.





from flask import Flask, request
import json
app = Flask(__name__)

@app.route("/", methods=['GET', 'POST'])
def hello():
maybe_json = request.get_json(silent=True, cache=False)
if maybe_json:
thejson = json.dumps(maybe_json)
else:
thejson = "no json"
print(thejson)
return "good job"



요청 헤더를 json으로 수정하거나 서버 코드를 아래과 같이 get_json(force=True)를 추가하면 잘 동작한다.





from flask import Flask, request
import json
app = Flask(__name__)

@app.route("/", methods=['GET', 'POST'])
def hello():
maybe_json = request.get_json(silent=True, cache=False, force=True)
if maybe_json:
thejson = json.dumps(maybe_json)
else:
thejson = "no json"
print(thejson)
return "good job"


Posted by '김용환'
,