지속 가능한 생산은 오늘날의 제조 시장에서 필수적이게 되었습니다. 2022년 조사 에 따르면, 제조업체의 79%가 구체적인 지속 가능성 목표를 가지고 있다고 국가 제조업협회가 보고했습니다. 알루미늄 시트 및 호일 생산의 세계적인 선두주자 중 한 곳이 이 도전을 직면하고, Databricks를 사용하여 생산 라인 데이터를 분석하였습니다. 이 알루미늄 제조 회사는 제품 품질을 향상시키고, 자원을 최적화하며, 환경 영향을 줄이는 것을 목표로 합니다.
알루미늄 생산은 원자재를 완성품으로 변환하는 데 많은 단계가 포함된 복잡한 과정입니다. 이 과정 전반에 걸쳐 지속 가능성을 보장하기 위해, 회사는 시작부터 끝까지 환경 영향을 추적하는 보고 시스템을 개발하였습니다. 이 노력에서 중요한 지표 중 하나는 회수 비율입니다. 이는 폐자재에서 새 제품으로 성공적으로 재활용된 알루미늄의 비율을 나타냅니다. 이를 정확하게 측정하려면, 회사는 먼저 최종 제품을 만드는 데 필요한 각 단계를 식별해야 하며 (예: "배치 추적"), 그 다음 각 단계에서 발생하는 자재 낭비를 계산해야 합니다.
그러나 데이터는 엄청나게 많습니다. 생산 시스템은 최대 40단계의 연결된 생산 배치로 10억 행 이상을 기록했습니다. 전통적인 DataFrame 방법은 이러한 관계를 데이터에서 파싱하는 데 적합하지 않았습니다. 회사는 Pandas UDF를 사용하는 것을 고려했지만, 데이터의 크기와 복잡성이 증가함에 따라 이 UDF들은 성능 제한을 보였습니다. 이렇게 큰 데이터셋에서 깊게 중첩된 관계를 식별하려면 그 관계를 그래프로 모델링해야 했습니다. GraphFrames를 사용하여 구축된 솔루션은 Databricks ML Runtime 에 포함되어 있고 Databricks의 Photon Engine으로 최적화되어, 좋은 성능과 확장성으로 end-to-end 배치 추적을 수행했습니다.
제조 시스템은 단일 원료를 수백 단계의 중간 과정을 거쳐 수백 가지의 최종 제품으로 정제할 수 있습니다. 각각의 하위 프로세스는 자신의 입력 및 출력 자료에 대한 정보를 내보낼 수 있지만, 회복률과 같은 주요 지속 가능성 지표를 측정하려면 end-to-end 순서의 분석이 필요합니다. 목표는 일련의 중간 배치 ID를 통해 출력 배치를 원본 배치에 연결하는 것입니다. 전체 추적이 가능해지면, 우리는 각 단계에서 잃어버린 자료를 결정할 수 있습니다.
DataFrame에 행으로 저장된 생산 배치를 추적하여 최종 제품의 생산에서 손실된 총 재료를 계산하는 것은 어려울 수 있습니다. DataFrame은 비즈니스 객체 집합에 대한 많은 분석 쿼리에 유용하지만, 복잡한 객체 계층을 모델링하고 분석하는 기능이 부족합니다. GraphFrames는 대규모 객체 계층을 다루는 데 유용한 데이터 구조입니다. 그들은 계층을 그래프 로 모델링합니다:
GraphFrames 라이브러리에는 그래프 데이터를 처리하는 데 많은 내장 도구가 있습니다. Pregel이라는 한 종류의 알고리즘은 그래프의 가장자리를 따라 정보를 전송하여 결과를 계산합니다. 배치 추적을 위해, 우리는 Pregel을 사용하여 그래프를 따라 이전 생산 단계의 정보(예: 출력 배치 번호)를 보내, 각 최종 제품에 대한 모든 상류 재료 배치의 전체 목록을 생성했습니다.
Pregel은 사용자가 고유한 비즈니스 문제에 적합한 사용자 정의, 병렬 메시지 전달 알고리즘을 구축할 수 있게 하는 프레임워크입니다. 각 vertex는 기본값으로 초기화됩니다. 결과는 슈퍼스텝 이라고 불리는 반복을 통해 계산됩니다. 각 superstep에서, 그래프 vertex는:
사용자 정의 함수 (UDFs)는 메시지가 어떻게 전달되고 vertex의 상태를 업데이트하는 데 사용되는지를 제어합니다. 이러한 유연성은 사용자가 다양한 사용 사례에 대해 Pregel 알고리즘을 구현할 수 있게 합니다. 우리의 제조 공정에서 배치를 추적하기 위해, 우리는 입력 배치 번호를 한 vertex에서 다른 vertex로 보냈고, 메시지가 수신되었을 때 각 vertex의 깊이와 원본 배치 번호를 업데이트했습니다.
Pregel로 배치 추적을 구현하려면, 그래프를 따라 배치 번호를 전송하려고 했습니다. 우리는 메시지 구조를 정의하는 것으로 시작했습니다. 우리의 것은 노드의 깊이, 배치 번호, 그리고 이전 배치 번호(즉, "추적")를 포함했습니다. 메시지 스키마를 정의한 후, 각 정점의 깊이에 따라 부모 배치에서 자식 배치로 메시지가 전송되도록 UDF를 생성했습니다.
제조 시스템은 여러 입력을 포함할 수 있으므로, 우리는 여러 상류 정점으로부터의 메시지를 처리하는 방법이 필요했습니다. 우리는 각각의 상류 생산 라인에서 받은 배치 번호의 단일 리스트를 수집하는 함수를 만들었습니다.