- 개념

디지털 환경에서 전체 실사용자를 대상으로 대조군(Control Group)과 실험군(Experimental Group)으로 나누어서 어떤 특정한 UI나 알고리즘의 효과를 비교하는 방법론입니다.


- 필요성

상관관계로부터 인과관계를 찾기위해, 정확히 이야기하면 인과관계일 가능성이 높은것을 찾아내기 위함입니다.
그래야 "원인"에 해당하는 요소에 개입을 하여 "결과"에 해당하는 요소가 우리가 원하는 방향으로 변화되도록 할 수 있습니다.

- A/B 테스트에서 사용자를 분리하는 방법

 

1. 노출 분산 방식 : AB Test가 진행되는 페이지가 렌더링 될 때, 비율로 A와 B를 다르게 노출
2. 사용자 분산 방식 : 사용자를 A그룹과 B그룹으로 분리하여, 고정적으로 다른  Variation을 노출
3. 시간 분할 방식 : 초 ~ 분 단위 정도로 시간대를 세밀하게 분할하여 A안과 B안을 노출


- 진행방법
1. 리서치 (AB Test 진행 전 현재 상태의 성과를 측정)
2. 가설수립 
3. A안과 B안 생성 (가설을 기반으로 기존 요소가 담긴 A안과 특정 요소를 변형한 B안을 생성)

4. 테스트 진행
5. 분석 및 의사결정

- 유의사항
1. 무가설

 테스트를 통해 검증하고 싶은 가설이 없다면 실험에서 얻을 수 있는 결과는 거의 없습니다.


2. 통제 변수 관리 실패 

AB테스트가 실패하는 가장 큰 원인은 통제 변수를 식별하지 못했거나, 통제변수를 잘 관리하지 못하는 것입니다.

가설에서 정의한 독립 변수 외 다른 변수가 종속 변수에 영향을 미쳤다면 그 결과를 활용할 수 없습니다.


3. 단순 평균 비교 

종속변수의 변화를 단순 평균과 비교하면 우연에 의한 결과와 실제 효과를 혼동할 수 있습니다.

평균 비교 외에도 분포, 유의수준 등을 종합적으로 고려해서 결과를 해석해야 합니다.


4. 시간 흐름 무시 

시간의 흐름에 따라 종속 변수가 어떻게 변화했는지를 보는것도 중요합니다.


5. 엿보기와 조기중지 

실험중에 계속해서 p-value의 변화를 살펴보다가 p-value가 0.05이하로 내려가는 시점에 갑자기 실험을 중단하는 경우입니다.
통계적으로는 유의미한 차이가 있는 것으로 보이지만, 사실은 실험자가 인위적으로 만들어낸 결과이므로 서비스에 성장에 크게 도움이 되지 않습니다.


6) 과거에 대한 맹신

AB 테스트에서 유의미한 결과가 나왔다고 해서 그것이 계속해서 유의미하다고 보장할 수는 없습니다. 시장 변화, 계절 변화, 유저 변화 등 다양한 요인에 의해 AB테스트 결과는 얼마든지 달라질 수 있기 떄문입니다.

- 종합 : 
1. A/B Test는 두 집단을 임의적으로 나누어야 합니다.
2. 테스트하고자 하는 가설을 명확하게 설정하여 테스트를 진행해야 합니다.


- 참조문서
https://www.ascentkorea.com/ab-test/
https://brunch.co.kr/@digitalnative/19
https://datarian.io/blog/a-b-testing

'데이터분석 > 분석방법론' 카테고리의 다른 글

[분석방법론] LTV 분석  (1) 2024.04.28
[분석방법론] 퍼널 분석  (0) 2024.04.28
[분석방법론] RFM 분석  (0) 2024.04.23
[분석방법론] 코호트 분석  (0) 2024.04.23

 

Airflow의 스케줄링을 이용해서 Spark를 submit하려고했지만 위와 같은 에러가 발생하였습니다.

에러의 원인은 spark의 default connection의 host가 yarn으로 설정되어 있어 발생하였습니다.

 

분산모드가 아닌 로컬 모드에서 테스트로 이루어지는 상황에서 

host가 yarn으로 설정되어 있기 때문에 이러한 에러가 발생하였습니다.

 

https://airflow.apache.org/docs/apache-airflow-providers-apache-spark/stable/operators.html 참조

 

spark를 submit할때는 spark conection이 올바르게 설정되어 있어야합니다.

 

