代码之家  ›  专栏  ›  技术社区  ›  lampShadesDrifter

为空目录钻取“验证错误:架构中已存在具有给定名称的表或视图”

  •  0
  • lampShadesDrifter  · 技术社区  · 7 年前

    将集群上的drill升级到drill-1.12.0-mapr,测试日常ETL脚本(都使用drill将拼花地板文件转换为tsv)后,出现验证错误(“ 具有给定名称的表或视图已存在 )在尝试运行 CREATE TABLE 空的 可写工作区中的目录。

    [Error Id: 6ea46737-8b6a-4887-a671-4bddbea02476 on mapr002.ucera.local:31010]
    at org.apache.drill.jdbc.impl.DrillCursor.nextRowInternally(DrillCursor.java:489)
    at org.apache.drill.jdbc.impl.DrillCursor.loadInitialSchema(DrillCursor.java:561)
    :
    :
    :
    Caused by: org.apache.drill.common.exceptions.UserRemoteException: VALIDATION ERROR: A table or view with given name [/internal_etl/project/version-2/stages/storage/ACCOUNT/tsv] already exists in schema [dfs.etl_internal]
    

    它实际上是空的 ,但仍然抛出这些错误。

    在上面的错误消息的关联节点的drillbit.log文件中查找错误ID,我们看到

    2018-12-04 10:13:25,285 [23f92019-db56-862f-e7b9-cd51b3e174ae:foreman] INFO  o.a.drill.exec.work.foreman.Foreman - Query text for query id 23f92019-db56-862f-e7b9-cd51b3e174ae: create table dfs.etl_internal.`/internal_etl/project/version-2/stages/storage/ACCOUNT/tsv` as 
    select <a bunch of fields>
    from dfs.etl_internal.`/internal_etl/project/version-2/stages/storage/ACCOUNT/parquet`
    2018-12-04 10:13:25,406 [23f92019-db56-862f-e7b9-cd51b3e174ae:foreman] INFO  o.a.d.exec.store.dfs.FileSelection - FileSelection.getStatuses() took 0 ms, numFiles: 1
    2018-12-04 10:13:25,408 [23f92019-db56-862f-e7b9-cd51b3e174ae:foreman] INFO  o.a.d.exec.store.dfs.FileSelection - FileSelection.getStatuses() took 0 ms, numFiles: 1
    2018-12-04 10:13:25,893 [23f92019-db56-862f-e7b9-cd51b3e174ae:foreman] INFO  o.a.d.exec.store.dfs.FileSelection - FileSelection.getStatuses() took 0 ms, numFiles: 1
    2018-12-04 10:13:25,894 [23f92019-db56-862f-e7b9-cd51b3e174ae:foreman] INFO  o.a.d.exec.store.dfs.FileSelection - FileSelection.getStatuses() took 0 ms, numFiles: 1
    2018-12-04 10:13:25,898 [23f92019-db56-862f-e7b9-cd51b3e174ae:foreman] INFO  o.a.d.exec.store.dfs.FileSelection - FileSelection.getStatuses() took 0 ms, numFiles: 1
    2018-12-04 10:13:25,898 [23f92019-db56-862f-e7b9-cd51b3e174ae:foreman] INFO  o.a.d.exec.store.dfs.FileSelection - FileSelection.getStatuses() took 0 ms, numFiles: 1
    2018-12-04 10:13:25,905 [23f92019-db56-862f-e7b9-cd51b3e174ae:foreman] INFO  o.a.d.e.p.s.h.CreateTableHandler - User Error Occurred: A table or view with given name [/internal_etl/project/version-2/stages/storage/ACCOUNT/tsv] already exists in schema [dfs.etl_internal]
    org.apache.drill.common.exceptions.UserException: VALIDATION ERROR: A table or view with given name [/internal_etl/project/version-2/stages/storage/ACCOUNT/tsv] already exists in schema [dfs.etl_internal]
    
    
    [Error Id: 45177abc-7e9f-4678-959f-f9e0e38bc564 ]
        at org.apache.drill.common.exceptions.UserException$Builder.build(UserException.java:586) ~[drill-common-1.12.0-mapr.jar:1.12.0-mapr]
        at org.apache.drill.exec.planner.sql.handlers.CreateTableHandler.checkTableCreationPossibility(CreateTableHandler.java:326) [drill-java-exec-1.12.0-mapr.jar:1.12.0-mapr]
        at org.apache.drill.exec.planner.sql.handlers.CreateTableHandler.getPlan(CreateTableHandler.java:90) [drill-java-exec-1.12.0-mapr.jar:1.12.0-mapr]
        at org.apache.drill.exec.planner.sql.DrillSqlWorker.getQueryPlan(DrillSqlWorker.java:131) [drill-java-exec-1.12.0-mapr.jar:1.12.0-mapr]
        at org.apache.drill.exec.planner.sql.DrillSqlWorker.getPlan(DrillSqlWorker.java:79) [drill-java-exec-1.12.0-mapr.jar:1.12.0-mapr]
        at org.apache.drill.exec.work.foreman.Foreman.runSQL(Foreman.java:567) [drill-java-exec-1.12.0-mapr.jar:1.12.0-mapr]
        at org.apache.drill.exec.work.foreman.Foreman.run(Foreman.java:264) [drill-java-exec-1.12.0-mapr.jar:1.12.0-mapr]
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_151]
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_151]
        at java.lang.Thread.run(Thread.java:748) [na:1.8.0_151]
    2018-12-04 10:13:25,924 [23f92019-db56-862f-e7b9-cd51b3e174ae:foreman] INFO  o.apache.drill.exec.work.WorkManager - Waiting for 0 queries to complete before shutting down
    2018-12-04 10:13:25,924 [23f92019-db56-862f-e7b9-cd51b3e174ae:foreman] INFO  o.apache.drill.exec.work.WorkManager - Waiting for 0 running fragments to complete before shutting down
    

    即使在使用 DROP TABLE [IF EXISTS] <workspace>.<table path name> 陈述此外,dfs工作区本身的配置似乎没有从升级到drill-1.12之前更改,请参见以下内容:

    :
    :
    "workspaces": {
    "root": {
    "location": "/",
    "writable": false,
    "defaultInputFormat": null,
    "allowAccessOutsideWorkspace": false
    },
    "tmp": {
    "location": "/tmp",
    "writable": true,
    "defaultInputFormat": null,
    "allowAccessOutsideWorkspace": false
    },
    "etl_internal": {
    "location": "/etl/internal",
    "writable": true,
    "defaultInputFormat": null,
    "allowAccessOutsideWorkspace": false
    }
    },
    :
    :
    

    请注意,所讨论的整个过程旨在 mv 目录内容每天都在更新 在使用drill-1.11时,这个过程运行良好。

    更多调试信息:

    在CREATETABLE语句期间,仅删除…/tsv endpoint文件夹并依靠drill生成目录是不起作用的。抛出一个不足为奇的错误

    Error: VALIDATION ERROR: Table [/internal_etl/project/version-2/stages/storage/ACCOUNT/tsv] not found
    [Error Id: 02e7c088-9162-4731-9fa8-85dfd39e1dec on mapr001.ucera.local:31010] (state=,code=0)
    

    撤消这些更改并重新运行以获得原始错误,我们可以通过sqlline解释器接口检查位置。这样做,我们看到了

    0: jdbc:drill:zk=mapr001:5181,mapr002:5181,ma> describe dfs.etl_internal.`/internal_etl/project/version-2/stages/storage/ACCOUNT/tsv`;
    +--------------+------------+--------------+
    | COLUMN_NAME  | DATA_TYPE  | IS_NULLABLE  |
    +--------------+------------+--------------+
    +--------------+------------+--------------+
    No rows selected (1.791 seconds)
    

    所以它在那里看到了一些东西,但只有在 我自己做的 ,这类似于第22条军规,因为原始错误是 抱怨已经有东西了

    如果有更多使用钻孔经验的人知道这里会发生什么,任何意见或建议都将不胜感激。

    2 回复  |  直到 7 年前
        1
  •  0
  •   lampShadesDrifter    7 年前

    太长,读不下去了 :重新启动节点上的钻头,现在一切似乎都正常工作。

    为了让drill无误地运行CTAS语句,所做的工作是:

    1. 从MapR MCS重新启动演练服务。这完全是基于 jps 查看钻头1.11是否仍在运行,以及 kill -9 <pid of 1.11 drillbit> 但是记录,因为这是整个过程中唯一的变化 运行前未撤消的调试 这些变化最终似乎解决了问题
    2. 更改了使用脚本删除目标文件夹的演练( hadoop fs -rm -r /hdfs/path/to/folder )在CTAS语句上运行一些必要的进程,然后让CTAS语句自己重新创建它之后(尽管如前一篇文章中所述,之前尝试过此操作,并在奇怪的catch-22情况下收到“Table not found”错误(因此我认为重新启动drill服务可能是原因之一))。

    我知道重新启动服务可能不是最好的答案,但这似乎在这里起作用。如果有人需要根据上述解决方案描述添加更多信息或想法,请留下评论。

    推荐文章