반응형


Hive external table을 생성하게 되면 테이블을 drop시키더라도 하둡에는 데이터가 남게 되는데요.


이런 이유로 같은 이름으로 테이블을 재생성했을 경우 기존의 데이터가 그대로 들어있는 것을 보실 수 있습니다.


그래서 hdfs명령으로 하둡데이터를 삭제하고 싶은데 권한 문제로 삭제되지 않습니다...


rmr: DEPRECATED: Please use 'rm -r' instead.

rmr: Failed to move to trash: hdfs://server-txa001.svr.maker.net:8020/user/hive/warehouse/oasis.db/specific_pub_and_area: Permission denied by sticky bit setting: user=irteam, inode=specific_pub_and_area

Command failed with exit code = 1


따라서 external 테이블은 drop시키기 전에 alter명령어로  테이블의 external속성을 변경해주고 drop시켜주어야 합니다.


먼저 desc formatted 테이블명 으로 데이터가 하둡어디에 저장되어있는지 확인합니다.


[server-txa001.svr.maker.net: 8020] > desc formatted specific_pub_and_area;

Query: describe formatted specific_pub_and_area



보시면 Location이 하둡에 저장된 데이터 경로입니다.

해당 Table Parameters를 보시면 EXTERNAL옵션이 TRUE로 되어 있는 것을 보실 수 있습니다.


이 상태에서는 아무리 테이블을 drop시켜도 데이터가 남아있게 됩니다.

따라서 alter table specific_pub_and_area set tblproperties('EXTERNAL'='FALSE'); 명령어로 옵션을 변경해주셔야 합니다.


이렇게 변경하고 desc formatted 테이블명 명령어로 보시면 EXTERNAL옵션이 FALSE로 변경된 걸 확인하실 수 있습니다.


이 상태에서 drop table {테이블명} 을 해주시게 되면 하둡에 있는 데이터들도 삭제되는 것을 확인 하실 수 있습니다.

반응형
반응형

최근 SUPERSET(슈퍼셋)작업을 진행 중 impala(임팔라)를 사용하면서 경험했던 내용에 대해 정리해보려고 한다.


impala(임팔라)와 hive(하이브)는 hive metastore(하이브 메타스토어)를 공유하며 impala는 metatdata를 캐시를 해서 관리하기때문에 빠른 성능을 보여주지만 hive에 의해서 메타데이터가 변경되었을 때 해당 캐시를 리프레쉬해주는 invalidate metadat명령이나 refresh명령어를 사용해서 캐시를 갱신해주어야 한다.

 When you create a table, load data, and so on through Hive, you do need to issue REFRESH or INVALIDATE METADATA on an Impala node before executing a query there.
The REFRESH and INVALIDATE METADATA statements are not needed when the CREATE TABLE,INSERT, or other table-changing or data-changing operation is performed through Impala.
These statements are still needed if such operations are done through Hive or by manipulating data files directly in HDFS, but in those cases the statements only need to be issued on one Impala node
rather than on all nodes. See REFRESH Statement and INVALIDATE METADATA Statement for the latest usage information for those statements.

By default, the metadata loading and caching on startup happens asynchronously, so Impala can begin accepting requests promptly. 

참고 : Components of the Impala Server



hive shell(하이브쉘)에서 다음과 같은 테이블이 있다.

hive> show tables;
OK
acedmp_custom
specific_pub_and_area3
test_table

hive shell에서 보면 specific_pub_and_area 테이블이 없다. drop시켰기 때문 (이전에 있었는데 drop시킨후 show tables 명령어)

but impala shell로 접근해서 보면 hive에서 spcific_pub_and_area테이블을 드랍시켰음에도 불구하고 테이블이 나타난다...

[svr.maker.net:21000] > show tables;
Query: show tables
+------------------------+
| name                   |
+------------------------+
| specific_pub_and_area  |
| specific_pub_and_area3 |
| test_table             |
+------------------------+



그래서 drop시켜보려고 하면 이미 hive metastore에는 존재하지 않는다고 나온다...

