카테고리 보관물: 빅데이터 Big data

빅데이터는 사기?

“빅데이터는 사기다”라고 구체적인 근거없이 맹목적으로 비난하는 분이 많아서 이 글을 포스팅합니다.

두괄식으로 말하면

빅데이터는 그 자체로는 사기가 아닙니다.

빅데이터로 사기를 치면 그게 사기이지요

빅데이터는 사기라고 말하는 사람이 많습니다. 실제 현장의 실정을 알기 때문에 이런 말 을 하는 분들이 무슨 뜻으로 하는 얘기인지 이해가 됩니다만 하지만 그렇다고 해서 그 모든 것이 다 사실이 아니거나 너무 왜곡하는 경향도 많습니다.

빅데이터가 사기라고 말하는 이유는 아마도

다음과 같이 일을 처리했거나 그걸 옆에서 지켜본 뒤의 경험을 얘기했을 것입니다.

  • 빅데이터 프로젝트 또는 PoC를 진행 했는데 뭘 했는지 모를 결과가 나왔을 때
  • 빅데이터의 성과보다는 ”빅데이터 프로젝트”라는것을 해보고 싶은 목적으로 프로젝트를 진행했을때
  • 할일이 없어서 “이거라도 해보자고 하자”라고 막연히 진행했을 때
  • 예산과 리소스를 사용하고도 실제로 비즈니스나 매출에 영향이 전혀 없을 때

빅데이터는 과정 또는 수단이지 결과가 아니다.

빅데이터 자체가 목표인 비즈니스는 빅데이터 플랫폼, 솔루션을 판매하거나 기술지원 상품을 판매하는 회사가 아니라면 많은 회사들에게 빅데이터는 “수단”입니다.

대부분의 회사, 연구소에게 빅데이터는 목표가 아닙니다. 차분히 새각해보면 그런 말이 많이 이상하다는 생각에 동의하실 것입니다.

빅데이터의 가장 활용도는 빅데이터를 이용해서 비즈니스를 개선하거나, 비즈니스 아이템을 발굴하거나, 비즈니스에 중요한 결정을 하는데 필요한 데이터를 처리하고 인사이트를 찾는 것을 돕는 것입니다.

디때 데이터 사이즈가 작고 처리하기 어렵지 않으면 그냥 통계분석이나 데이터과학이 되는 것이고 데이터 사이즈가 매우 크고 처리량도 많고 일도 많다면 빅데이터 분석, 빅데이터를 사용한 데이터 과학이 되는 것입니다.

물론 잘 아시다시피 인공지능, 기계학습에 필요한 데이터를 처리하는데도 빅데이터가 필요합니다.

빅데이터 그거 해봤는데 결과가 안좋드라.

어느날 대형 이커머스 A사와 미팅에 들어갔는데 빅데이터 해봤더니 결과가 안좋아서 우리는 사기라고 생각한다고 하더군요.

그래서 무슨 결과가 어떻게 안 좋았냐고 물었습니다. 담당자가 그냥 밑도끝도 없이 좋은 결과가 안 나왔다는 말만 되풀이하는 것이었습니다.

이 회사 뿐만은 아니고 다른 회사들과 비팅에서도 다수가 비슷한 반응이었습니다. 넘겨짚어 해석을 해보면 대부분 다음과 같은 이유입니다. 사실은 결정권자 진행자 들이 빅데이터 자체를 못마땅해 하는 것입니다.

그냥 하기 싫은 것이지요.

  1. 회사의 매출에 도움이 되는 전술을 빅데이터 프로젝트로 도출을 못했다. 즉 사업개선 아이템이나 사업확장 아이템을 못 내놨다.
  2. 인프라로 구축한 빅데이터가 돈만 쓰고 매출이나 이익을 올리는데 기여를 못한다. 돈만쓰고 돈을 못벌었다.
  3. 기술우위를 논할만큼 대단한 기술이 아니다.
  4. PoC를 했는데 결과물(산출물)이 소프트웨어가 아니고 문서쪼가리다.

이 외에도 더 많습니다만 위의 것만 하나씩 대답을 해보자면

1번 회사의 매출은 경영진이 책임져야지

