오픈소스

Eventsim 를 사용하여 음악 스트리밍 데이터 생성하기

JMDev 2023. 10. 23. 10:49

Eventsim이라는 오픈소스를 활용하여 로그데이터를 분산처리 혹은 집계하는 시도를 해보려고 합니다!

그 이전에 Eventsim이라는 오픈소스를 이해하고 정리하는 과정일 필요한 것 같아 정리해봅니다.

 

https://github.com/Interana/eventsim

 

GitHub - Interana/eventsim: Event data simulator. Generates a stream of pseudo-random events from a set of users, designed to si

Event data simulator. Generates a stream of pseudo-random events from a set of users, designed to simulate web traffic. - GitHub - Interana/eventsim: Event data simulator. Generates a stream of pse...

github.com

아래부터는 eventsim의 Git에  Readme.md를 번역한 것입니다! (GPT 활용)

 

Eventsim
========

Eventsim은 테스팅과 데모용 이벤트 데이터를 생성하는 프로그램입니다. 이 프로그램은 Scala로 작성되었으며, 가상의 음악 웹사이트(예: Spotify 같은)의 페이지 요청을 복제하여 실 사용 데이터처럼 보이지만 완전히 가짜 데이터를 생성합니다. 프로그램을 구성하여 몇 시간 동안 몇 명의 사용자에 대한 데이터부터 많은 년 동안 많은 사용자에 대한 데이터까지 원하는 만큼의 데이터를 생성할 수 있습니다. 데이터를 파일에 작성하거나 Apache Kafka로 파이프 아웃할 수 있습니다.

이 가짜 데이터는 제품 개발, 정확도 테스팅, 데모, 성능 테스팅, 교육 또는 실제로 보이는 데이터 스트림이 유용한 다른 모든 곳에서 사용할 수 있습니다. 이 데이터를 기계 학습 알고리즘 연구에 사용하면 안 되며, 실제 사람들의 행동을 이해하기 위해 이 데이터를 사용해서는 절대로 안 됩니다.

통계 모델
=================

이 시뮬레이터는 실제 사용자의 행동에 대한 관찰을 기반으로 작성되었습니다. 데이터가 실제처럼 보이도록 하고 싶었으며: 사용자는 무작위로 출입하며, 일부 사용자는 다른 사용자보다 훨씬 더 오래 머무를 것이며, 사용자는 밤 중간보다 낮 중간에 서비스를 사용할 가능성이 더 높으며, 주말과 공휴일에 서비스를 사용할 가능성이 훨씬 낮습니다.

이를 실현하기 위해 다음과 같은 작업을 수행했습니다:

* "감쇠" 요인을 0으로 설정하면, 사용자는 포아송(Poisson) 프로세스(기억 없음)에 따라 사이트에 무작위로 도착하지만 세션 간에 최소 30분 간격이 있습니다.
* 이벤트 간의 시간은 로그 정규 분포에 의해 주어집니다.
* 세션이 시작되면, 사용자는 세션 종료를 포함하여 현재 상태에 따라 각 상태 전환의 확률에 따라 일련의 상태를 무작위로 순회합니다.
* 평균적으로 사용자는 하루 중 어느 시간이나 요일에 관계없이 세션에서 동일한 방식으로 행동할 것입니다.
* 주말과 공휴일에 대한 감쇠를 활성화하면, 사용자가 주말과 공휴일에 도착할 확률이 떨어집니다. 확률은 기본적으로 자정 주변 몇 시간 동안 선형적으로 조정됩니다.
* 야간 감쇠를 활성화하면, 사용자가 밤 중간에 도착할 확률은 낮 중간에 도착할 확률보다 낮습니다. 확률은 대략 사인파를 따릅니다.

시뮬레이션 작동 방식
========================

시뮬레이터를 실행하면 먼저 무작위로 선택된 속성을 가진 사용자 세트를 생성합니다. 이에는 이름과 위치와 같은 속성뿐만 아니라 사용자 참여와 같은 사용 특성이 포함됩니다. Eventsim은 의사 난수 생성기를 사용합니다: 생성기는 결정적이지만 무작위로 보입니다.