[svr.maker.net:21000] > drop table specific_pub_and_area;
Query: drop table specific_pub_and_area
ERROR: AnalysisException: Table oasis.specific_pub_and_area no longer exists in the Hive MetaStore. Run 'invalidate metadata oasis.specific_pub_and_area' to update the Impala catalog.
CAUSED BY: TableLoadingException: Table oasis.specific_pub_and_area no longer exists in the Hive MetaStore. Run 'invalidate metadata oasis.specific_pub_and_area' to update the Impala catalog.

여기에 대해서는 impala가 hive metastore를 어떻게 관리하는지 이해할 필요가 있다!(todo)



그래서 invalidate metadata oasis.specific_pub_and_area 명령어를 수행해주어야 impala에도 변경된 내용이 반영된다. 

(refresh oasis.specific_pub_and_area;) 명령어로는 테이블 삭제 생성까지 여부는 반영되지 않는다. 

[svr.maker.net:21000] > invalidate metadata oasis.specific_pub_and_area;
Query: invalidate metadata oasis.specific_pub_and_area

Fetched 0 row(s) in 0.16s
[svrmaker.net:21000] > show tables;
Query: show tables
+------------------------+
| name                   |
+------------------------+
| specific_pub_and_area3 |
| test_table             |
+------------------------+

새로운 테이블이 create됬을 때도 똑같이 해주어야한다.



hive쿼리로 hive테이블에 데이터를 밀어넣어보았다. (밑의 내용은 임의로 수정된 내용임을 말씀드립니다..)

hive> select * from specific_pub_and_area limit 10;
OK
20190320       3339487      Test신문    8888      Test_신문_Below      PAG     333     67
20190320      4449485      Test신문    7777      Test_신문_Below      PAG     14844   103335
.
.
.
(생략)
Time taken: 0.29 seconds, Fetched: 10 row(s)

hive> select count(*) from specific_pub_and_area;
OK
4794



impala shell에서 select를 해보면???

[svr.maker.net:21000] > select count(*) from specific_pub_and_area;
Query: select count(*) from specific_pub_and_area
+----------+
| count(*) |
+----------+
| 0        |
+----------+
Fetched 1 row(s) in 2.03s

[svrmaker.net:21000] > refresh oasis.specific_pub_and_area;
Query: refresh oasis.specific_pub_and_area2

Fetched 0 row(s) in 0.18s
[svrmaker.net:21000] > select count(*) from specific_pub_and_area;
Query: select count(*) from specific_pub_and_area2
+----------+
| count(*) |
+----------+
| 4794     |
+----------+
Fetched 1 row(s) in 1.21s

실제로 hive metastore에 테이블이 추가되거나 데이터가 insert되었을 때 invalidate metadata db.tablename 을해주면 모든 

경우에대해서 impala shell에서도 접근 가능하다.



하지만 invalidate metadata는 refresh에 비해 부하가 크므로 실제 데이터가 insert되었는지에 대한 확인만을 위한거면 refresh명령어로 갱신해주도록하자.

INVALIDATE METADATA and REFRESH are counterparts: INVALIDATE METADATA waits to reload the metadata when needed for a subsequent query, 
but reloads all the metadata for the table, which can be an expensive operation, especially for large tables with many partitions. 
REFRESH reloads the metadata immediately, but only loads the block location data for newly added data files, 
making it a less expensive operation overall. If data was altered in some more extensive way, 
such as being reorganized by the HDFS balancer, use INVALIDATE METADATA to avoid a performance penalty from reduced local reads. 
If you used Impala version 1.0, the INVALIDATE METADATA statement works just like the Impala 1.0 REFRESH statement did, while the Impala 1.1 REFRESH 
is optimized for the common use case of adding new data files to an existing table, thus the table name argument is now required.

The table name is a required parameter [for REFRESH]. To flush the metadata for all tables, use the INVALIDATE METADATA command. 
Because REFRESH tablename only works for tables that the current Impala node is already aware of, when you create a new table in the Hive shell, 
enter INVALIDATE METADATA new_table before you can see the new table in impala-shell. Once the table is known by Impala, 
you can issue REFRESH table_name after you add data files for that table.

참고 : invalidate와 refresh에 대한 자세한 내용



[ 결 론 ] 

