GitHub 이벤트 스트림
GitHub 이벤트 스트림
GitHub 이벤트 스트림에서 데이터를 소비하는 Pinot 클러스터와 실시간 테이블을 설정하는 단계를 알려드려요.
이 레시피에서는 GitHub 이벤트 스트림에서 흘러 들어오는 데이터를 소비하는 Apache Pinot 클러스터와 실시간 테이블을 설정할 거예요. 이 스트림은 GitHub pull request를 기반으로 하며 Kafka를 사용해요.
이 레시피에서는 다음 단계를 수행해요:
- Pinot 클러스터 설정: a. zookeeper 시작 b. controller 시작 c. broker 시작 d. server 시작
- Kafka 클러스터 설정
pullRequestMergedEvents라는 Kafka 토픽 생성pullRequestMergedEvents라는 실시간 테이블과 스키마 생성- GitHub events API에서 읽어 병합된 pull request에 대한 이벤트를 토픽에 게시하는 작업 시작
- 실시간 데이터 쿼리
단계 (Steps)
Docker 이미지 또는 launcher 스크립트 사용
Docker
Docker 이미지 가져오기
최신 Docker 이미지를 가져오세요.
export PINOT_VERSION=latest
export PINOT_IMAGE=apachepinot/pinot:${PINOT_VERSION}
docker pull ${PINOT_IMAGE}
전체 버전 (Long version)
Pinot 클러스터 설정
고급 Pinot 설정의 지침을 따라 다음 구성 요소로 Pinot 클러스터를 설정하세요:
- Zookeeper
- Controller
- Broker
- Server
- Kafka
Kafka 토픽 생성
데모용 pullRequestMergedEvents라는 Kafka 토픽을 만드세요.
docker exec \
-it kafka \
/opt/kafka/bin/kafka-topics.sh \
--bootstrap-server kafka:9092 --partitions=1 \
--replication-factor=1 --create \
--topic pullRequestMergedEvents
Pinot 테이블과 스키마 추가
스키마는 examples/stream/githubEvents/pullRequestMergedEvents_schema.json에 있으며 아래에도 게시돼 있어요.
{
"schemaName": "pullRequestMergedEvents",
"dimensionFieldSpecs": [
{
"name": "title",
"dataType": "STRING",
"defaultNullValue": ""
},
...
],
"metricFieldSpecs": [
{
"name": "count",
"dataType": "LONG",
"defaultNullValue": 1
},
...
],
"dateTimeFieldSpecs": [
{
"name": "mergedTimeMillis",
"dataType": "TIMESTAMP",
"format": "1:MILLISECONDS:TIMESTAMP",
"granularity": "1:MILLISECONDS"
}
]
}
(전체 스키마 정의는 컬럼 title, labels, userId, userType, authorAssociation, mergedBy, assignees, authors, committers, requestedReviewers, requestedTeams, reviewers, commenters, repo, organization을 dimension으로, count, numComments, numReviewComments, numCommits, numLinesAdded, numLinesDeleted, numFilesChanged, numAuthors, numCommitters, numReviewers, numCommenters, createdTimeMillis, elapsedTimeMillis를 metric으로 포함해요.)
테이블 구성은 examples/stream/githubEvents/docker/pullRequestMergedEvents_realtime_table_config.json에 있으며 아래에도 게시돼 있어요.
참고: 미리 구성된 클러스터에서 설정하는 경우 Kafka 클러스터의 구성에 따라
stream.kafka.broker.list속성을 올바르게 설정하세요.
{
"tableName": "pullRequestMergedEvents",
"tableType": "REALTIME",
"segmentsConfig": {
"timeColumnName": "mergedTimeMillis",
"timeType": "MILLISECONDS",
"retentionTimeUnit": "DAYS",
"retentionTimeValue": "60",
"schemaName": "pullRequestMergedEvents",
"replication": "1",
"replicasPerPartition": "1"
},
"tenants": {},
"tableIndexConfig": {
"loadMode": "MMAP",
"invertedIndexColumns": [
"organization",
"repo"
],
"streamConfigs": {
"streamType": "kafka",
"stream.kafka.topic.name": "pullRequestMergedEvents",
"stream.kafka.decoder.class.name": "org.apache.pinot.plugin.inputformat.json.JSONMessageDecoder",
"stream.kafka.consumer.factory.class.name": "org.apache.pinot.plugin.stream.kafka30.KafkaConsumerFactory",
"stream.kafka.broker.list": "kafka:9092",
"realtime.segment.flush.threshold.time": "12h",
"realtime.segment.flush.threshold.rows": "100000",
"stream.kafka.consumer.prop.auto.offset.reset": "smallest"
}
},
"metadata": {
"customConfigs": {}
}
}
다음 명령으로 테이블과 스키마를 추가하세요:
$ docker run \
--network=pinot-demo \
--name pinot-streaming-table-creation \
${PINOT_IMAGE} AddTable \
-schemaFile examples/stream/pullRequestMergedEvents/pullRequestMergedEvents_schema.json \
-tableConfigFile examples/stream/pullRequestMergedEvents/docker/pullRequestMergedEvents_realtime_table_config.json \
-controllerHost pinot-controller \
-controllerPort 9000 \
-exec
Executing command: AddTable -tableConfigFile examples/stream/pullRequestMergedEvents/docker/pullRequestMergedEvents_realtime_table_config.json -schemaFile examples/stream/pullRequestMergedEvents/pullRequestMergedEvents_schema.json -controllerHost pinot-controller -controllerPort 9000 -exec
Sending request: http://pinot-controller:9000/schemas to controller: 20c241022a96, version: Unknown
{"status":"Table pullRequestMergedEvents_REALTIME succesfully added"}
이벤트 게시 (Publish events)
GitHub 이벤트를 Kafka 토픽으로 스트리밍 시작:
전제 조건: GitHub에서 개인 액세스 토큰을 생성하세요.
$ docker run --rm -ti \
--network=pinot-demo \
--name pinot-github-events-into-kafka \
-d ${PINOT_IMAGE} StreamGitHubEvents \
-schemaFile examples/stream/pullRequestMergedEvents/pullRequestMergedEvents_schema.json \
-topic pullRequestMergedEvents \
-personalAccessToken <your_github_personal_access_token> \
-kafkaBrokerList kafka:9092
짧은 버전 (Short version)
설정의 짧은 방법은 다음 명령을 사용하는 것이에요. 이전에 실행 중인 Pinot 서비스를 중지했는지 확인하세요.
$ docker run --rm -ti \
--network=pinot-demo \
--name pinot-github-events-quick-start \
${PINOT_IMAGE} GitHubEventsQuickStart \
-personalAccessToken <your_github_personal_access_token>
Launcher 스크립트
Pinot 받기
소스에서 빌드의 지침을 따라 최신 Pinot 코드를 받으세요.
전체 버전 (Long version)
Pinot 클러스터 설정
고급 Pinot 설정의 지침을 따라 다음 구성 요소로 Pinot 클러스터를 설정하세요:
- Zookeeper
- Controller
- Broker
- Server
- Kafka
Kafka 토픽 생성
Apache Kafka를 다운로드하세요.
데모용 pullRequestMergedEvents라는 Kafka 토픽을 만드세요.
$ bin/kafka-topics.sh \
--create \
--bootstrap-server localhost:19092 \
--replication-factor 1 \
--partitions 1 \
--topic pullRequestMergedEvents
Pinot 테이블과 스키마 추가
(스키마 및 테이블 구성은 릴리스의 /examples/stream/githubevents/에서 찾을 수 있으며 Docker 섹션과 동일한 내용이에요. stream.kafka.broker.list는 localhost:19092로 설정돼 있어요.)
다음 명령으로 테이블과 스키마를 추가하세요:
$ bin/pinot-admin.sh AddTable \
-tableConfigFile $PATH_TO_CONFIGS/examples/stream/githubEvents/pullRequestMergedEvents_realtime_table_config.json \
-schemaFile $PATH_TO_CONFIGS/examples/stream/githubEvents/pullRequestMergedEvents_schema.json \
-exec
이벤트 게시 (Publish events)
GitHub 이벤트를 Kafka 토픽으로 스트리밍 시작:
전제 조건: GitHub에서 개인 액세스 토큰을 생성하세요.
$ bin/pinot-admin.sh StreamGitHubEvents \
-topic pullRequestMergedEvents \
-personalAccessToken <your_github_personal_access_token> \
-kafkaBrokerList localhost:19092 \
-schemaFile $PATH_TO_CONFIGS/examples/stream/githubEvents/pullRequestMergedEvents_schema.json
짧은 버전 (Short version)
위의 모든 단계를 설정하는 단일 명령:
$ bin/pinot-admin.sh GitHubEventsQuickStart \
-personalAccessToken <your_github_personal_access_token>
Kubernetes 클러스터
이미 Pinot과 Kafka가 있는 Kubernetes 클러스터가 있다면(Kubernetes 설치 참고), 먼저 토픽을 만든 다음 다음을 사용해 테이블과 스트리밍을 설정하세요:
$ cd kubernetes/helm
$ kubectl apply -f pinot-github-realtime-events.yml
쿼리 (Query)
쿼리 콘솔을 열어 데이터를 확인하세요.
SuperSet으로 시각화
SuperSet을 사용해 이 데이터를 시각화할 수 있어요. 우리가 캡처한 몇 가지 흥미로운 인사이트는 다음과 같아요:
봉쇄 기간 동안 가장 활동적인 조직 목록
Apache 조직에서 커밋 수별 저장소
SuperSet과 통합하려면 SuperSet 통합 페이지를 확인하세요.