2016년 11월 9일 수요일

RDD - Resilient Distributed Dataset

rdd (Resilient Distributed Dataset)는 사전 그대로 탄력적인 분산 데이터 집합을 말한다.
생성 후 변경이 불가능한 데이터 집합이며, 이에 따라 단순한 구조에서 오는 성능적인 이점을 가지고 있다.

rdd 에서는
map, reduce, filter 와 같은 변경 ( transformation ) 요소와 collect, count와 같은 실행 ( action ) 요소를 가진다.
실제 수행은 action 에서 발생한다.

분산 형태의 파일을 로딩 할 때,
- sqlContext.sql(“<QEURY>”), sparkContext.testFile(“hdfs://…”)
OR
로컬 collection을 parallelize 명령을 통해서,
sparkContext.parallelize(<list>, <slices number>)
rdd 가 생성 될 수 있다.

**
탐구 하기
rdd.coalesce().glom().collect()
rdd.coalesce(<partitions number>) - 원하는 파티션 수로 결합 ( reduce ) 한다.
rdd.glom() - 파티션 별로 결합된 rdd 를 돌려 준다.
rdd.collect() - driver의 메모리로 rdd 의 모든 데이터를 다 모은다.
sparkContext.runJob(<rdd>, <partition func>, <partitions>) - 원하는 partition 에만 함수를 적용한다.


참조

KNIME 도구를 통한 응용 사례 -> 사이트 본문 링크

* HIVE 와 SPARK 를 활용한 기계 학습 디자인 예제이다.
* 분산 처리 ( process )를 위한 영역에서 rdd 가 활용되는 것을 확인 할 수 있다.

HIVE 질의 하기 on SPARK

SPARK 에서 HIVE 질의 하는 과정이다.

SPARK CONTEXT 포인트를 얻는다.
from pyspark import SparkContext, SparkConf
conf = SparkConf().setAppName(‘HIVE SQL TEST01’)
sc = SparkContext(conf=conf)

HIVE CONTEXT 포인트를 얻는다.
from pyspark.sql import HiveContext
sqlContext = HiveContext(sc)

HIVE SQL 질의를 하고 결과를 가져온다.
result = sqlContext.sql("SELECT * FROM tb_test01”).collect()

PANDAS DATAFRAME 형태로 변환한다.
import pandas as pd
df = pd.DataFrame(result,columns=result[0].asDict().keys()) if len(result) > 0 else ‘nothing’

**
result 는 list 타입이고, spark 명세 row 포맷을 element 로 가진다.

뒷문은 언제나 잘 잠근다.
sc.stop()


참조

HIVE를 위한 콘솔 ( console ) CLI 사용 도구
사용자 ( end-user )에게 인터렉티브 ( interactive ) CLI 환경을 제공한다.

가. beeline
예제 :: beeline> !connect jdbc:hive2://<thrift server>:10000
SQL 문장이 바로 수행이 가능하다.

나. spark-sql
본문 방식으로 동작하며 CLI 를 제공한다.
hive metastore service를 이용하고, thrift server 와는 대화하지 않는다.

커버 사진

2016년 11월 7일 월요일

sqlite3 to hdfs with hive

sqlite3 에서 사용하던 이력 데이터의 용량이 너무 커져서 하둡 (hive)으로 옮기는 과정을 다룬다.
hive 저장 포맷에 대한 간략한 비교도 포함한다.

목차

  • sqlite3 to hdfs ( hadoop file system )
  • hdfs to hive
  • performance as hive format


sqlite3 에서 hdfs 로 파일 저장하기

sqlite3 -csv big.db “select * from big;” | hadoop fs -put - /user/me/big.csv

**
결과를 local 에 csv 로 저장 할 공간이 없어서, pipe 형식으로 하둡으로 바로 저장했다.
질의 결과를 표준 출력 ( stdout ) 으로 보낼 수 있다면 응용 될 수 있는 방법이다.

hdfs 에서 hive 로 로딩 하기

hortonworks 의 amberi 도구를 사용하면, Hive View 를 만들어서 Upload Table 메뉴를 이용한다.
미리보기 모드에서 파일 포멧, 테이블/컬럼 이름 등을 지정하면 심플하다.

sql 기반의 명령어는 다음과 같다.
테이블 스키마를 먼저 생성하고, csv 파일을 로딩한다.
CREATE TABLE big_text (Column01 int, Column02 string…) STORED AS TEXT;
LOAD DATA INPATH ‘/user/me/big.csv’ [OVERWRITE] INTO TABLE big_text;

다른 형태의 포맷으로 테이블을 만드는 과정이다.
CREATE TABLE big_orc STORED AS ORC AS SELECT * FROM big_text;

**
HIVE는 다양한 포맷을 지원한다.
sequence, text, orc, rc, parquet ..
성능 관점에서 보면 질의 형태에 따라 row 와 column 기반의 포맷에 주의한다.

특정 컬럼  filter에 있어서 text와 orc 포맷 테이블의 질의하기
>> column 기반의 orc에 이점이 있다.

hive> select count(*) from big_orc where sdate = '20160104';
Query ID = root_20161107130507_53898e98-2f58-4ca4-a4c9-ca03a527c8de
Total jobs = 1
Launching Job 1 out of 1


Status: Running (Executing on YARN cluster with App id application_1478242837204_0017)

--------------------------------------------------------------------------------
        VERTICES      STATUS  TOTAL  COMPLETED  RUNNING  PENDING  FAILED  KILLED
--------------------------------------------------------------------------------
Map 1 ..........   SUCCEEDED     20         20        0        0       0       0
Reducer 2 ......   SUCCEEDED      1          1        0        0       0       0
--------------------------------------------------------------------------------
VERTICES: 02/02  [==========================>>] 100%  ELAPSED TIME: 9.08 s  
--------------------------------------------------------------------------------
OK
673374
Time taken: 9.762 seconds, Fetched: 1 row(s)
hive> select count(*) from big_text where sdate = '20160104';
Query ID = root_20161107130524_c2dcdccb-63c1-4502-a305-6a681fa1ea9e
Total jobs = 1
Launching Job 1 out of 1


Status: Running (Executing on YARN cluster with App id application_1478242837204_0017)

--------------------------------------------------------------------------------
        VERTICES      STATUS  TOTAL  COMPLETED  RUNNING  PENDING  FAILED  KILLED
--------------------------------------------------------------------------------
Map 1 ..........   SUCCEEDED     20         20        0        0       0       0
Reducer 2 ......   SUCCEEDED      1          1        0        0       0       0
--------------------------------------------------------------------------------
VERTICES: 02/02  [==========================>>] 100%  ELAPSED TIME: 38.58 s  
--------------------------------------------------------------------------------
OK
673374
Time taken: 39.234 seconds, Fetched: 1 row(s)

참고


hive architecture figure - referred to apache hive homepage


2016년 11월 3일 목요일

구글 애널리틱스 전자상거래 - 관련 상품 가져오기

GA 전자상거래 기능인 "관련 상품" 기능을 알아 본다.
아마존 성공 사례인 상품 기반 추천의 “같이 구매한 상품들”과 유사한 기능이다.

목차
  • GA에서 기능 활성화
  • API로 데이터 가져오기
    • UI 조회 도구
    • 파이썬 도구
  • 샘플 데이터

1. GA에서 기능 활성화 하기
“관리” -> “보기” -> “전자상거래  설정” 의 관련 상품을 체크한다.


2. API 로 데이터 가져오기

가. UI 조회 도구로 확인 및 가져오기
UI 조회 도구 <- 클릭
https://ga-dev-tools.appspot.com/query-explorer/?
dimensions=ga:queryProductId,ga:relatedProductId
&metrics=ga:correlationScore,ga:queryProductQuantity,ga:relatedProductQuantity
&filters=ga:queryProductId==A
**
GA 계정으로 로그인 후에 원하는 보기를 선택한다.

나. 파이썬 도구로 확인하기
import pandas.io.ga as ga
df = ga.read_ga(
    account_id=“<계정 ID>“,
    profile_id=“<보기 ID>",
    property_id=“<속성 ID>”,
    metrics=['correlationScore','queryProductQuantity','relatedProductQuantity'],
    dimensions=['queryproductid','relatedproductid'],
    #filters=['queryproductid==A'],
    start_date="2016-10-01",
    end_date="2016-11-03",
    index_col=0
)
**
측정 기준/항목 선택은 여기를 클릭 한다.
연동 방법은 판다스에서 구글 애널리틱스 API 연동 을 참고 할 수 있다.

3. 샘플 데이터 보기


**
correlationScore 는 0 에서 1 사이의 값을 가진다.
queryproductid -> relatedproductid 의 신뢰도로 추정되고 1에 가까울 수록 연관성이 높다.
가이드에서 공식을 찾을 수 없었지만, 연관 규칙과 흡사한 것으로 보인다.

Linux Repository 만들기

hortonworks hdp 2.5 repository 가 느린 이유로 로컬  repository가 필요했다.
ambari-server 에서 cluster 구성 시에 참조하는 repository를 만드는 방법이다.

**
여기서는, 서버를 <hdp_repo> 라 이름한다.

가. repository 를 생성 도구들 설치한다.

yum -y install yum-utils createrepo

나. repository 를 위한 데이터를 다운 받는다.

reposync -r HDP-2.5
reposync -r Updates-ambari-2.4.1.0
reposync -r HDP-UTILS-1.1.0.21

**
쉽게 가기 위해 apache 의 기본 폴더인 /var/www/html 에서 작업했다.
각 호출 이름의 폴더 하위에 패키지들이 다운로드 된다.

다. repository 목차를 만든다.

create repo /var/www/html

라. httpd (아파치 웹 서버) 데몬을 구동한다.

마. repository 를 이용할 client 들에 설정을 등록한다.

hdp.repo
[HDP]
name=HDP PACKAGES
baseurl=http://<hdp_repo>
path=/
enabled=1


참조

다운로드 속도가 빠른 CentOS 6.x repository 이다.
[base]
name=CentOS-$releasever - Base
baseurl=http://centos.mirror.cdnetworks.com/$releasever/os/$basearch
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

[updates]
name=CentOS-$releasever - Updates
baseurl=http://centos.mirror.cdnetworks.com/$releasever/updates/$basearch
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

2016년 11월 2일 수요일

hortonworks 하둡 구성하기

호튼에서는
가볍게 기능적인 부분을 확인 할 수 있는 sandbox와
실제 하둡 구성을 도와주고 관리하는 ambari 기반을 제공한다.

두 가지를 구성 할 때, 주의 할 내용들을 요약한다.

  • HDP 2.5 on hortonworks sandbox
  • HDP 2.5 with Ambari 2.4

HDP 2.5 on hortonworks sandbox

sandbox는 기본 8GB 메모리를 요구한다.
hue는 기본 패키지에 없어서 추가로 설치했다.

**
hue 접속 에러 발생 시에 대응 방안이다.

가. 로그 폴더 권한 문제가 발생했다.

/var/log/hue 에 hue 소유자 권한을 준다.
> chown -R hue /var/log/hue

나. django.db 접속 관련 예외가 발생했다.

db를 재생성 한다.

테스트 db를 새롭게 생성한다.
> /usr/lib/hue/build/env/bin/hue testserver
서비스 db를 덮어쓰기 한다.
> cp /usr/lib/hue/desktop/desktop-test.db /var/lib/hue/desktop.db
hue 서비스를 재시작 한다.
> service hue restart


HDP 2.5 with Ambari 2.4

1. 전체 노드에 사전 작업을 한다.

 - 운영체제 (ex, Centos 6.5) 설치한다.
 - /etc/hosts 파일에 FQDN 이름을 정의한다.
 - 각 노드의 hostname 을 정의한다.
 - ssh-keygen 을 통해서 ambari server에서 키 인증 되도록 한다.
 - ntpd 를 설치해서 전체 노드의 시간을 동기화 한다.

2. ambari 서버를 구성한다.

3. amber UI에 접속해서 하둡 클러스터를 구성한다.


참고 이미지