hive쿼리를 통해 hive metastore에 데이터베이스나 테이블이 생성되거나 삭제되었을 때는 

impala에서 invalidate metadata db.tablename 명령어를 주어야 다시 캐싱된다.

but 테이블에 새로운 데이터만 hive쿼리에 의해 insert되었을 때는 refresh db.tablename으로 갱신해주도록 하자.

impala에서 생성한 테이블이나 데이터는 hive에서 별다른 명령어 없이 확인 가능하다.


반응형
반응형


클린코드 책에서 읽은 '깨끗한 테스트코드 5가지 규칙(FIRST)'에 대해 포스팅 남겨보겠습니다.


프로그래밍을 할 때 어떻게 보면 테스트 코드의 작성은 가장 기본이면서 중요하다고 할 수 있는데요.


TDD방식의 프로그래밍까지는 아니더라도 테스트코드를 작성해주면 서비스에서의 버그를 확실히 줄여줄 수 있고


기능 추가시에도 빠르게 테스트해보고 적용하는 등 이점을 많이 가지고 있는데요. 


그렇다면 어떠한 기준과 방식으로 테스트코드를 작성해야하는지 5가지 규칙을 보시도록 하겠습니다.


[클린코드] 깨끗한 테스트코드 5가지 규칙(FIRST)

빠르게(Fast)
테스트는 빨라야 한다. 테스트는 빨리 돌아야 한다는 말이다. 테스트가 느리면 자주 돌릴 엄두를 못 낸다. 자주 돌리지 않으면 초반에 문제를 찾아내 고치지 못한다. 코드를 마음껏 정리하지도 못한다. 결국 코드 품질이 망가지기 시작한다.


독립적으로(Independent)
각 테스트를 서로 의존하면 안 된다. 한 테스트가 다음 테스트가 실행될 환경을 준비해서는 안 된다. 각 테스트는 독립적으로 그리고 어떤 순서로 실행해도 괜찮아야 한다. 테스트가 서로에게 의존하면 하나가 실패할 때 나머지도 잇달아 실패하므로 원인을 진단하기 어려워지며 후반 테스트가 찾아내야 할 결함이 숨겨진다.


반복가능하게(Repeatable)
테스트는 어떤 환경에서도 반복 가능해야 한다. 실제 환경, QA 환경, 버스를 타고 집으로 가는 길에 사용하는 노트북 환경(네트워크가 연결되지 않은)에서도 실행할 수 있어야 한다. 테스트가 돌아가지 않는 환경이 하나라도 있다면 테스트가 실패한 이유를 둘러댈 변명이 생긴다. 게다가 환경이 지원되지 않기에 테스트를 수행하지 못하는 상황에 직면한다.


자가검증하는(Self-Validating)
테스트는 bool값으로 결과를 내야 한다. 성공 아니면 실패다. 통과 여부를 알리고 로그 파일을 읽게 만들어서는 안 된다. 통과 여부를 보려고 텍스트 파일 두 개를 수작업으로 비교하게 만들어서도 안 된다. 테스트가 스스로 성공과 실패를 가늠하지 않는다면 판단은 주관적이 되며 지루한 수작업 평가가 필요하게 된다.


적시에(Timely)
테스트는 적시에 작성해야 한다. 단위 테스트는 테스트하려는 실제 코드를 구현하기 직전에 구현한다. 실제 코드를 구현한 다음에 테스트 코드를 만들면 실제 코드가 테스트하기 어렵다는 사실을 발견할지도 모른다. 어떤 실제 코드는 테스트하기 너무 어렵다고 판명날지 모른다. 테스트가 불가능하도록 실제 코드를 설계할지도 모른다.


규칙 하나하나 너무나도 중요한 얘기들인 것 같습니다. 이 규칙을 염두해두시고 프로그래밍을 하신다면

좀 더 안정적인 서비스를 하시는데, 작성한 코드를 테스트하는데 드는 시간을 많이 줄일 수 있을 것 같습니다!

반응형
반응형

프로그래밍을 배워야하는 3가지 이유

 

오늘은 프로그래밍을 배워야하는 3가지 이유에 대해 얘기해보려고 합니다.

 그럼  프로그래밍을 배워야하냐