만약 master를 yarn으로 실행시키실 경우(분산모드) host를 yarn으로 변경해주시고,
local에서 실행하실 경우 (standalone모드) host를 local로 변경해주세요.

python을 이용하는 개발자로써 DataFrame형태의 데이터를 자주 접합니다.

 

python에서 hdfs에 dataframe 데이터를 저장하는 방법을 공유 합니다.

 

#hdfs 관련 라이브러리 로드
from hdfs import InsecureClient

#client 선언
hdfs_url = "http://<HDFS-NAMENODE-HOST>:<HDFS-NAMENODE-PORT>"
client = InsecureClient(hdfs_url, user="<HDFS-USER>")

#원하는 저장 경로(csv파일 또는 parquet 파일로 저장가능)
hdfs_path = "/path/to/your/directory/{file_name}.csv"
hdfs_path = "/path/to/your/directory/{file_name}.parquet"


with client.write(hdfs_path, overwrite=True) as writer:
    df.to_csv(writer, index=False, header=True)

 

 

Selenium을 통한 크롤링을 Airflow환경에서 테스트 중에 발생한 에러입니다.

확인 결과 구글(브라우저)이 설치되어 있지 않아 에러가 발생 했습니다.

 

Selenium에서 사용 중인 브라우저가 설치되어있는지 확인해보시고,

설치가 되어있지 않다면 아래 방법으로 설치해주시면 해결됩니다 !

 

1. 패키지 리스트 업데이트

sudo apt update

 

2. 구글 다운로드 및 설치 

 

#구글 패키지 다운로드
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb

#구글 패키지 다운로드 파일 설치
sudo apt install ./google-chrome-stable_current_amd64.deb

3. 설치 확인

google-chrome-stable --version

 

이후 실행하면 정상적으로 접속이 가능한게 확인 되었습니다.

 

최근 airflow로 batch작업을 이관 하던 중 dataframe을 DB로 바로 저장할 수 있는 라이브러리를 찾아서 소개시켜드립니다.

 

insert문을 실행하지 않고 python으로 생성한 dataframe을 DB로 저장 시킵니다.

from sqlalchemy import create_engine
import pandas as pd

#test.csv를 dataframe형태로 읽기
df = pd.read_csv('test.csv')

#mysql+pymysql은 mairaDB에 대한 sqlalchemy의 드라이버를 의미합니다.
#SQLite 데이터베이스는 mysql+pymysql대신 sqlite를 적어주시면 됩니다.
connection_string = 'mysql+pymysql://유저명:password@localhost:3306/database'

#mariadb에 연결
engine = create_engine(connection_string)

#dataframe을 mairadb에 저장
#if_exists는 테이블이 이미 존재하는 경우 어떻게 처리할지에 대한 매개변수입니다. replace를 입력하여 기존 테이블을 대체할 수 있습니다.
df.to_sql("table명", engine, index = False, if_exists="replace")

 

python을 사용하시는 분들은 dataframe을 이용해 편리하게 DB에 데이터를 적재할 수 있습니다.

cat /dev/null > 파일명

 

ex) cat /dev/null > test.txt

 

/dev/null 은 리눅스 시스템에서 빈 파일 또는 데이터를 버리는 특별한 장치 파일입니다. 데이터가 이곳으로 전송되면 버려지게 됩니다. 

cat을 사용해서 파일의 내용을 표준출력으로 /dev/null로 리다이렉션하여 파일 내용을 삭제합니다.

가장 중요 - 모든 에러는 log를 확인하는 습관을 들여야하며, log안에서 해결가이드를 얻을 수 있었습니다.

 

1. ERROR : Cannot set priority of datanode process xxxx

-> /dfs/journalnode/ 모든 파일을 삭제하고 초기화를 진행한뒤 namenode 실행하니 정상적으로 namenode 실행되었습니다.

설정을 변경하면서 namenode를 초기화 하는 과정에 있어서 기존의 폴더들에 파일이 존재하면 이미 실행되고 있다고 인식할 수 있습니다.

namenode를 초기화 하기위해서는 하위 폴더들의 파일을 정리해주는 과정이 필요합니다.

 

2. hdfs-site.xml에서 rpc-adress의 port를 8020으로 설정했을때의 hdfs 실행 방법

hdfs dfs -ls hdfs:://nn01:8020/(주소 직접입력 필요)