회사의 매출을 올리는 것은 영업, 기획, 마케팅, 경영진이 하는겁니다. 빅데이터는 과학적 근거를 찾거나 인사이트를 찾는데 사용하는 도구입니다. 빅데이터가 그걸 해주면 그 회사 대표이사와 기획부서는 왜 필요한가요?

2번 인프라인데 돈만 쓰고 나오는게 없어

그럼 회사에서 사용하는 데이터베이스, 더존 회계, IT지원부서, 인사팀 사람들은 왜 필요한가요?

인프라는 효율을 위해서 필요한거지 당장의 매출을 올리려고 하는 것이 아닙니다.

이 질문 하는 사람들은 99%가 기술이나 생산부서 사람들입니다.

3번 그게 뭐 대단한 기술인가?

태초에는 대단한 기술이었지만 지그은 그렇게 대단한 기술이 아닌 것은 사실입니다. 누구나 다 하니까요.

그렇다고해서 전혀 쓸모 없는 것은 아닙니다. 여러분이 사용하는 대부분의 최신 데이터 처리, 분석 시스템은 빅데이터 플랫폼입니다.

4번 빅데이터를 했으면 어떻게 작동하는지 보여줘봐

대부분의 빅데이터 프로젝트는 빅데이터 플랫폼 도입 아니면 인사이트 도출입니다.

플랫폼 도입는 PoC를 해서 요건은 만족하면 도입하는 것이고 안시이트 도출은 인사이트가 나올 수도 있고 안나올 수도 있고 나왔는데 뻔한 것일 수도 있습니다.

빅데이터 프로젝트는 대부분 소프트웨어 개발이 아닙니다.

빅데이터 사기란 무엇인가?

”빅데이터를 하면 무조건 회사 매출이 오르고 주식이 2배로 뜁니다.” 라고 말하면 사기입니다.

대부분 그렇게 말하지 않지요. 진짜 사기꾼이라도 그렇게는 말 안합니다.

사기는 사기 행위가 드러나야 사기인 것입니다. 자기 마음에 들지 않거나 자기가 프로젝트에서 소외되고 회사가 헛돈 쓰는 것 같아서 마음에 들지 않는다고 사기라고 말하는 것도 올바른 생각은 아닙니다.

“빅데이터라는사탕발림으로 경영진과 결정권자를 홀려서 눈먼 돈을 뜯어간 것이 아니냐?” 라고 물을 수도 있을 것입니다.

이럿게 되물을 수 있습니다.

  • 그렇다면 대부분의 경영 컨설턴트들은 그렇지 않단 말입니까? 그들도 말로 사탕발림하는 것은 똑같지 않습니까?
  • 그렇다손 치더라도 과연 경영진과 결정권자들이 그걸 몰랐을까요? 그렇게 멍청할까요?

대부부 이 질문에 대한 답을 하지 못합니다.

빅데이터는 사기다라고 말하는 사람의 두 부류

두 부류입니다.

  • 빅데이터를 전혀 모르는 사람
  • 빅데이터를 너무 잘하는 사람

개인적인 통계를 내보면 99%가 빅데이터를 전혀 모르는 사람입니다.

옆에서 지켜보는 것이 전부는 아니라는 말을 해두고 싶습니다.

특히 소프트웨어 개발자들은 데이터 활용에 대해서 무지한 사람이 매우 많습니다. 본인들은 이런 말을 들으면 매우 불쾌해 하지만 현실은 그렇습니다.

그 사람들은 데이터과학자들이 자신들보다 높은 급여를 받으며 결정권자와 친밀하고 말로 자신들을 압도하는 것에 대해서 매우 불편해 합니다.

경험으로 볼 때 보통 빅데이터는 사기다라고 말하는 사람들의 90%가 개발자들이고 나머지 10% 자기가 할 일이 늘어나는 일하기 싫어하는 회사 직원들입니다.

구글 빅쿼리는 무엇인가? What is Google BigQuery

빅쿼리 BigQuery를 짤막한 문장으로 쉽게 설명해 봤습니다.

개념

  • 구글이 만들어서 제공하는 서비스입니다. 유료입니다.
  • 데이터베이스라고 이해하면 됩니다.
  • 빅데이터 플랫폼입니다.
  • SQL 언어를 사용해서 사용할 수 있습니다. (이름에 Query가 들어간 것을 볼 수 있음)
  • 초대량 데이터 분석용 솔루션입니다.
  • 실시간 솔루션은 아닙니다. 하지만 실시간 지원을 일부 합니다.
  • BI/DW의 엔진으로 많이 씁니다.