물론 IT회사에 개발자로 일하고 싶으신 분들은 무조건 배워야 하지만 

 개발자로 일하지 않더라도 프로그래밍을 배우면 좋은 3가지 이유에 대해 이야기 해보겠습니다.

 

 

[  번째로, IT시대를 살고 있는 지금 IT 우리의 삶과 떨어질  없는 존재입니다 ]

현재 IT 농업건설자동차의학  장르를 불문하고 많은 비중을 차지하고 있습니다.

병원에서는 의료용 로봇이 수술을하고 운전도 IT시스템에 의해 자율주행을 하는 시대에 살고 있습니다.

그렇기 때문에 프로그래밍을 이해하고 있는 사람과 그렇지 않은 사람간에는 사고의 깊이가 다를  밖에 없습니다.

마치 영어를 배우면 다양한 사람들과 소통을 하며  사람들의 생각과 문화를 이해할  있게 되고

영어로  수많은 문서를 읽을  있게 되며  넓은 세상을   있게 되는 것과 비슷하다고 생각합니다.

주변을 둘러보면 온통 우리의 삶은 온통 IT 접해있습니다프로그래밍을 배움으로써 삶에서 마주하는

새로운 기술, IT 서비스를   주체적으로 이해하고 사용하며 새로운 통찰력을 얻을  있습니다.

 

 

[ 두 번째로프로그래밍을 공부하게 되면 논리적으로 사고하는 문제해결능력을 기를  있습니다 ]

저는 문과출신 컴퓨터공학부 학생으로 대학생때와 개발자 5년차인 지금의 모습을 비교했을  

가장 크게 차이나는 부분은 어떤 문제가 주어졌을  논리적으로 사고하고 문제를 해결해 나간다는  입니다.

프로그래밍을 하게 되면 사소한 문제들에 많이 부딪힙니다문자 하나만 잘못 입력해도 컴퓨터에서 생각대로 동작하지 않으며

사람과의 커뮤니케이션방식과는 다르게 정해진 방식으로 컴퓨터와 대화하지 않고서는 문제를 해결할  없습니다.

따라서 컴퓨터가 프로그래밍 언어를 이해하고 처리하는 방법을 학습하고 그에 맞게 프로그래밍을 수행하여야 합니다.

 과정에서 논리적으로 사고하는 법을 학습하게 되고 프로그래밍과정중 문제를 해결하는 과정에서 문제해결능력 또한

기를  있습니다

실제로 스티브잡스 “컴퓨터를 어떻게 프로그래밍하는지 모든사람들이 배워야 합니다.

왜냐하면 그것은 당신에게 생각하는 법을 알려주기 때문입니다. 라고 말하기도 했습니다.

 

[ 세 번째로 머릿속의 생각을 현실세계에서 구현할  있습니다꿈의 현실화라고 말하고 싶습니다 ]

프로그래밍을 하며 느끼는 가장  매력포인트라고 생각합니다.

단순 반복적인 엑셀업무를 시스템화해서 자동으로 처리하고내가 생각만 해왔던 서비스를 웹사이트를 만들어 서비스 하는 

 머릿속에 있는 생각을 현실세계로 가져와 실현할  있습니다.(꿈의 현실화)

 

프로그래밍을 하게 되면 가장 크게 좋은 점을 3가지로 간추려보았는데요.

물론 프로그래밍을 처음 시작하면 어렵겠지만 영어처럼 언어를 공부한다는 생각으로 조급해 하지 않고

조금씩 공부해보는 것도 나쁘지 않을  같습니다다만 가장 프로그래밍을 빨리 배울  있는 방법은

목표의식을 가지고 하는 거라고 생각합니다내가 업무에서 이런 반복적인 업무들을 하고 있는데

시스템화 해서 자동화 하고 싶다던지 내가 생각하는 웹서비스를 운영해보고싶다던지 하는 동기부여가 있다면

  재미있게 프로그래밍 공부를 하실  있을  같습니다.


감사합니다 오늘 포스팅은 여기서 마치도록 하겠습니다!

 


반응형
반응형



HashMap을 생성하고 그 안에 put을 해도 HashMap자체의 해쉬코드(hashCode)값은 안변할 줄 알았것만.....