구성 파일(예제는 `examples`에 포함되어 있음)을 지정해야 합니다. 이 파일은 세션이 생성되고 가짜 웹사이트가 어떻게 작동하는지에 대한 정보를 지정합니다. 시뮬레이터는 또한 장소, 곡 이름, 사용자 에이전트와 같은 다양한 매개변수에 대한 분포를 설명하는 데이터 파일 세트를 로드합니다.

시뮬레이터는 각 세션의 다음 이벤트의 타임스탬프로 정렬된 사용자 세션의 우선 순위 큐를 생성함으로써 작동합니다. 시뮬레이터는 각 세션을 큐에서 선택하고 이벤트의 세부 정보를 출력한 다음, 각 사용자에 대해 세션에서 다음 이벤트를 결정하고(또는 사용자에 대해 새 세션을 생성하고) 세션을 큐에 다시 넣습니다.

시뮬레이터가 세션에서 다음 이벤트를 파악하면, 현재 상태에서 다른 상태로의 가능한 모든 전환을 살펴봅니다. 모든 전환이 1.0의 확률을 가지면, 항상 다음 페이지가 있을 것입니다. 그러나 확률이 n < 1.0이면, 확률 1.0 - n으로 세션이 종료되고 사용자는 미래의 세션에서 다음으로 볼 수 있습니다.

대부분의 경우, 다음 이벤트는 현재 이벤트 후 로그 정규분포된 비결정적 시간에 발생합니다. 그러나 두 가지 예외가 있습니다: "nextSong" 이벤트와 리

다이렉트. 다음 곡 이벤트는 일반적으로 현재 곡의 지속 시간 후에 발생합니다. 리다이렉트는 고정된 시간 후에 발생합니다(이를 통해 양식을 제출한 후 새 페이지로 리다이렉트되는 동작을 모델링했습니다).

기본적으로 곡 제목은 얼마나 인기 있는지에 따라 무작위로 선택됩니다. 그러나 선택적으로, 시뮬레이터는 유사한 곡에 대한 데이터를 사용하여 유사한 곡 시퀀스를 선택할 수 있습니다. (이를 수행하려면 유사한 곡 데이터 파일이 필요합니다. 그 파일은 너무 크기 때문에 포함되지 않았지만, 그것을 생성하는 유틸리티를 포함했습니다. 이를 생성하려면 eventsim을 `generate-similars` 옵션으로 실행하세요.)

참고: 시뮬레이터의 현재 버전은 음악 웹사이트에 대해 하드 코딩되어 있습니다. 다른 유형의 사이트에 대해 작동하도록 수정할 수 있지만, 이 작업은 코드에 대한 수정이 필요할 것이며(구성 파일만으로는 아니라), 아마도 코드를 수정해야 할 것입니다.

구성 파일
===========

샘플 구성 파일을 살펴보세요. 이것은 JSON 파일로, 키-값 쌍을 가지고 있습니다. 여기 값의 설명이 있습니다(많은 값이 명령 줄 옵션과 일치합니다):

* `seed`: 의사-난수 생성기를 위한 것입니다. 이 값을 변경하면 출력이 변경됩니다(다른 모든 매개변수가 동일한 경우).
* `alpha`: 사용자에 대한 이벤트 간의 예상 초 단위 시간입니다. 이것은 로그 정규 분포에서 무작위로 생성됩니다.
* `beta`: 예상 세션 도착 시간 간격(초 단위)입니다. 이것은 30분 더하기 지수 분포에서 무작위로 선택된 값입니다.
* `damping`: 일일 주기의 깊이를 제어합니다(큰 값은 더 강한 주기를 생성하고, 작은 값은 더 약한 주기를 생성합니다).
* `weekend-damping`: 주중과 주말 트래픽 양의 차이를 제어합니다.
* `weekend-damping-offset`: 주말/공휴일이 시작되는 시간을 제어합니다(자정에 상대적으로), 분 단위로 지정합니다.
* `weekend-damping-scale`: 트래픽 감소 기간을 제어합니다, 분 단위로 지정합니다.
* `session-gap`: 세션 간의 최소 시간, 초 단위로 지정합니다.
* `start-date`: 데이터의 시작 날짜(IS0 8601 형식).
* `end-date`: 데이터의 종료 날짜(IS0 8601 형식).
* `n-users`: start-date 시점의 사용자 수.
* `first-user-id`: 첫 번째 사용자에 할당된 사용자 ID(이들은 순차적으로 할당됩니다).
* `growth-rate`: 사용자의 연간 성장률.
* `tag`: 출력의 각 줄에 추가된 태그.

