metatron-app / metatron-discovery

Powerful & Easy way for big data discovery
https://metatron.app
Apache License 2.0
441 stars 112 forks source link

Add a ingestion via data snapshot of data source type #657

Closed AnnieHwang closed 5 years ago

AnnieHwang commented 5 years ago

Is your feature request related to a problem? Please describe. 데이터소스 생성 타입 중 데이터 스냅샷 방식 추가 데이터 스냅샷 타입은 StagingDB 생성 방식과 거의 동일합니다. 유일하게 다른 부분이 1씬 있는데요.. 테이블 선택하는 씬이 데이터스냅샷 이름 선택하는 부분으로 교체됩니다.

최근에 StagingDB안에 파티션 키 변경하는 부분이 있습니다. 해당 부분이 이 안에도 반영되어야 하니 #619 이슈를 꼭 참고부탁드립니다.

Describe the solution you'd like image image image image image

아래 PPT를 참고하세요 데이터소스.pptx

kyungtaak commented 5 years ago

@metatron-app/design @AnnieHwang 위에 Snapshot 부분은 기획 보강이 좀더 필요할것 같습니다. Snapshot 선택이후, 마치 대시보드에서 데이터 소스 선택하듯이 목록정보가 크게 나오면 어떨까하는데요. 사용자로 하여금 스냅샷 정보를 좀더 확인하고 데이터 소스화 할수 있는 데이터를 선택하게끔요. 프리뷰/컬럼 스키마 설정은 기존 방식과 동일하지만, 이후 추가 고려사항은 스냅샷은 일반 로컬파일/Hive/HDFS 로 저장타입이 지정될수 있다고 합니다. 이럴경우 뒤에 옵션이 달라질수 있는데요. 이부분도 고려가 필요합니다. 확인 부탁드립니다.

AnnieHwang commented 5 years ago

@kyungtaak @joohokim1 네 해당 부분 확인해서 기획 고민해보도록 하겠습니다.

ecoloy commented 5 years ago

@AnnieHwang @kyungtaak @joohokim1 데이터소스 타입에서 스냅샷을 선택했을시 보이는 화면을 아래와 같이 수정 기획하였습니다. 2018-11-06 5 23 59 그리고 스냅샷의 상세 정보를 볼수 있는 팝업 기획도 추가하였습니다. 2018-11-06 5 24 09 검토부탁드립니다. 감사합니다.

joohokim1 commented 5 years ago

@AnnieHwang @ecoloy 저는 괜찮은 것 같습니다.

@kyungtaak 위와 같이 진행한다고 할 때, dataprep 측에서 할 일은 아래 2가지라고 보면 될까요?

  1. Snapshot 리스팅 / 선택 페이지 구현 및 스냅샷 상세 팝업과 연결
  2. Snapshot 확정 선택시 이후 데이터 소스 생성에 필요한 정보 (URL, DB/Table name 등) 제공
ecoloy commented 5 years ago

@AnnieHwang @kyungtaak @joohokim1 추가로 데이터 프리퍼레이션 메뉴의 스냅샷 상세 화면에서도 바로 데이터소스를 만드는 숏컷 버튼이 추가되어야 합니다. 해당 버튼이 생성되는 곳은 프리퍼레이션 화면이지만 back단에서 시스템이 데이터소스의 생성 단계를 일부 진행하는 것이기 때문에 참고하실수 있게 기획문서를 공유드립니다. 2018-11-13 2 29 50

이슈를 별도로 분리하여 진행해야 한다고 판단되시면 피드백 부탁드립니다.

AnnieHwang commented 5 years ago

@ecoloy 네 스냅샷에서 데이터소스 연결되는 Flow 좋은것 같습니다. 제가 보기엔 어차피 저 버튼을 눌러도 같은 화면으로 점핑하기 때문에 같이 이슈로 묶어도 될것 같은데..개발리딩하시는 분들과 논의하시면 될것 같습니다.

kyungtaak commented 5 years ago

@AnnieHwang 지금 적재 전체 단계를 어떻게 보시고 계신가요? 각 원천 데이터 소스 타입에 따라, 적재 flow가 다르게 간다고 가정하고 가는건지 궁금합니다. (flow 가 정의된 부분이 있으면 공유 부탁드립니다.)

@joohokim1 기획 flow 를 보고 개발필요항목을 논의하면 좋을것 같습니다.

koeun222 commented 5 years ago

image @AnnieHwang 스냅샷의 상세팝업 수정된부분 디자인 공유드립니다 생성화면은 기존화면 활용가능합니다

AnnieHwang commented 5 years ago