결론은 put을 할 때마다 hadhCode값이 변하게 됩니다.


[ 백문이불여일코딩 ]


[ 결과 hashcode 값 ]

get메서드사용할때는 당연히 안바뀌고 put으로 데이터를 넣을 때 마다 해쉬코드가 변하는 것을 확인!!!!

값은 key값에 데이터를 덮어씌울때도 hashcode가 변한다! 이유는??


[ 이유는??? ]

HashMap의 put메서드가 내부적으로 entry를 새로 만들기 때문!!!!

map에서의 hashcode의 값은 entry의 해시코드의 합으로 정의되는데 내부에서 

put메서드가 호출될때마다 새로운 entry를 생성하기 때문에 값이 달라짐

public int hashCode()
Returns the hash code value for this map. The hash code of a map is defined to be the sum of the hash codes of each entry in the map's entrySet() view. This ensures that m1.equals(m2) implies that m1.hashCode()==m2.hashCode() for any two maps m1 and m2, as required by the general contract of Object.hashCode().

This implementation iterates over entrySet(), calling hashCode() on each element (entry) in the set, and adding up the results.

Specified by:
hashCode in interface Map<K,V>
Overrides:
hashCode in class Object
Returns:
the hash code value for this map
See Also:
Map.Entry.hashCode(), Object.equals(Object), Set.equals(Object)


참조 : https://docs.oracle.com/javase/7/docs/api/java/util/AbstractMap.html#hashCode()


[ HashMap put메서드를 따라가보자! ]

1. put


2. putVal


3. putTreeVal


4. newTreeNode


5. new TreeNode



6. TreeNode의 super


Wow....


상식적으로 생각했을 때 Map이 한 번 생성되면 안에 내용이 변경되더라도 해시코드(hashcode)값은 변하지 않을 줄 알았는데....


변하는 것을 보고 한 번 끝까지 따라가 보았다.


뭔가 속이 후련한???


앞으로도 궁금한점이 생긴다면 대충 알고 넘어가는 것보다 한 번 끝까지 따라가 제대로 된 이유를 알아보는것을 습관화하도록 하자!






반응형
반응형

스파크(SPARK)가 설치된 서버에서 스파크 버전이 확인 하고 싶을 떄


spark-submit --version


으로 확인할 수 있다.


감사합니당 :)


반응형
반응형

요즘 Superset을 통해 데이터 시각화하는 작업을 진행중인데요. 


해당 오픈소스 클라이언트 쪽을 혹시나 커스터마이징 해야할 일이 있을까 싶어 일단 로컬환경에 셋팅하며 세팅한 내용 포스팅 남겨봅니다.



먼저 SuperSet이란?

Apache프로젝트에 속한 오픈소스 데이터 시각화 툴이고 굉장히 깔끔한 UI와 다양한 차트들을 제공합니다.

깃 레파지토리(Git repo)



Superset 설치

git clone https://github.com/test/test.superset.git
cd test.superset
# Create a virtual environemnt and activate it (recommended)
# 이 부분은 사용하는 IDE에 따라서 자동으로 해주는 경우가 있습니다.
virtualenv venv
source venv/bin/activate
# Install external dependencies
pip install -r requirements.txt
pip install -r requirements-dev.txt
# 해당 명령어 수행시 해당 문제가 발생한 경우 
fatal error: too many errors emitted, stopping now [-ferror-limit=]
    20 errors generated.
    error: command 'clang' failed with exit status 1
    ----------------------------------------