요금

  • 사용료는 종량제와 정량제로 나눌 수 있는데 기본은 종량제 즉 쓰는 만큼 지불합니다.
  • 데이터를 스캔한 만큼. 즉, 스토리지에서 빅쿼리가 데이터를 읽은 만큼 과금합니다. 1Tb를 읽어들이게 하면 5달러정도의 요금을 지불
  • 합니다.

누가 쓰나?

  • 데이터 과학자 Data Scientist
  • 데이터 분석가 Data Analyst
  • 데이터 엔지니어 Data Engineer

좋은점

  • 많은 사용자들이 빅쿼리 데이터 집계나 처리가 매우 빠르다고 말합니다. 하둡, 스파트 등의 다른 빅데이터 플랫폼에 비해서 말입니다.
  • 쓰는 만큼만 요금을 내면 됩니다.

나쁜점

  • 아무생각없이 쓰면 요금이 매우 많이 나올 수도 있습니다. 1회 쿼리에 수십만원에서 수백만원을 쓰는 경우도 있습니다.
  • 사용법 및 다루는 법이 어렵지는 않지만 훈련과 연습이 필요합니다.

그외에

  • 대부분의 데이터과학자가 선호하는 솔루션입니다.
  • 데이터 엔지니어들은 좋아하는 사람과 싫어하는 사람들이 반반정도 되는 것 같습니다.

BigQuery JSON 문자열에서 원하는 값 추출하기

BigQuery 테이블에 어떤 필드에 JSON 문자열이 들어 있고 이 JSON 문자열에서 어떤 키에 해당하는 값을 가져오는 간단한 쿼리 스니펫입니다.

들어있는 JSON 문자열의 포맷이 큰 문제가 없으면 괜찮은데 아닌 경우가 있습니다. 그래서 간단하게 쿼리를 돌려서 테스트 해봤습니다.

BigQuery에 JSON 문자열에서 원하는 키에 해당하는 값을 가져오는 샘플 쿼리입니다.

간단한 테스트를 하는데 테이블을 만드는 것이 귀찮으니 JSON 문자열 여러 개를 array로 만들고 UNNEST로 꺼내서 합니다. 다른 데이터베이스에서는 UNION ALL을 하고 INLINE VIEW로 묶어서 꺼내거나 LATERAL VIEW를 쓰면 됩니다.

SELECT json_str                                AS json_str
     , JSON_EXTRACT_SCALAR(json_str, '$.prob') AS prob_scala
     , JSON_EXTRACT_SCALAR(json_str, '$.bin')  AS bin_scala
     , JSON_EXTRACT(json_str, '$.prob')        AS prob_str
     , JSON_EXTRACT(json_str, '$.bin')         AS bin_str
FROM UNNEST([
                '{}',
                '{"prob":"0.413656","bin":"0"}',
                '{"prob":"0.010643","bin":"3"}',
                '{"prob":"0.000114","bin":"2"}',
                '{"prob":"0.802312","bin":"NULL"}',
                '{"prob":"NULL","bin":"NULL"}',
                '{"prob":"NULL","bin":"65"}',
                '{prob:"0.627363",bin:23}',
                '{\'prob\':0.27372,\'bin\':45}'
    ]) AS json_str
;

결과를 TSV형태로 뽑아보면 다음과 같습니다.

json_str	prob_scala	bin_scala	prob_str	bin_str
{}
{"prob":"0.413656","bin":"0"}	0.413656	0	"0.413656"	"0"
{"prob":"0.010643","bin":"3"}	0.010643	3	"0.010643"	"3"
{"prob":"0.000114","bin":"2"}	0.000114	2	"0.000114"	"2"
{"prob":"0.802312","bin":"NULL"}	0.802312	NULL	"0.802312"	"NULL"
{"prob":"NULL","bin":"NULL"}	NULL	NULL	"NULL"	"NULL"
{"prob":"NULL","bin":"65"}	NULL	65	"NULL"	"65"
{prob:"0.627363",bin:23}
{'prob':0.27372,'bin':45}	0.27372	45	0.27372	45

