>

QueryDatabaseTable을 사용하여 약 7 천만 개의 행이있는 PDA/Netezza 테이블에서 읽습니다.

Nifi는 bootstrap.conf 를 사용하여 단일 노드 인스턴스로 설정됩니다  16g RAM을 제공하도록 수정되었습니다.

QueryDatabase 테이블이 기본값을 사용하고 있습니다

  • Max Rows Per Flow File : 1000000
  • Output Batch Size : 10

결과는 전체 70M의 경우 약 1.5 시간이 걸리는 것입니다. 1M은 p/분을 기록합니다.

<올>
  • 성능을 향상시키기 위해 실험 할 수있는 다른 구성 변경이 있습니까?
  • QueryDatabaseTable은 내부적으로 Avro로 변환합니다.이 변환을 건너 뛰고 성능을 향상시키기 위해 PDA/Netezza의 텍스트 형식 만 사용할 수 있습니까?
  • 클러스터를 곧 설정할 계획이지만 4 ~ 6 개의 노드가 될 것이므로 성능을 10 분 이하로 낮추려고합니다. 이것이 가능한가?


    • 답변 # 1

      QueryDatabaseTable은 페치의 단일 소스이므로 기본 노드에서만 실행되도록되어 있습니다. 이는 Sqoop과 같은 분산/병렬 솔루션으로 확장되지 않음을 의미합니다. 또한 NiFi 클러스터에 3 개의 노드가 있고 Sqoop이있는 Hadoop 클러스터에 10 개의 노드가 있다면 당연히 후자에 더 많은 병렬 처리를 얻을 수 있습니다.

      그러나 NiFi는 GenerateTableFetch -> ExecuteSQL 를 가지고 있습니다.  이것에 대한 패턴. 전체 페치를 수행하는 단일 노드의 단일 프로세서 대신 GenerateTableFetch는 테이블에서 데이터의 "페이지"를 페치하기 위해 각각 SQL 문을 포함하는 여러 플로우 파일을 생성합니다. 그런 다음 ExecuteSQL을 사용하여 실제로 행을 가져올 수 있습니다.

      GenerateTableFetch는 여전히 기본 노드에서만 실행되지만 행 자체는 가져 오지 않습니다. 대신 Remote Process Group -> Input Port 를 사용하여 클러스터 노드간에 플로우 파일을 분배합니다.  동일한 클러스터 또는 최신 버전의 NiFi에서 GenerateTableFetch와 ExecuteSQL간에로드 밸런스 연결을 사용할 수 있습니다.

      플로우 파일이 클러스터에 분산되면 각 노드는 동시에 ExecuteSQL을 실행하고 다운 스트림 처리를 위해 한 번에 데이터 페이지를 페치 할 수 있습니다.

      출력 형식의 경우, NiFi 1.8.0부터 Avro, JSON, CSV, XML, 자유 텍스트 (사용자 정의 텍스트 형식의 경우)를 포함하는 RecordSetWriter가있는 형식으로 행을 출력 할 수있는 ExecuteSQLRecord가 있습니다. ), 더 복잡하거나 독점적이거나 현재 지원되지 않는 형식으로 자신 만의 스크립트를 작성할 수도 있습니다. 완벽을 기하기 위해 QueryDatabaseTableRecord 프로세서도 있지만이 답변에 대해서는 유스 케이스를 해결하기 위해 사용하지 않는 것이 좋습니다 :)

    • 답변 # 2

      분당 1M 행이 너무 느려서 Netezza 시스템.

      외부 테이블/언로드는 50-100 배 더 빨라야합니다

      고속 클라이언트에 대한 ODBC를 통한 단일 선택 (5 ~ 10 배 더 빠른 Powercenter 및 SAS 사용)

      Netezza의 최소 쿼리 시간은 1/8 초에 가깝습니다. 즉, 각 쿼리에서 'money'에 대한 전체 가치를 가져와야합니다 (bquite 가능 btw). '이 무대 뒤에서 :)

  • 이전 C에서 int 데이터 유형에 pow ()가 작동합니까?
  • 다음 페이지 메타 보안 헤더를 사용하지 않아야하는 경우