어떻게 성운도 교환을 통해 데이터를 Neo4j에서 성운도로 이전합니까


본고는 주로 Nebula Graph Exchange(약칭 Exchange)를 사용하여 데이터를 Neo4j에서 Nebula Graph로 이동하는 방법을 소개한다. Nebula Graph Exchange는 Nebula Graph 팀이 지원하는 데이터 이동 도구이다.데이터를 가져오는 방법을 소개하기 전에 데이터 이동이 어떻게 Nebula Graph에서 이루어지는지 살펴보겠습니다.

성운도 교환 중의 데이터 처리


데이터 마이그레이션 도구의 이름은 Nebula GraphExchange입니다.Spark를 가져오기 플랫폼으로 사용하여 대용량 데이터 세트 가져오기를 지원하고 성능을 보장합니다.데이터 프레임워크는 스파크가 제공하는 분포식 데이터 집합으로 명명열로 구성되어 광범위한 데이터 원본을 지원한다.DataFrame에 새 데이터 원본을 추가하려면 읽을 프로필의 코드와 DataFrame이 되돌아오는 리더 형식을 제공해야 합니다.

위에서 말한 바와 같이 데이터 프레임은 줄과 열에 따라 조직된 분포식 데이터 집합이다.하나의 데이터 프레임은 여러 개의 구역에 저장할 수 있다.구역은 병렬 조작을 지원하기 위해 서로 다른 기계에 저장된다.이 밖에 Spark는 사용자가 로컬에서 작업하는 것처럼 데이터 프레임을 쉽게 조작할 수 있도록 하는 API를 제공했다.그 밖에 대부분의 데이터베이스는 데이터를 데이터 프레임으로 내보내는 것을 지원한다.데이터베이스에서 이러한 기능을 제공하지 않아도 데이터베이스 드라이버를 사용하여 수동으로 데이터 프레임을 구축할 수 있다.
데이터를 데이터 프레임으로 변환한 후, Nebula Graph Exchange는 데이터 프레임의 모든 줄을 훑어보고, 프로필의 필드 맵 관계에 따라 열 이름에 따라 해당하는 값을 가져옵니다.batchSize 줄을 훑어보면 Exchange에서 얻은 데이터를 성운도에 한 번에 기록합니다.현재 Exchange는 nGQL 문장을 생성하고 Nebula 클라이언트가 비동기적으로 데이터를 기록합니다.Nebula Graph 베이스 메모리에 저장된 sst 파일을 내보내서 더 좋은 성능을 얻을 수 있도록 지원합니다.이어서 Neo4j 데이터 가져오기의 실현에 대해 계속 토론합시다.

Neo4j에서 데이터 가져오기


Neo4j는 데이터를 데이터 프레임으로 직접 내보낼 수 있는 공식 라이브러리를 제공합니다.그러나 복구 가능한 다운로드는 지원되지 않습니다.그래서 우리는 이 라이브러리를 직접 사용하지 않았다.반대로, 우리는 공식 Neo4j 드라이버를 사용하여 데이터를 읽습니다.더 좋은 성능을 얻기 위해 Exchange는 서로 다른 구역에서 Neo4j 드라이버를 사용하여 서로 다른 건너뛰기와 제한 Cypher 문장을 실행하고 데이터를 서로 다른 구역에 나누어 줍니다.구역의 수량은 설정 매개 변수partition에 의해 지정됩니다.
Exchange는 다음 절차에 따라 Neo4j 데이터를 가져옵니다. 우선, Exchange의 Neo4jReader 클래스는 Cypher 문장 exec와 되돌아온 사용자 설정의 문장을count(*)로 교체하고 전체 데이터 크기를 얻기 위해 실행합니다.그 다음에 거래소는 각 구역의 초기 편이량과 크기를 구분 번호에 따라 계산한다.check\u point\u path 매개변수가 구성된 경우 Exchange도 이 디렉토리의 파일을 읽습니다.다운로드가 복구 가능한 상태이면 Exchange는 각 구역의 초기 편이도와 크기를 계산한 다음 각 구역의 Cypher 문장 뒤에 다른skip과limit를 추가하고 드라이버를 호출합니다.마지막으로 Exchange는 반환된 데이터를 데이터 프레임으로 변환합니다.
이 절차는 다음 그림과 같습니다.

실천 데이터가 Neo4j에서 성운도 가져오기