저렇게 보면 눈에 잘 안 들어오는데 이렇게 보면 실제 NULL값과 “NULL”이라는 문자열 그리고 key가 따옴표 또는 큰타옴표로 묶여 있지 않는 것들이 어떻게 처리되는지 볼 수 있습니다.

위의 결과는 DataGrip에서 결과를 확인한 것입니다.
결과를 자세히 보시면 알겠지만 사용할 때 주의할 점은 이렇습니다.

  • 우선 JSON의 안쪽에 키(key)는 큰따옴표 또는 작은따옴표로 묶여 있어야 합니다.
  • JSON_EXTRACT는 키에 해당하는 값을 통째로 다 문자열로 가져옵니다
  • JSON_EXTRACT_SCALA는 키에 해당하는 값에서 큰따옴표, 작은따옴표를 없애고 알맹이만 꺼내 옵니다.

Hive server 2에 python impyla 패키지로 접속하기

ipyhton 또는 그냥 python script로 Hive에 접속해서 SQL을 실행하고 결과 데이터를 가져오게 하려면 굉장히 고통스럽습니다.

Python에서 사용할 수 있는 Hive 접속관련 패키지들이 상당히 불안하고 버그가 많습니다. 다 해결해주는 깔끔한 끝판왕이 하나 나와줬으면 싶은데 Hive가 일반 RDBMS 처럼 쓰는 것은 아니어서 그런지 아직까지 깔끔하게 해결해 주는 패키지가 없습니다.

Hive 자체에서 제공하는 python client라는 것이 있긴한데 이걸 쓰려고하면 설정을 위해서 상당히 귀찮은 작업들을 해야 합니다.  예전에 했을 때는 되긴했었습니다만 다시하고 싶지 않습니다.

배보다 배꼽이커요.

그런데
Cloudera에서 impala용 client를 만들어서 제공하는데 이 패키지가 impala 뿐만 아니라 HiveServer2에 접속하는 기능도 제공합니다.
이것 말고도 HiveServer2에 접속할 수 있게 해주는 Python 패키지중에 pyhs2라는 것이 있는데 이 패키지도 동일한 기능을 제공하지만 더 이상 업데이트 하지 않고 impyla를 사용하라고 github에 pyhs2 제작자가 적어놨더군요.  그 외에도 몇개의 패키지가 있습니다만 모두 불편했습니다.

그래서 현재까지 가장 쉽게 Python에서 Hive에 연결해서 쿼리를 실행하거나 작은 실행 결과를 바로 가져오는 방법은 Python에서 HiveServer2에 접속하게 하고  HiveServer2에 접속하기 위해서  impyla 패키지를 쓰는 것입니다. (다른 더 쉬운 방법이 있으면 알려주세요)

impyla 패키지를 사용하려면 당연히 Hive server 2가 어딘가 네트워크로 접속할 수 있는 서버에서 작동하고 있어야 합니다. 이 패키지는 Hive server 2에 접속하는 것이니까요.

그냥 Hive하고 Hive server 2가 다른 것이라는 것은 아시지요? Hive server 2는 Hive를 별도로 Daemon으로 띄워서 사용하게 해주는 일종의 add-on 입니다. Hive에 같이 포함되어 있으니 설정을 잡아주고 구동만 시키면 됩니다.

그런데 이 impyla 패키지도 의존성으로 가진 Thrift 관련된 패키지가 여러단계로 조금씩 의존성이 꼬여 있어서 설치할 때 조금 귀찮게 합니다. 그래서 impyla 패키지를 설치할 때 조금 고생하게 되는데 그때 필요한 것들을 정리도 할겸 포스트로 올립니다.

CentOS Linux에서는 다음과 같은 문제를 고려해서 설치하면 현재는 작동이 됩니다.  각 환경마다 사정이 다르기 때문에 모두 동일하게 해결된다는 보장은 없습니다. Ubuntu에서는 안해봤습니다.

Ubuntu에서도 잘 될 것이라고 생각합니다.

impyla 관련 패키지 설치하기

우선 python package이름이 impala가 아니고 impyla 인것에 주의하시구요. 패키지 이름이 “임팔라”가 아니고 “임파일라”입니다. 무척 헷갈립니다. 게다가 python 코드 내에서 import 할때는 impala를 호출해야 합니다. (왜 그랬는지…)