@kyungtaak 지금 flow는 아래와 같이 생각하고 있습니다. (1) 데이터스냅샷 상세 '데이터소스 생성' 버튼 클릭 -> (2) 데이터소스 타입 중 '데이터스냅샷' 자동 선택된다고 가정함 (화면은 존재하지 않음) -> (3) 데이터스냅샷 리스트 화면 선택하고 데이터 미리보는 화면 -> (4) 데이터 스키마 정의 -> (5) 배치 및 기타 설정 -> (6) 데이터소스 이름 설정

데이터스냅샷은 현재는 hive stagingDB안 테이블로 떨어지고 있으니, 해당 목록은 사실 stagingDB안 일부 테이블과 중복될 수 있습니다. (하지만 데이터 프랩에서의 유연한 연계가 필요해서 따로 '데이터스냅샷' 타입으로 만들어 flow를 정의하였습니다.) 따라서 원천 DB에 맞는 커넥션 정보는 따로 필요없으며, 기존 stagingDB정보만 필요로 합니다.

감사합니다.

kyungtaak commented 5 years ago

@AnnieHwang @joohokim1 일단 (5) 번은 원천인 Snapshot 이 어디에 있는지에 따라 달라질것 같네요. Local/StageDB(hive)/HDFS 이 세가지가 맞을까요? 이부분만 정리되면 개발 착수를 해보았으면 합니다.

deidera08 commented 5 years ago

@joohokim1 @kyungtaak @AnnieHwang @ecoloy 일전에 올려주신 기안을 2가지 경우로 나눠 정리하였습니다.

타입에 따른 흐름도 flow

공통step01 - 스냅샷 선택 01

공통 step01_1 - 스냅샷 상세 팝업 01-1

공통 step02 - Configure Schema 02

File step03 - Ingestion setting file03

File step04 - Enter Datasource Name(완료) file04

StagingDB step03 - Ingestion setting stagingdb03

StagingDB step04 - Enter Datasource Name(완료) stagingdb04

살펴보시고 부족한 부분은 가이드 부탁드립니다.

ufoscw commented 5 years ago

@deidera08 @AnnieHwang Snapshot을 이용해 생성된 데이터소스 상세화면에서 하단의 Ingestion information 영역에 노출할 내용이 빠진듯 합니다. 확인 부탁드려요.

deidera08 commented 5 years ago

@joohokim1 @ufoscw @AnnieHwang 상세화면이 누락되었네요. 죄송합니다

기본적으로 Datasource에서 File과 StagingDB와 화면구성이 같습니다. 그러나 Master data정보는 Snapshot으로 동일하게 노출되었으면 합니다.

  1. File type의 Snapshot일 경우 file

  2. StagingDB type의 Snapshot일 경우 stagingdb

brandon-wonjune commented 5 years ago

@kyungtaak 스냅샷으로 생성 step1화면에서 생성된 스냅샷 목록과 선택했을때 우측에 표시되는 스냅샷의 미리보기 데이터는 어떤 api를 사용해야 되나요?

kyungtaak commented 5 years ago

@joohokim1 @ufoscw f/u 부탁드립니다.

ufoscw commented 5 years ago

@brandon-wonjune Snapshot을 이용한 데이터소스 생성 파라미터 구성시 참고할 사항입니다.

  1. "srcType" : "SNAPSHOT"
  2. ingestion.type 은 Snapshot Type에 따라 아래와 같이 매핑됩니다. SnapshotType -> ingestionType "STAGING DB" -> "hive" "FILE (CSV)" -> "local" "FILE (JSON)" -> "local" "HDFS (CSV)" -> "hdfs" "HDFS (JSON)" -> "hdfs"
  3. ingestionType이 hdfs일 경우 paths 파라미터는 배열
  4. snapshot 파라미터 추가

기존에 사용하지않던 HDFS Type의 request 샘플입니다.

{
   "name":"HdfsFileIngestion",
   "dsType":"MASTER",
   "connType":"ENGINE",
   "srcType":"SNAPSHOT",
   "granularity":"DAY",
   "segGranularity":"MONTH",
   "fields":[
      {
         "name":"time",
         "type":"TIMESTAMP",
         "role":"TIMESTAMP",
         "seq":0
      },
      {
         "name":"d",
         "type":"TEXT",
         "role":"DIMENSION",
         "seq":1
      },
      {
         "name":"m1",
         "type":"DOUBLE",
         "role":"MEASURE",
         "aggrType":"SUM",
         "seq":2
      }
   ],
   "ingestion":{
      "type":"hdfs",
      "paths":[
         "hdfs://metatron-cluster/user/hive/dataprep/snapshots/ss_hdfs_csv.csv"
      ],
      "findRecursive":false,
      "format":{
         "type":"csv"
      },
      "jobProperties":{
         "mapreduce.map.memory.mb":"1024",
         "mapreduce.reduce.memory.mb":"1024",
         "mapreduce.map.cpu.vcores":"1",
         "mapreduce.reduce.cpu.vcores":"1"
      }
   },
   "snapshot":"/api/preparationsnapshots/ecfa6510-757c-47a3-bc29-fd84fc57a30c"
}
joohokim1 commented 5 years ago

