본문 바로가기

MLOps/Development

[티끌모아 빅데이터] 나의 방문 일지 - 제 1편 : 티끌의 시작

-

[티끌 모아 빅데이터] 나의 방문 일지

제1편 : 티끌의 시작

 

나의 방문 일지?

방문 기록 데이터 활용을 위한 데이터 파이프 라인 구축

 

왜 티끌이라고 표현했는가?

나의 방문 기록의 양이 빅데이터에 비하면 매우 "큐트"하기 때문이다.

 

왜 방문 기록을 데이터 사용했는가?

데이터 선정이유는 총 3가지였다.

  1. 데이터 사용에 있어서 API처럼 제한이 없는가?
  2. 매일 수집 가능한 데이터인가?
  3. 데이터 발생에 내가 관여할 수 있는가?

제1편 : 티끌의 시작

시작하기 전

크게 3가지 오픈소스, Airflow, Hadoop, Spark는 현재 설치되어 있다는 사실을 참고할 것


구글 방문 기록 데이터 위치

# /mnt/c/Users/<username>/AppData/Local/Google/Chrome/User Data/Default/History

 

History 파일을 바로 사용하기 위해, 상납자답게 해당 위치에 Docker Volume을 바로 마운트 했다.

H@H:~$ docker run -it 
-p 9870:9870-p 9000:9000 -p 4040:4040 \
-p 8088:8088 -p 8032:8032 -p 12123:12123 \
-v "/mnt/c/Users/<user>/AppData/Local/Google/Chrome/User Data/Default":/home/share airflow/img:pd bash
잠깐!
Q : 포트의 상태가?..
A : 앞에서 말한 오픈소스 사용하려고 포트를 개방했다.

History DB는 Sqlite로 확인할 수 있는데 구성을 보자면 아래와 같고 나는 "urls" Table을 사용할 것이다.

 

파이썬 내장 모듈에 sqlite와 pandas를 사용해서 열어본다

import sqlite3
import pandas as pd

con = sqlite3.connect('./History')
cur = con.cursor()

db_df = pd.read_sql_query("""
            SELECT url, title, datetime(last_visit_time / 1000000 + (strftime('%s', '1601-01-01')), 'unixepoch', 'localtime') as "date" FROM urls 
            WHERE date(last_visit_time / 1000000 + (strftime('%s', '1601-01-01')), 'unixepoch', 'localtime') = "2023-02-14"

""", con)
잠깐!
Q : Datetime Select의 꼬라지가?... 
A : Chrome timestamp 값 포맷이 심상치가 않아서 변경해줘야 한다

참고 : https://stackoverflow.com/questions/20458406/what-is-the-format-of-chromes-timestamps

사진을 보면 알 수 있듯이 오후 11시가 넘어가자 유튜를 본 흉악한 인생을 확인할 수 있다.

(특징 : 코딩애플 재밌음)

잠깐!
Q : 데이터가 별로 안되는데?.. 저걸로 언제 빅데이터 만듦!
A : 파이프라인 구축에 목표를 두고 있음. 내 컴퓨터 대비 1기가 넘어가면 빅데이터기 때문에 여기 세계관에서는 그냥 100MB 넘어가면 빅데이터다라고 스스로 가스라이팅하고 봐주면 감사하다.

HDFS에 데이터를 저장하기 위해 DfsSaver라는 그럴듯한 이름의 클래스를 작성했다.

import pyarrow as pa
import pyarrow.csv as pc


class DfsSaver:
    def __init__(self, history_path):
        self.con = sqlite3.connect(history_path)
        
    def savetohdfs(self, hdfs_path):
        table = pa.Table.from_pandas(db_df)
        fs = pa.hdfs.connect()
        with fs.open(hdfs_path, 'wb') as f:
            pc.write_csv(table, f)
        
        msg = "save"
        
        return msg
    
    def readb(self, today):
        cur  = self.con.cursor()
        db_df = pd.read_sql_query(f"""
            SELECT url, title, datetime(last_visit_time / 1000000 + (strftime('%s', '1601-01-01')), 'unixepoch', 'localtime') as "date" FROM urls 
            WHERE date(last_visit_time / 1000000 + (strftime('%s', '1601-01-01')), 'unixepoch', 'localtime') = '{today}'
        """, self.con)
        con.close()
        
        return db_df

if __name__ == "__main__":
    today = datetime.today().strftime("%Y-%m-%d")
    history_path = './History'
    save_path = f'hdfs:///data/history_{today.replace("-","")}.csv'
    
    dfsaver = DfsSaver(history_path)
    df = dfsaver.readb(today)
    msg = dfsaver.savetohdfs(save_path)
    print(msg)

저장이 잘 되었나 확인을 해보면 다행히 저장이 잘 되었다.

잠깐!
Q : 저장시간은 16일인데 파일은 14일?..
A : 쿠키를 삭제해 버려서 이틀 전꺼로 확인했다

Spark를 사용해서 데이터 처리를 할 예정이기 때문에 Pyspark으로도 잘 열리는지 확인했다.


마무리

  • [티끌 모아 빅데이터] 나의 방문일지 2편을 기대해주세용

-