저는 core-site.xml에 port를 9000으로 설정하여 알수 없는 충돌이 일어난것으로 보입니다.

되도록 기본port를 수정하지 않는 선에서 xml파일들을 설정하면 충돌을 피할 수 있습니다.

 

 

xml 폴더들의 설정을 변경하기 전에 기본port를 파악하고있으면, port에 대한 충돌을 피할 수 있습니다.

 

 

- HA(High Availability)구성을 위한 zookeeper 설치 

1. zookeeper를 사용할 노드에 zookeeper user 생성

2. namenode(nn01)에서 wget을 통하여 zookeeper 설치

3. conf/zoo_sample.cfg의 파일을 conf/zoo.cfg파일로 복사하여 zoo.cfg의 파일을 수정

4. 수정된 zoo.cfg파일을 포함하여 새롭게 zookeeper파일 압축하여 다른 zookeeper 노드들에 배포

5. 배포된 노드들에서 zookeeper파일을 압축해제

6. zookeeper 사용 노드들에 myid 지정(nn01은 1, rm01은 2, jn01은 3으로 지정하였습니다.)

7. zookeeper설치 폴더/bin/zkServer.sh start 명렁어를 각 zookeeper 노드들에서 실행

-> 만약 zookeeper 노드가 총 3대라면 follower mode2대, leader mode 1대의 비율이 되야합니다.

 

8. zookeeper 종료는 zookeeper설치 폴더/bin/zkServer.sh stop 명령어를 통해 모두 종료

 

zookeeper 실행시

Error contacting service. It is probably not running 에러가 발생하였습니다.

위 에러 해결방법은 https://colly.tistory.com/15 작성하였습니다.

 

 

- Hadoop 설치 

1. 모든 node에 hadoop user 생성

2. namenode(nn01)에서 wget을 통하여 hadoop 설치 

3. core-site.xml, hdfs-site.xml, mapred-site.xml, yarn-site.xml, hadoop-env.sh(java_home환경변수 설정, hadoop pid 설정) 수정 후 재압축 하여 모든 노드에 배포

4. 모든 서버에 /etc/profile.d/hadoop.sh 파일에서 hadoop_home, path 설정 후 생성 

 

-zookeeper , hadoop 실행 순서

 

1. 주키퍼 장애 컨트롤러(zk) 초기화

hadoop설치 폴더/bin/hdfs zkfc -formatZK (최초 실행시 1번만 실행 / namenode에서 실행 - nn01)

2. 저널노드 실행

hadoop설치 폴더/bin/hdfs --daemon start journalnode(각각의 저널노드에서 실행 - nn01)

3. 네임노드(namenode) 초기화 

hadoop설치 폴더/bin/hdfs namenode -format (최초 실행시 1번만 실행 / namenode에서 실행 - nn01)

4. 액티브 네임노드(active namenode)실행

hadoop설치 폴더/bin/hdfs --daemon start namenode(namenode에서 실행 - nn01 )

5. 액티브 네임노드용 주키퍼 장애 컨트롤러(zkfc)를 실행

hadoop설치 폴더/bin/hdfs --daemon start zkfc(namenode에서 실행 - nn01)

6. 데이터 노드 실행

hadoop설치 폴더/sbin/hadoop-daemons.sh start datanode(namenode에서 실행 - nn01)

7. 스탠바이 네임 노드 포맷, 액티브 네임노드의 메타 데이터를 스탠바이 네임노드로 복사

hadoop설치 폴더/bin/hdfs namenode -bootstrapStandby(stanbynamenode에서 실행 - rm01)

8. 스탠바이 네임노드 실행

hadoop설치 폴더/bin/hdfs --daemon start namenode(standbynamenode에서 실행 - rm01)

9. 스탠바이 네임노드에서 주키퍼 장애 컨트롤러 실행

hadoop설치 폴더/bin/hdfs --daemon start zkfc(standbynamenode에서 실행 - rm01)

10. yarn클러스터 실행

hadoop설치 폴더/sbin/start-yarn.sh(rm01에서 실행)

11. 액티브 - 스탠바이 네임노드 확인

hadoop 설치 폴더/bin/hdfs haadmon -getServiceState nn01 (active로 표시되야함)

hadoop 설치 폴더/bin/hdfs haadmon -getServiceState rm01 (standby로 표시되야함)

12. 각 서버별 실행된 파일 확인

jps로 확인

 

 

 

 

 

 

 

+ Recent posts