또한 이벤트 상태 기계를 지정합니다. 각 상태에는 페이지, HTTP 상태 코드, 사용자 수준 및 인증 상태가 포함됩니다. 상태는 사용자의 상태를 설명하는 데 사용해야 합니다: 미등록, 로그인, 로그아웃, 취소 등. 페이지는 사용자의 페이지를 설명하는 데 사용됩니다. 상태 기계를 지정하는 방법은 다음과 같습니다:

* 전환: 각 전환 전후의 페이지와 상태 쌍을 설명하고 전환의 확률을 지정합니다.
* 새 사용자: 각 새 사용자에 대한 페이지와 상태를 설명합니다(처음 도착할 때 그 상태 중 하나를 가질 확률을 포함하여).
* 새 세션: 각 새 세션에 대한 페이지와 상태를 설명합니다.
* 사용자 세부 정보 표시: 각 상태에 대해 사용자가 생성된 이벤트 로그에 표시되는지 여부를 지정합니다.

시뮬레이터를 실행할 때, alpha와 beta의 평균 값을 지정하고 시뮬레이터는 특정 사용자에 대한 값을 선택합니다.

사용법
=====

실행 파일을 빌드하려면 실행하세요.

    $ sbt assembly
    $ # 스크립트가 실행 가능한지 확인하세요
    $ chmod +x bin/eventsim

(참고로, eventsim은 Java 8이 필요합니다.)

프로그램은 명령 줄 옵션을 여러 개 받을 수 있습니다.

    $ bin/eventsim --help
        -a, --attrition-rate  <arg>    연간 사용자 이탈률(현재의 일부로서, 1% => 0.01)(기본값 = 0.0)
        -c, --config  <arg>            구성 파일
            --continuous               연속 출력
            --nocontinuous             한 번에 모두 실행
        -e, --end-time  <arg>          데이터의 종료 시간(기본값 = 2015-08-12T14:56:25.006)
        -f, --from  <arg>              x일 전부터(기본값 = 15)
            --generate-counts          청취 횟수 파일 생성 후 중지
            --nogenerate-counts

        정상적으로 실행
            --generate-similars        유사한 노래 파일 생성 후 중지
            --nogenerate-similars      정상적으로 실행
        -g, --growth-rate  <arg>       연간 사용자 성장률(현재의 일부로서, 1% => 0.01)(기본값 = 0.0)
            --kafkaBrokerList  <arg>   kafka 브로커 목록
        -k, --kafkaTopic  <arg>        kafka 주제
        -n, --nusers  <arg>            초기 사용자 수(기본값 = 1)
        -r, --randomseed  <arg>        무작위 시드
        -s, --start-time  <arg>        데이터의 시작 시간(기본값 = 2015-08-05T14:56:25.040)
            --tag  <arg>               각 줄에 적용된 태그(예: A/B 테스트 그룹)
        -t, --to  <arg>                y일 전까지(기본값 = 1)
        -u, --userid  <arg>            첫 번째 사용자 ID(기본값 = 1)
            --help                     도움말 메시지 표시

       후행 인수:
        output-file (필수 아님)   파일 이름

구성 파일만 필요합니다.

매개변수는 세 가지 방법으로 지정할 수 있습니다: 기본값을 받아들일 수 있고, 구성 파일에서 지정할 수 있으며, 명령 줄에서 지정할 수 있습니다. 구성 파일 값은 기본값을 무시하며; 명령 줄 옵션은 모든 것을 무시합니다.