@brandon-wonjune 스냅샷 미리보기 API는 (GET) /preparationsnapshots/{ssId}/contents 이고, request param으로 offset과 target이 있습니다.

예를 들면, http://localhost:4200/api/preparationsnapshots/269f1149-bfaa-4f25-8841-15b21fe3648b/contents?offset=0&target=10000 처럼 하시면 됩니다.

더 자세한 내용은 따로 전달드리겠습니다.

brandon-wonjune commented 5 years ago

@joohokim1 위의 API로 사용중인데요 다음같은 화면에서 사용을할때 field 내부에 role, logicalType 프로퍼티가 필요합니다. 2019-02-18 4 23 58

deidera08 commented 5 years ago

@joohokim1 @AnnieHwang @brandon-wonjune @koeun222 스냅샷의 데이터가 불러와지지 않을 경우 데이터소스 생성을 더이상 진행할 수 없습니다. 때문에 이 경우 화면에 오류 표시하는 부분을 기획서에 보완하였습니다. 더불어 스냅샷의 정보를 현재와 맞춰 수정하였습니다. 2019-02-18 4 33 13

joohokim1 commented 5 years ago

@brandon-wonjune

Snapshot을 비롯한 dataprep의 모든 grid response는 기존 datasource의 preview와는 다른 형태를 갖고 있습니다.

</api/datasources/file/{tempFilePath}/data 의 응답>

2019-02-18 4 50 41

문제는 role, logicalType인데요. 원칙적으로 이들 정보는 "공통 step02 - Configure Schema" 화면에서 정해지는 것 입니다. 말씀하신 context에서 이들 정보가 필요한 것은 초기값 (또는 suggestion) 을 위한 것으로 추정됩니다. 따라서, 전달되는 type에 따라 LONG, DOUBLE -> metric, TIMESTAMP -> timestamp 또는 dimension, 나머지 dimension 규칙으로 설정을 하면 될 것 같습니다.

각 컬럼의 타입을 얻는 방법은 다음 스크린샷을 참고하시면 될 것 같습니다.

</api/preparationsnapshots/{ssId}/contents 의 응답>

2019-02-18 5 01 01

또, 위의 화면을 그리는데에 컬럼 내용이 필요할 것 같은데요. 이것을 얻는 것은 @paigechoi 님께 문의해서 관련 dataprep 코드를 참고하시면 될 것 같습니다. (위의 스크린샷에 살짝 보이는 rows 항목입니다)

joohokim1 commented 5 years ago