우리는 여기에서 다음 시스템 환경을 사용하여 가져오기를 보여 줍니다.
하드웨어:
  • CPU 이름: Intel(R) Xeon(R) CPU E5 – 2697 [email protected]
  • CPU 코어: 14
  • 메모리 크기: 251G
  • 소프트웨어:
  • Neo4j 버전: 3.5.20 커뮤니티
  • 성운도: Docker Compose와 함께 배치한다.우리는 기본 설정을 사용하고 앞의 기계에 성운도를 배치합니다.
  • 스파크: 단일 노드.버전:hadoop2.7의 2.4.6 사전 구축.
  • Nebula Graph는 강력한 형식 모드 데이터베이스이기 때문에 데이터를 가져오기 전에 공백, 태그, 모서리 형식을 만들어야 합니다.자세한 내용은 Create space syntax 을 참조하십시오.
    여기에서 우리는 테스트 라는 공간을 만들었습니다. 복제 번호는 1입니다.우리는 두 가지 유형의 태그를 만들었습니다: tagA와 tagB.둘 다 네 개의 속성이 있다.그 밖에 우리는 테두리 유형인 dgeAB를 만들었는데 네 가지 속성을 가지고 있다.nGQL 조회는 다음과 같습니다.
    # Create graph space test 
    CREATE SPACE test(replica\_factor= 1); 
    # Use graph space test 
    USE test; 
    # Create tag tagA 
    CREATE TAG tagA(idInt int, idString string, tboolean bool, tdouble double); 
    # Create tag tagB 
    CREATE TAG tagB(idInt int, idString string, tboolean bool, tdouble double); 
    # Create edge type edgeAB 
    CREATE EDGE edgeAB(idInt int, idString string, tboolean bool, tdouble double);
    
    이제 아날로그 데이터를 Neo4j로 가져옵니다.아날로그 데이터는 tagA와 tagB로 표시된 100만 개의 정점, edgeAB로 표시된 1000만 개의 가장자리를 포함한다.Neo4j에서 내보낸 데이터는 반드시 속성이 있어야 하며, 데이터 형식은 성운도의 데이터 형식과 완전히 같아야 합니다.
    마지막으로, 아날로그 데이터가 Neo4j로 가져오는 속도를 높이고 읽기 성능을 향상시키기 위해, 우리는tagA와tagB에서 속성 idInt에 인덱스를 만들었습니다.Exchange는 색인 및 구속조건을 성운도로 가져오지 않습니다.그러니 createrebuild index를 꼭 기억해야 한다.
    그리고 우리는 Neo4j의 데이터를 성운도에 가져옵니다.우선, 이 항목을 다운로드하고 포장합시다.nebula-java 저장소의 tools/exchange 디렉터리에서 이 항목을 찾을 수 있습니다.다음 명령을 실행합니다.
    git clone https://github.com/vesoft-inc/nebula-java.git 
    cd nebula-java/tools/exchange mvn package -DskipTests
    
    그리고 목표/exchange-1.0.1을 보실 수 있습니다.jar 파일.
    다음은 프로필로 넘어가겠습니다.구성 파일의 형식은 HOCON(인간 최적화 구성 객체 기호)입니다.src/main/resources/server\u 응용 프로그램을 기반으로 수정하겠습니다.conf 파일.우선, 성운도에 주소, 사용자, pswd와 공간을 설정합니다.우리는 이곳에서 기본적인 테스트 환경을 사용하기 때문에 여기에서 어떤 내용도 수정하지 않을 것이다.다음은 탭을 설정합니다.우리는 tagA의 설정만 보여 줍니다. 왜냐하면 tagB의 설정은 tagA의 설정과 같기 때문입니다.
    { 
    # ====== connection configuration for neo4j======= 
    name: tagA 
    # Must be exactly the same as the tag name in Nebula Graph. Must be created before importing. 
    server: "bolt://127.0.0.1:7687" 
    # address configuration for neo4j 
    user: neo4j 
    # neo4j username 
    password: neo4j 
    # neo4j password 
    
    encryption: false 
    # (Optional): Whether to encrypt the transformation. The default value is false. 
    database: graph.db 
    # (Optional): neo4j databases name, not supported in the Community version 
    # ======import configurations============ 
    type: { 
       source: neo4j 
       # PARQUET, ORC, JSON, CSV, HIVE, MYSQL, PULSAR, KAFKA... 
       sink: client 
       # Write method to Nebula Graph, only client is supported at present. We will support direct export from Nebula Graph in the future. 
    } 
    
    nebula.fields: [idInt, idString, tdouble, tboolean] 
    fields : [idInt, idString, tdouble, tboolean] 
    # Mapping relationship fields. The upper is the nebula property names, the lower is the neo4j property names. All the property names are correspondent with each other. 
    # We use the List instead of the Map to configure the mapping relationship to keep the field order, which is needed when exporting nebula storage files. 
    
    vertex: idInt 
    # The neo4j field corresponds to the nebula vid field. The type must be int. 
    partition: 10 
    # Partition number. batch: 2000 # Max data write limit. 
    
    check\_point\_path: "file:///tmp/test" 
    # (Optional): Save the import information directory, used for resumable downloads. 
    
    exec: "match (n:tagA) return n.idInt as idInt, n.idString as idString, n.tdouble as tdouble, n.tboolean as tboolean order by n.idInt" 
    }
    
    모서리 구성은 정점 구성과 유사합니다.그러나, 성운도 가장자리에 원본 vid와 목표 vid를 설정해야 합니다. 왜냐하면 성운도 가장자리에 원본 vid와 목표 vid가 포함되어 있기 때문입니다.테두리 구성은 다음과 같습니다.
    source: { 
      field: a.idInt 
      # policy: "hash" 
    } 
    # configuration for source vertex ID 
    target: { 
      field: b.idInt 
      # policy: "uuid" 
    } 
    # configuration for destination vertex ID 
    ranking: idInt 
    # (Optional): The rank field. 
    partition: 1 
    # Set partition number as 1. We set it to one here. We will talk about the reason later. 
    
    exec: "match (a:tagA)-[r:edgeAB]->(b:tagB) return a.idInt, b.idInt, r.idInt as idInt, r.idString as idString, r.tdouble as tdouble, r.tboolean as tboolean order by id(r)"
    
    교점, 에지 소스 교점, 에지 대상 교점에 대해 해시 정책 또는 UUID 정책을 사용할 수 있습니다.hash/uuid 함수는 문자열 형식 필드를 정수 형식 필드로 비칩니다.
    앞의 예제에서는 정수 VID를 사용하기 때문에 정책 설정이 필요하지 않습니다.산열과 uid 간의 차이를 알아보려면 here 을 참조하십시오.
    Cypher에서 키워드 ORDER BY를 사용하여 동일한 질의 순서가 동일한지 확인합니다.반환된 데이터 순서는order BY가 없는 상황에서 똑같아 보이지만 데이터 가져오기 중의 데이터 분실을 피하기 위해 Cypher에서order BY를 사용하는 것을 강력히 권장합니다. 비록 어느 정도 가져오는 속도를 희생했지만.가져오기 속도를 높이기 위해서는 색인 속성을 정렬하는 것이 좋습니다.인덱스가 없으면 기본 순서를 확인하고 성능을 높이기 위해 적합한 인덱스를 선택하십시오.기본적으로 반환된 데이터에서 정렬 규칙을 찾을 수 없는 경우 정점/모서리 ID에 따라 정렬하고 Neo4j의 정렬 압력을 줄이기 위해 파티션 값을 가능한 한 작은 값으로 설정할 수 있습니다.이것이 바로 이 예에서 우리가 지역 번호를 1로 설정한 이유다.
    또한 성운도는 교점과 모서리를 생성할 때 ID를 유일한 키로 사용합니다.새 데이터를 삽입하기 전에 키가 존재하면 키 아래의 오래된 데이터가 덮어씁니다.따라서 중복된 Neo4j 속성 값을 성운도 ID로 사용하면 같은 ID를 가진 정점이 정점으로 간주되고 마지막 쓰기만 저장되기 때문에 데이터가 손실됩니다.성운도를 가져오는 데이터가 병행되기 때문에 최종 데이터가 Neo4j의 최신 데이터라는 것을 보장할 수 없습니다.
    네가 주의해야 할 또 다른 일은 다운로드를 복구할 수 있다는 것이다.중단점과 복구 사이에서 데이터베이스는 데이터를 삽입하거나 삭제할 수 없는 등 상태를 변경할 수 없습니다.구분 번호는 수정할 수 없습니다. 그렇지 않으면 데이터 분실이 발생할 수 있습니다.
    마지막으로, Exchange는 서로 다른 구역에서 서로 다른 건너뛰기와 제한 암호 조회를 실행하기 때문에 사용자는 건너뛰기와 제한을 포함한 조회를 제공할 수 없습니다.
    그런 다음 Exchange를 실행하여 데이터를 가져옵니다.다음 명령을 수행합니다.
    $SPARK\_HOME/bin/spark-submit --class com.vesoft.nebula.tools.importer.Exchange --master "local[10]" target/exchange-1.0.1.jar -c /path/to/conf/neo4j\_application.conf
    
    위 구성에서 교점 100만 개를 가져오는 데 13초, 모서리 1000만 개를 가져오는 데 213초가 소요됩니다.따라서 총 가져오기 시간은 226초입니다.

    부록: Neo4j3.5 커뮤니티와 성운도 1.0.1 비교


    Neo4j와 Nebula Graph는 시스템 구조, 데이터 모델과 접근 방법에 있어 다르다.따라서 다음과 같은 일반적인 차이점을 다음 표에 설명합니다.

    Hi, I’m Mengjie Li, the software engineer in Nebula Graph. Currently I am involved in storage engine development. I hope this article is helpful and let me know if you have any thoughts and suggestions. Thanks!


    이 가능하다, ~할 수 있다,...

  • New Players: Something You Should Know When Reading Nebula Graph Source Code
  • Performance Comparison: Neo4j vs Nebula Graph vs JanusGraph
  • Like what we do ? Star us on GitHub. https://github.com/vesoft-inc/nebula


    최초 2020년 9월 17일 발표https://nebula-graph.io.

    좋은 웹페이지 즐겨찾기