약 2.5M 이벤트에 대한 예(연간 1% 성장률로 1년 동안 1000명의 사용자):

    $ bin/eventsim -c "examples/site.json" --from 365 --nusers 1000 --growth-rate 0.01 data/fake.json
    초기 사용자 수: 1000, 최종 사용자 수: 1010
    이벤트 생성을 시작합니다.
    Damping=0.0625, 주말 Damping=0.5
    시작: 2013-10-06T06:27:10, 종료: 2014-10-05T06:27:10, 지금: 2014-10-05T06:27:07, 이벤트:2468822

더 많은 이벤트에 대한 예(연간 30% 성장률로 1년 동안 30,000명의 사용자):

    $ bin/eventsim -c "examples/site.json" --from 365 --nusers 30000 --growth-rate 0.30 data/fake.json

병렬로 큰 데이터 세트 빌드
===================================
많은 데이터를 매우 빠르게 생성해야 하는 경우 이 애플리케이션의 여러 인스턴스를 동시에 실행할 수 있습니다. 이를 수행하려면 다음 전략을 권장합니다:

* 각 인스턴스에 대해 다른 무작위 시드를 사용하세요. 이렇게하면 각 인스턴스가 다른 데이터를 생성하게 됩니다.
* 각 인스턴스에 대해 다른 시작 사용자 ID를 사용하세요(범위가 겹치지 않도록 확인하세요). 이렇게하면 각 인스턴스가 다른 사용자 ID로 데이터를 생성합니다.
* eventsim의 각 인스턴스에 대해 구성 파일 세트를 만듭니다. 이렇게하면 데이터를 다시 만들 수 있으며 데이터의 세부 정보를 기억할 수 있습니다.
* 서로 다른 시간 기간에 대한 데이터를 생성하지 마세요. 생성기는 시작 및 종료 날짜를 넘어서 전체 세션을 생성하지 않으므로 파일 간에 일부 불완전한 데이터를 찾을 수 있습니다.

멋진 예
==============

A/B 테스트를 시뮬레이트하려면 다른 세트의 회원 ID, 다른 태그 및 alpha, beta, 전환 확률 또는 성장률에 대한 다른 매개변수를 사용하여 동일한 시간 기간에 대한 여러 데이터 세트를 생성합니다. 예를 들어, 두 명령을 사용하여 서로 다른 특성을 가진 약 5000명의 사용자에 대한 두 파일을 생성할 수 있습니다:

        $ bin/eventsim --config examples/example-config.json --tag control -n 5000 \
        --start-time "2015-06-01T00:00:00" --end-time "2015-09-01T00:00:00" \
        --growth-rate 0.25 --userid 1 --randomseed 1 control.data.json
        노래 파일 로드 중...
        385000 ...노래 파일 로드 완료. 385252 트랙 로드됨.
        유사한 노래 파일 로드 중...
        유사한 노래 파일을 로드할 수 없습니다(누락된 경우 걱정하지 마세요).

        초기 사용자 수: 5000, 최종 사용자 수: 5335
        시작: 2015-06-01T00:00, 종료: 2015-09-01T00:00
        이벤트 생성을 시작합니다.
        Damping=0.09375, 주말 Damping=0.5
        지금: 2015-08-31T15:38:02, 이벤트:1430000, Rate: 147058 eps

        $bin/eventsim --config examples/alt-example-config.json --tag test -n 5000 \
        > --start-time "2015-06-01T00:00:00" --end-time "2015-09-01T00:00:00" \
        > --growth-rate 0.25 --userid 5336 --randomseed 2 test.data.json


        노래 파일 로드 중...
        385000 ...노래 파일 로드 완료. 385252 트랙 로드됨.
        유사한 노래 파일 로드 중...
        유사한 노래 파일을 로드할 수 없습니다(누락된 경우 걱정하지 마세요).

        초기 사용자 수: 5000, 최종 사용자 수: 5335
        시작: 2015-06-01T00:00, 종료: 2015-09-01T00:00
        이벤트 생성을 시작합니다.
        Damping=0.09375, 주말 Damping=0.5
        지금: 2015-08-31T15:38:02, 이벤트:1430000, Rate: 147058 eps

이제 두 데이터 세트를 분석하여 테스트 및 제어 그룹의 사용자 행동이 어떻게 다른지 비교할 수 있습니다.