참고로, 모든 파트에서 preview에 대해서는 향후 dataprep의 response 형태로 통합될 가능성이 높습니다. (https://github.com/metatron-app/metatron-discovery/issues/1224)

brandon-wonjune commented 5 years ago

@ufoscw 생성시 파라메터 문의드립니다. ingestion params 에서 아래의 값은 local, hive, hdfs 관계없이 항상 고정인가요?

"findRecursive":false,
 "format":{
   "type":"csv"
 },
ufoscw commented 5 years ago

@brandon-wonjune format속성 은 local, hive, hdfs 타입에 모두 포함되어야 하고 findRecursive 속성은 hdfs 타입일경우만 필요합니다. 우선은 false값으로 보내도록 개발해주세요.

brandon-wonjune commented 5 years ago

@ufoscw snapshot file(CSV)로 데이터소스 생성 테스트 중 문의드립니다. 컬럼이 모두 DIMENSION일 경우는 ingestion 시 이상없이 생성이 되나 컬럼중 MEASURE가 있는경우 아래와 같은 에러가 발생합니다.

app.metatron.discovery.domain.datasource.DataSourceIngestionException: An error occurred while loading the data source : Exception: [io.druid.segment.incremental.OnheapIncrementalIndex.aggregate(OnheapIncrementalIndex.java:243), io.druid.segment.incremental.OnheapIncrementalIndex.factorizeAggs(OnheapIncrementalIndex.java:223), io.druid.segment.incremental.OnheapIncrementalIndex.addToFacts(OnheapIncrementalIndex.java:195), io.druid.segment.incremental.IncrementalIndex.addTimeAndDims(IncrementalIndex.java:445), io.druid.segment.incremental.IncrementalIndex.add(IncrementalIndex.java:440), io.druid.segment.realtime.plumber.Sink.add(Sink.java:160), io.druid.indexing.common.index.YeOldePlumberSchool$1.add(YeOldePlumberSchool.java:139), io.druid.indexing.common.task.IndexTask.generateSegment(IndexTask.java:415), io.druid.indexing.common.task.IndexTask.run(IndexTask.java:222), io.druid.indexing.overlord.ThreadPoolTaskRunner$ThreadPoolTaskRunnerCallable.call(ThreadPoolTaskRunner.java:458), io.druid.indexing.overlord.ThreadPoolTaskRunner$ThreadPoolTaskRunnerCallable.call(ThreadPoolTaskRunner.java:430), java.util.concurrent.FutureTask.run(FutureTask.java:266), ... more, Caused by: io.druid.data.Rows.parseDouble(Rows.java:65), io.druid.data.input.AbstractRow.getDoubleMetric(AbstractRow.java:51), io.druid.segment.ColumnSelectorFactories$FromInputRow$4.get(ColumnSelectorFactories.java:486), io.druid.query.aggregation.DoubleSumAggregator$4.aggregate(DoubleSumAggregator.java:125), io.druid.segment.incremental.OnheapIncrementalIndex.aggregate(OnheapIncrementalIndex.java:238), ... more, Caused by: sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:2043), sun.misc.FloatingDecimal.parseDouble(FloatingDecimal.java:110), java.lang.Double.parseDouble(Double.java:538), java.lang.Double.valueOf(Double.java:502), io.druid.data.Rows.tryParseDouble(Rows.java:185), io.druid.data.Rows.parseDouble(Rows.java:62), ... more]
    at app.metatron.discovery.domain.datasource.ingestion.job.IngestionJobRunner.ingestion(IngestionJobRunner.java:176)
    at app.metatron.discovery.domain.datasource.DataSourceEventHandler.lambda$checkCreateAuthority$0(DataSourceEventHandler.java:230)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)

아래는 생성시 사용된 파라메터 정보입니다.

{
  "name": "1",
  "granularity": "SECOND",
  "segGranularity": "HOUR",
  "dsType": "MASTER",
  "srcType": "SNAPSHOT",
  "connType": "ENGINE",
  "fields": [
    {
      "name": "id",
      "type": "STRING",
      "logicalType": "STRING",
      "role": "DIMENSION",
      "seq": 0
    },
    {
      "name": "created_by",
      "type": "STRING",
      "logicalType": "STRING",
      "role": "DIMENSION",
      "seq": 1
    },
    {
      "name": "created_time",
      "type": "STRING",
      "logicalType": "TIMESTAMP",
      "role": "TIMESTAMP",
      "format": {
        "type": "time_format",
        "format": "yyyy-MM-dd'T'HH:mm:ss.SSSZZ",
        "timeZone": "Asia/Seoul",
        "locale": "en"
      },
      "seq": 2
    },
    {
      "name": "modified_by",
      "type": "STRING",
      "logicalType": "STRING",
      "role": "DIMENSION",
      "seq": 3
    },
    {
      "name": "modified_time",
      "type": "STRING",
      "logicalType": "STRING",
      "role": "DIMENSION",
      "seq": 4
    },
    {
      "name": "version",
      "type": "STRING",
      "logicalType": "INTEGER",
      "role": "MEASURE",
      "seq": 5
    },
    {
      "name": "ds_conn_type",
      "type": "STRING",
      "logicalType": "STRING",
      "role": "DIMENSION",
      "seq": 6
    },
    {
      "name": "ds_type",
      "type": "STRING",
      "logicalType": "STRING",
      "role": "DIMENSION",
      "seq": 7
    },
    {
      "name": "ds_engine_name",
      "type": "STRING",
      "logicalType": "STRING",
      "role": "DIMENSION",
      "seq": 8
    },
    {
      "name": "ds_granularity",
      "type": "STRING",
      "logicalType": "STRING",
      "role": "DIMENSION",
      "seq": 9
    }
  ],
  "ingestion": {
    "type": "local",
    "rollup": true,
    "format": {
      "type": "csv"
    },
    "path": "file:///Development/dataprep/snapshots/11414tafae.csv"
  },
  "snapshot": "/api/preparationsnapshots/70e51b99-f212-40c9-9169-dee3df9f2574"
}

아래는 생성시 사용된 스냅샷 정보입니다.