Command "/Users/nhnent/IdeaProjects/[[dighty.superset/venv/bin/python3.7&#93;\(http://dighty.superset/venv/bin/python3.7\)](http://dighty.superset/venv/bin/python3.7](http://dighty.superset/venv/bin/python3.7)) -u -c "import setuptools, 
tokenize;__file__='/private/var/folders/72/tlj3dkwx5vx_4tvvmkt9v3nm0000gn/T/pip-install-5sa870m3/thriftpy/setup.py';f=getattr
(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" 
install --record /private/var/folders/72/tlj3dkwx5vx_4tvvmkt9v3nm0000gn/T/pip-record-0derjrrg/install-record.txt 
--single-version-externally-managed --compile --install-headers 
/Users/nhnent/IdeaProjects/[[dighty.superset/venv/bin/../include/site/python3.7/thriftpy&#93;\(http://dighty.superset/venv/bin/../include/site/python3.7/thriftpy\)](http://dighty.superset/venv/bin/../include/site/python3.7/thriftpy](http://dighty.superset/venv/bin/../include/site/python3.7/thriftpy))" failed with error code 1 
in /private/var/folders/72/tlj3dkwx5vx_4tvvmkt9v3nm0000gn/T/pip-install-5sa870m3/thriftpy/
>> pip3 install cython thriftpy  (해당 명령어 실행 후 다시 실행)
pip install mysqlclient
# 위 설치 과정 중 mysqlclient에 문제가 발생한 경우
# https://www.lfd.uci.edu/~gohlke/pythonlibs/ 로 접속하여,  
# 본인의 윈도우 시스템과 python 버전에 맞는 .whl파일 다운로드
# 나의 경우(MAC) > macholib‑1.11‑py2.py3‑none‑any.whl  다운 받음
# pip install [다운받은 whl파일 경로]
# Install Superset in editable (development) mode
pip install -e .
# Create an admin user
fabmanager create-admin --app superset


cd dighty.superset/venv/bin
# Initialize the database python superset db upgrade # Create default roles and permissions python superset init # Load some data to play with python superset load_examples
cd dighty.superset/superset

# Start the Flask dev web server from inside the `superset` dir at port 8088
# Note that your page may not have css at this point.
# See instructions below how to build the front-end assets.
# 해당 flask 명령어 수행 이후 npm 명령어 실행 시켜줘야 css가 안깨짐

flask run -p 8088 --with-threads --reload --debugger

flask 서버만 띄우면 다음처럼 css가 다깨지기때문에 flast서버 띄워논 후 npm으로 빌드해서 dev-server를 띄워준다.


npm run dev-server


짜잔~~~


또 Superset을 사용하다가 삽질한 부분이 생기게 되면 포스팅해보도록 하겠습니다.


Superset 흥해라~!!!

반응형
반응형


맥(MAC)에서 GIF를 쉽게 만들 수 있게 도와주는 앱을 소개합니다.


앱이름은 

GIPHY Capture. The GIF Maker

입니다.


사용법은 아주 간단합니다. 먼저 다운을 받고 설치한 후 실행하면 다음과 같이 창이 열립니다.


해당 창안에서 녹화되는 부분이 GIF로 생성되게 됩니다.


빨간 버튼을 눌러 녹화를 해주면 끝^^



감사합니다:)








반응형
반응형

최근 hive와 impala query를 만지게 되면서 hive udf를 impala에 등록할 일이 생겼는데


hive에서 udf를 등록할 때의 명령어가 먹지 않아 약간의 삽질을 하였다.


사용한 udf는 string을 입력받아 잘게 쪼개어 다시 string을 반환하는 역할이었다.


[ Hive UDF create command ]

hive> create function ad_get as 'com.data.udf.AdGet' using jar 'hdfs:///user/hive/lib/hive-udf.jar';

ad_get => hive에서 udf로 사용할 명칭
com.data.udf.AdGet => jar에서 udf로 등록할 클래스명칭

hdfs:///user/hive/lib/hive-udf.jar => jar hdfs path



[ Impala UDF create command ] 

Impala는 hive udf create 명령과는 다르게 해당 udf의 return 타입과 input타입을 명시해 주어야 한다.

create function ad_get(string, string, string) returns string location 'hdfs:///user/hive/lib/hive-udf.jar' symbol='com.data.udf.AdGet';


ad_get(string, string, string) => impala에서 udf로 사용할 명칭(string arg 3개를 입력 받는다)

returns string => 리턴타입 지정

symbol='com.data.udf.AdGet' => jar에서 udf로 등록할 클래스명칭

location 'hdfs:///user/hive/lib/hive-udf.jar



impala에 해당 명령어로 udf를 등록한 후 show functions 명령을 내려 보면 잘 등록되었는지 확인이 가능하다.


감사합니다:)


반응형

+ Recent posts