설치할 때 주의해야 할 중요한  내용입니다.

  • Thrift에 접속할 때 인증을 위해서 sasl 관련 library가 필요합니다.  CentOS에서는 yum으로 검색해서 cyrus로 시작하는 sasl 패키지들을 설치해 주어야 합니다. 특히 cyrus-sasl-plain을 설치해야 Hive Server 2에 plain 방식으로  id/password를 입력하고 접속할 수 있습니다. 현재는 Hive Server 2 plain 방식이 아니면 접속할 수 없었습니다. cyrus sasl의 기본 설치에서 제외되므로  빼먹지 말고 찾아서 설치해야 합니다.
  • impyla 패키지가 thrift 패키지에 의존성을 가지는데 현재 0.9.3 이하가 아니면 작동하지 않도록 되어 있습니다. 나중에는 고쳐질 수 있겠습니다만 지금은 아닙니다.  thrift의 현재 시점에서의 최신 버전은 0.10.0 입니다. 그래서 이미 0.10.0 버전으로 설치되어 있으면 0.9.3 이하로 downgrade해야합니다.
  • 기타 thrift 패키지 설치에 필요한 의존성 패키지가 있습니다만 환경에 따라 이미 설치가 되어 있을 수도 있습니다. 의존성 오류가 발생하면 그 패키지를 설치하면 됩니다. 이 것들은 대충 막 설치해도 큰 충돌은 없는 것들입니다.
  • impyla 패키지가 pypi에 등록된 것은 위와 같이 해도 trans관련 오류를 내면서 제대로 접속하지 못합니다. 즉 pip 같은 것으로 빌드된 것을 설치하면 안될 수 있습니다. 그래서 impyla를 설치할 때는 소스를 clone받아서 빌드하고 설치해야 합니다.
  • 이때 thrift_sasl 패키지도 설치해 주어야 thrift를 통한 인증과 암호화 문제를 해결할 수 있습니다.

제가 작업하는 환경에서 작업한 shell command를 정리한 것입니다. python 2.7 버전 기준입니다. 3.x 도 되었던 것 같습니다만 기억이 가물가물하네요.

# install sasl releative packages and thrift
sudo yum install cyrus-sasl.x86_64 cyrus-sasl-devel.x86_64 cyrus-sasl-gssapi.x86_64 cyrus-sasl-md5.x86_64 cyrus-sasl-plain.x86_64 cyrus-sasl-ntlm.x86_64 cyrus-sasl-sql.x86_64 python-saslwrapper.x86_64 libgsasl-devel.x86_64 -y
sudo pip2.7 install thrift_sasl
sudo pip2.7 uninstall thrift  # 0.9.3 version is necessary. so 0.10.0 should be uninstalled
sudo pip2.7 install 'bitarray'
sudo pip2.7 install 'thrift<=0.9.3'

# sudo pip2.7 install pyhs2  # deprecated
# pip install git+https://github.com/cloudera/impyla.git

# install impyla. pypi impyla has a bug. so install from source
mkdir ~/__setup
cd ~/__setup
git clone https://github.com/cloudera/impyla.git
cd impyla
sudo python2.7 setup.py install
cd -
# sudo rm -Rf ~/__setup

이렇게 설치하고 나서 간단하게 작동하는지 다음과 같이 테스트해 보면됩니다. 서버주소와 ID, password, query는 환경에 맞게 수정하셔야 합니다. 당연한 것이지만 아래의 코드는 그대로 실행하면 접속을 못해서 에러입니다.

from impala.dbapi import connect

conn = connect(host='hive-server-2.aidenhong.com',
               port=10000,
               user='hiveuser',
               password='hivepassword',
               auth_mechanism='PLAIN')

cursor = conn.cursor()
cursor.get_databases()  # database 목록 가져오기

cursor.execute("select * from aiden.iris limit 10")  #  query 실행하기 예제
results = cursor.fetchall()
for row in results:
    print row

impyla 패키지의 github 레파지토리는 다음과 같습니다.

https://github.com/cloudera/impyla

향 후 패키지가 업데이트 되고 더 안정화되면 위의 자질구레한 문제들이 자동으로 해결될 수도 있을지도 모릅니다. 그런데 Cloudera 사람들이 저 패키지에 신경을 별로 안쓰는 것 같아서 조금 걱정은 됩니다.