{
  "status": "SUCCEEDED",
  "launchTime": "2019-02-19T07:13:04.000Z",
  "origDsDcId": "806942d7-682a-452a-81fa-e00812bbadee",
  "origDsDcImplementor": "MYSQL",
  "origDsDcName": "MySQL-localhost-3306",
  "origDsDcType": "JDBC",
  "origDsDcHostname": "localhost",
  "origDsDcPort": 3306,
  "origDsDcUsername": "polaris",
  "origDsDbName": "polaris_v2",
  "origDsTblName": "datasource",
  "origDsQueryStmt": "select * from polaris_v2.datasource",
  "origDsCreatedBy": "admin",
  "origDsCreatedTime": "2019-02-19T07:01:22.000Z",
  "origDsModifiedBy": "admin",
  "origDsModifiedTime": "2019-02-19T07:01:22.000Z",
  "dsCreatedBy": "admin",
  "dsCreatedTime": "2019-02-19T07:01:26.000Z",
  "dsModifiedBy": "admin",
  "dsModifiedTime": "2019-02-19T07:12:57.000Z",
  "origDsId": "78f4134b-ad8b-41b4-bed3-b90508191a4d",
  "origDsName": "datasource (MYSQL)",
  "origDsImportType": "DATABASE",
  "statusCat": "SUCCESS",
  "sourceInfo": {
    "dsCreatedBy": "admin",
    "origDsImportType": "DATABASE",
    "dsModifiedBy": "admin",
    "dsName": "datasource",
    "dsModifiedTime": "2019-02-19T07:12:57.000Z",
    "dsId": "321e17f0-d14a-42ef-81d3-6f269ab98b33",
    "origDsId": "78f4134b-ad8b-41b4-bed3-b90508191a4d",
    "origDsName": "datasource (MYSQL)",
    "dfName": "datasource (MYSQL)_0219_1601",
    "origDsModifiedBy": "admin",
    "origDsCreatedTime": "2019-02-19T07:01:22.000Z",
    "origDsTblName": "datasource",
    "origDsDbName": "polaris_v2",
    "origDsModifiedTime": "2019-02-19T07:01:22.000Z",
    "dfId": "1ebd7022-54b1-4b2f-b7ea-f6f9bb525b54",
    "dsCreatedTime": "2019-02-19T07:01:26.000Z",
    "origDsStoredUri": null,
    "origDsCreatedBy": "admin",
    "origDsQueryStmt": "select * from polaris_v2.datasource",
    "origDsConnectionInfo": {
      "origDsDcImplementor": "MYSQL",
      "origDsDcPort": 3306,
      "origDsDcHostname": "localhost",
      "origDsDcId": "806942d7-682a-452a-81fa-e00812bbadee",
      "origDsDcUsername": "polaris",
      "origDsDcUrl": null,
      "origDsDcName": "MySQL-localhost-3306",
      "origDsDcType ": "JDBC",
      "origDsDcDesc": null
    }
  },
  "ruleStringInfo": [
    {
      "ruleNo": 0,
      "ruleString": "create with: 78f4134b-ad8b-41b4-bed3-b90508191a4d",
      "jsonRuleString": "{\"with\":\"78f4134b-ad8b-41b4-bed3-b90508191a4d\",\"name\":\"create\"}",
      "shortRuleString": "create with datasource (MYSQL)",
      "valid": true
    },
    {
      "ruleNo": 1,
      "ruleString": "drop col: `datasource_contexts`",
      "jsonRuleString": "{\"col\":{\"value\":\"datasource_contexts\"},\"name\":\"drop\"}",
      "shortRuleString": "Drop datasource_contexts",
      "valid": true
    },
    {
      "ruleNo": 2,
      "ruleString": "drop col: `ds_fail_on_engine`",
      "jsonRuleString": "{\"col\":{\"value\":\"ds_fail_on_engine\"},\"name\":\"drop\"}",
      "shortRuleString": "Drop ds_fail_on_engine",
      "valid": true
    },
    {
      "ruleNo": 3,
      "ruleString": "drop col: `ds_fields_matched`",
      "jsonRuleString": "{\"col\":{\"value\":\"ds_fields_matched\"},\"name\":\"drop\"}",
      "shortRuleString": "Drop ds_fields_matched",
      "valid": true
    },
    {
      "ruleNo": 4,
      "ruleString": "drop col: `ds_include_geo`",
      "jsonRuleString": "{\"col\":{\"value\":\"ds_include_geo\"},\"name\":\"drop\"}",
      "shortRuleString": "Drop ds_include_geo",
      "valid": true
    },
    {
      "ruleNo": 5,
      "ruleString": "drop col: `ds_desc`",
      "jsonRuleString": "{\"col\":{\"value\":\"ds_desc\"},\"name\":\"drop\"}",
      "shortRuleString": "Drop ds_desc",
      "valid": true
    },
    {
      "ruleNo": 6,
      "ruleString": "drop col: `ingestion_conf`",
      "jsonRuleString": "{\"col\":{\"value\":\"ingestion_conf\"},\"name\":\"drop\"}",
      "shortRuleString": "Drop ingestion_conf",
      "valid": true
    },
    {
      "ruleNo": 7,
      "ruleString": "drop col: `ds_linked_workspaces`, `ds_name`, `ds_owner_id`, `ds_partition_keys`, `ds_partition_separator`, `ds_published`, `ds_seg_granularity`, `ds_src_type`, `ds_status`, `dc_id`, `ss_id`, `smy_id`",
      "jsonRuleString": "{\"col\":{\"value\":[\"ds_linked_workspaces\",\"ds_name\",\"ds_owner_id\",\"ds_partition_keys\",\"ds_partition_separator\",\"ds_published\",\"ds_seg_granularity\",\"ds_src_type\",\"ds_status\",\"dc_id\",\"ss_id\",\"smy_id\"]},\"name\":\"drop\"}",
      "shortRuleString": "Drop 12 columns",
      "valid": true
    }
  ],
  "engine": "EMBEDDED",
  "elapsedTime": {
    "milliseconds": 0,
    "hours": 0,
    "seconds": 1,
    "minutes": 0,
    "days": 0
  },
  "finishTime": "2019-02-19T07:13:05.000Z",
  "dsId": "321e17f0-d14a-42ef-81d3-6f269ab98b33",
  "storedUri": "file:///Development/dataprep/snapshots/11414tafae.csv",
  "dfId": "1ebd7022-54b1-4b2f-b7ea-f6f9bb525b54",
  "dfName": "datasource (MYSQL)_0219_1601",
  "connectionInfo": {
    "dcHostname": null,
    "dcPassword": null,
    "dcImplementor": null,
    "dcId": null,
    "dcName": null,
    "dcType": null,
    "dcDesc": null,
    "dcPort": null,
    "dcUsername": null,
    "dcUrl": null
  },
  "dsName": "datasource",
  "totalLines": 9,
  "ssType": "URI",
  "ssId": "70e51b99-f212-40c9-9169-dee3df9f2574",
  "jsonLineageInfo": {
    "transformRules": [
      {
        "ruleNo": 0,
        "ruleString": "create with: 78f4134b-ad8b-41b4-bed3-b90508191a4d",
        "jsonRuleString": "{\"with\":\"78f4134b-ad8b-41b4-bed3-b90508191a4d\",\"name\":\"create\"}",
        "shortRuleString": "create with datasource (MYSQL)",
        "valid": true
      },
      {
        "ruleNo": 1,
        "ruleString": "drop col: `datasource_contexts`",
        "jsonRuleString": "{\"col\":{\"value\":\"datasource_contexts\"},\"name\":\"drop\"}",
        "shortRuleString": "Drop datasource_contexts",
        "valid": true
      },
      {
        "ruleNo": 2,
        "ruleString": "drop col: `ds_fail_on_engine`",
        "jsonRuleString": "{\"col\":{\"value\":\"ds_fail_on_engine\"},\"name\":\"drop\"}",
        "shortRuleString": "Drop ds_fail_on_engine",
        "valid": true
      },
      {
        "ruleNo": 3,
        "ruleString": "drop col: `ds_fields_matched`",
        "jsonRuleString": "{\"col\":{\"value\":\"ds_fields_matched\"},\"name\":\"drop\"}",
        "shortRuleString": "Drop ds_fields_matched",
        "valid": true
      },
      {
        "ruleNo": 4,
        "ruleString": "drop col: `ds_include_geo`",
        "jsonRuleString": "{\"col\":{\"value\":\"ds_include_geo\"},\"name\":\"drop\"}",
        "shortRuleString": "Drop ds_include_geo",
        "valid": true
      },
      {
        "ruleNo": 5,
        "ruleString": "drop col: `ds_desc`",
        "jsonRuleString": "{\"col\":{\"value\":\"ds_desc\"},\"name\":\"drop\"}",
        "shortRuleString": "Drop ds_desc",
        "valid": true
      },
      {
        "ruleNo": 6,
        "ruleString": "drop col: `ingestion_conf`",
        "jsonRuleString": "{\"col\":{\"value\":\"ingestion_conf\"},\"name\":\"drop\"}",
        "shortRuleString": "Drop ingestion_conf",
        "valid": true
      },
      {
        "ruleNo": 7,
        "ruleString": "drop col: `ds_linked_workspaces`, `ds_name`, `ds_owner_id`, `ds_partition_keys`, `ds_partition_separator`, `ds_published`, `ds_seg_granularity`, `ds_src_type`, `ds_status`, `dc_id`, `ss_id`, `smy_id`",
        "jsonRuleString": "{\"col\":{\"value\":[\"ds_linked_workspaces\",\"ds_name\",\"ds_owner_id\",\"ds_partition_keys\",\"ds_partition_separator\",\"ds_published\",\"ds_seg_granularity\",\"ds_src_type\",\"ds_status\",\"dc_id\",\"ss_id\",\"smy_id\"]},\"name\":\"drop\"}",
        "shortRuleString": "Drop 12 columns",
        "valid": true
      }
    ]
  },
  "ssName": "11414tafae",
  "lineageInfo": "{\"transformRules\":[{\"ruleNo\":0,\"ruleString\":\"create with: 78f4134b-ad8b-41b4-bed3-b90508191a4d\",\"jsonRuleString\":\"{\\\"with\\\":\\\"78f4134b-ad8b-41b4-bed3-b90508191a4d\\\",\\\"name\\\":\\\"create\\\"}\",\"shortRuleString\":\"create with datasource (MYSQL)\",\"valid\":true},{\"ruleNo\":1,\"ruleString\":\"drop col: `datasource_contexts`\",\"jsonRuleString\":\"{\\\"col\\\":{\\\"value\\\":\\\"datasource_contexts\\\"},\\\"name\\\":\\\"drop\\\"}\",\"shortRuleString\":\"Drop datasource_contexts\",\"valid\":true},{\"ruleNo\":2,\"ruleString\":\"drop col: `ds_fail_on_engine`\",\"jsonRuleString\":\"{\\\"col\\\":{\\\"value\\\":\\\"ds_fail_on_engine\\\"},\\\"name\\\":\\\"drop\\\"}\",\"shortRuleString\":\"Drop ds_fail_on_engine\",\"valid\":true},{\"ruleNo\":3,\"ruleString\":\"drop col: `ds_fields_matched`\",\"jsonRuleString\":\"{\\\"col\\\":{\\\"value\\\":\\\"ds_fields_matched\\\"},\\\"name\\\":\\\"drop\\\"}\",\"shortRuleString\":\"Drop ds_fields_matched\",\"valid\":true},{\"ruleNo\":4,\"ruleString\":\"drop col: `ds_include_geo`\",\"jsonRuleString\":\"{\\\"col\\\":{\\\"value\\\":\\\"ds_include_geo\\\"},\\\"name\\\":\\\"drop\\\"}\",\"shortRuleString\":\"Drop ds_include_geo\",\"valid\":true},{\"ruleNo\":5,\"ruleString\":\"drop col: `ds_desc`\",\"jsonRuleString\":\"{\\\"col\\\":{\\\"value\\\":\\\"ds_desc\\\"},\\\"name\\\":\\\"drop\\\"}\",\"shortRuleString\":\"Drop ds_desc\",\"valid\":true},{\"ruleNo\":6,\"ruleString\":\"drop col: `ingestion_conf`\",\"jsonRuleString\":\"{\\\"col\\\":{\\\"value\\\":\\\"ingestion_conf\\\"},\\\"name\\\":\\\"drop\\\"}\",\"shortRuleString\":\"Drop ingestion_conf\",\"valid\":true},{\"ruleNo\":7,\"ruleString\":\"drop col: `ds_linked_workspaces`, `ds_name`, `ds_owner_id`, `ds_partition_keys`, `ds_partition_separator`, `ds_published`, `ds_seg_granularity`, `ds_src_type`, `ds_status`, `dc_id`, `ss_id`, `smy_id`\",\"jsonRuleString\":\"{\\\"col\\\":{\\\"value\\\":[\\\"ds_linked_workspaces\\\",\\\"ds_name\\\",\\\"ds_owner_id\\\",\\\"ds_partition_keys\\\",\\\"ds_partition_separator\\\",\\\"ds_published\\\",\\\"ds_seg_granularity\\\",\\\"ds_src_type\\\",\\\"ds_status\\\",\\\"dc_id\\\",\\\"ss_id\\\",\\\"smy_id\\\"]},\\\"name\\\":\\\"drop\\\"}\",\"shortRuleString\":\"Drop 12 columns\",\"valid\":true}]}",
  "ruleCntDone": 7,
  "ruleCntTotal": 7,
  "createdBy": {
    "type": "user",
    "username": "admin",
    "fullName": "Administrator",
    "email": "admin@metatron.com"
  },
  "createdTime": "2019-02-19T07:13:04.000Z",
  "modifiedBy": {
    "type": "user",
    "username": "admin",
    "fullName": "Administrator",
    "email": "admin@metatron.com"
  },
  "modifiedTime": "2019-02-19T07:13:05.000Z",
  "_links": {
    "self": {
      "href": "http://localhost:4200/api/preparationsnapshots/70e51b99-f212-40c9-9169-dee3df9f2574{?projection}",
      "templated": true
    }
  }
}
ufoscw commented 5 years ago

@brandon-wonjune 아마 Snapshot을 통해서 만들어진 csv에는 헤더정보가 들어 있을겁니다. 그러면 ingestion.removeFirstRow 값이 true 파라미터가 포함되어야 합니다. 이렇게 한번 테스트해보시겠어요?

brandon-wonjune commented 5 years ago

@ufoscw 테스트한 결과 정상적으로 완료됩니다.

한가지 더 문의드릴게 있습니다.

  1. 스냅샷이 아래와 같이 생성되는 경우 ingestion 내부의 format type은 아래와 같은 형태로 주면될까요? "STAGING DB(ORC)" -> "orc" "STAGING DB(CSV)" -> "csv" "FILE,HDFS (CSV)" -> "csv" "FILE,HDFS (JSON)" -> "json"

2.위에서 말씀하신것처럼 removeFirstRow에 대해서는 csv만 해당되는건가요?

ufoscw commented 5 years ago

@brandon-wonjune

  1. 네. 그렇게 보내시면됩니다.
  2. 네 File(csv)에만 해당됩니다.
minjung-cho commented 5 years ago

@joohokim1
프랩화면에서 데이터소스를 생성하는 과정에서 우려되는 부분이 있어서 의견드립니다. 화면은 스냅샷 상세 팝업입니다.

  1. '데이터소스 생성' 버튼을 클릭했을 때 데이터소스 화면으로 점프하게 됩니다. 이때 생성 취소를 하면 데이터소스 목록으로 랜딩하는 플로우로 현재 구현되어 있습니다. 사용자가 길을 잃는 케이스가 발생하므로, 최소한 데이터소스 화면으로 점프하기 전에 '데이터소스 화면으로 이동하시겠습니까?'라는 메시지를 보여주는 것이 어떨지요-
  2. 실제로 데이터가 없을 경우, 데이터소스가 생성되지 않습니다. 따라서 이 경우에 '데이터소스 생성' 버튼을 숨겨줘야 할 것 같습니다.

의견 부탁드립니다-

joohokim1 commented 5 years ago

@minjung-cho @ksparknot

말씀주신 2개 의견 모두 동의합니다. 감사합니다~

kyungtaak commented 5 years ago
  1. '데이터소스 생성' 버튼을 클릭했을 때 데이터소스 화면으로 점프하게 됩니다. 이때 생성 취소를 하면 데이터소스 목록으로 랜딩하는 플로우로 현재 구현되어 있습니다. 사용자가 길을 잃는 케이스가 발생하므로, 최소한 데이터소스 화면으로 점프하기 전에 '데이터소스 화면으로 이동하시겠습니까?'라는 메시지를 보여주는 것이 어떨지요-

@minjung-cho @joohokim1 ui 내에서 생성되는 지점에 맞게 view histroy 관리를 해야 맞을 것 같은데요. 굳이 데이터소스 생성화면으로 진입합니다라는 것을 표시해줘야하는지 의문입니다. 참고로, prep 말고 datasource 생성 화면에 진입하는 곳은 workbench 도 있습니다. @eltriny @brandon-wonjune ui 내에서 데이터소스 생성단계 취소시 데이터 소스 생성이 시작되었던 위치로 이동이 가능한지 검토 부탁드립니다.

minjung-cho commented 5 years ago

@kyungtaak 말씀주신 것에 동의하고요, 프론트에서 당장은 구조 변경이 어렵다는 의견이 있으셔서 1번 안을 제안드렸습니다

brandon-wonjune commented 5 years ago

@kyungtaak 현재구조상 workbench 처럼 할 수없습니다. workbench의 경우 workbench에서만 source생성을 띄우지만 snapshot의 경우 snapshot detail에서 source 생성을 띄우고, source쪽에서는 snapshot detail을 띄우기 때문에 모듈이 충돌이 납니다. 이것을 해결하려면 현재 구조를 수정해야됩니다.

kyungtaak commented 5 years ago

@brandon-wonjune 그렇다면, 구조 수정을 해야할것 같은데요. 검토 부탁드립니다.

joohokim1 commented 5 years ago

10000 대신 실제 row count가 나와야 함