【问题标题】:Create Hive External Table on S3 throws "org.apache.hadoop.fs.s3a.S3AFileSystem not found" Exception在 S3 上创建 Hive 外部表会抛出“org.apache.hadoop.fs.s3a.S3AFileSystem not found”异常
【发布时间】:2018-01-24 17:35:33
【问题描述】:

我在本地机器上使用 beeline 在 DDL 下运行,并抛出异常。

DDL 是

CREATE TABLE `report_landing_pages`( 
  `google_account_id` string COMMENT 'from deserializer', 
  `ga_view_id` string COMMENT 'from deserializer', 
  `path` string COMMENT 'from deserializer', 
  `users` string COMMENT 'from deserializer', 
  `page_views` string COMMENT 'from deserializer', 
  `event_value` string COMMENT 'from deserializer', 
  `report_date` string COMMENT 'from deserializer') 
PARTITIONED BY (`dt` date) 
ROW FORMAT SERDE 
  'org.apache.hadoop.hive.serde2.OpenCSVSerde' 
STORED AS TEXTFILE
LOCATION 's3a://bucket_name/table'

例外是

org.apache.hive.service.cli.HiveSQLException: Error while processing statement: FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. MetaException(message:java.lang.RuntimeException: java.lang.ClassNotFoundException: Class org.apache.hadoop.fs.s3a.S3AFileSystem not found) at org.apache.hive.service.cli.operation.Operation.toSQLException(Operation.java:380) at org.apache.hive.service.cli.operation.SQLOperation.runQuery(SQLOperation.java:257) at org.apache.hive.service.cli.operation.SQLOperation.access$800(SQLOperation.java:91) at org.apache.hive.service.cli.operation.SQLOperation$BackgroundWork$1.run(SQLOperation.java:348) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:422) at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1698) at org.apache.hive.service.cli.operation.SQLOperation$BackgroundWork.run(SQLOperation.java:362) 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:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:745) Caused by: org.apache.hadoop.hive.ql.metadata.HiveException: MetaException(message:java.lang.RuntimeException: java.lang.ClassNotFoundException: Class org.apache.hadoop.fs.s3a.S3AFileSystem not found) at org.apache.hadoop.hive.ql.metadata.Hive.createTable(Hive.java:862) at org.apache.hadoop.hive.ql.metadata.Hive.createTable(Hive.java:867) at org.apache.hadoop.hive.ql.exec.DDLTask.createTable(DDLTask.java:4356) at org.apache.hadoop.hive.ql.exec.DDLTask.execute(DDLTask.java:354) at org.apache.hadoop.hive.ql.exec.Task.executeTask(Task.java:199) at org.apache.hadoop.hive.ql.exec.TaskRunner.runSequential(TaskRunner.java:100) at org.apache.hadoop.hive.ql.Driver.launchTask(Driver.java:2183) at org.apache.hadoop.hive.ql.Driver.execute(Driver.java:1839) at org.apache.hadoop.hive.ql.Driver.runInternal(Driver.java:1526) at org.apache.hadoop.hive.ql.Driver.run(Driver.java:1237) at org.apache.hadoop.hive.ql.Driver.run(Driver.java:1232) at org.apache.hive.service.cli.operation.SQLOperation.runQuery(SQLOperation.java:255) ... 11 more Caused by: MetaException(message:java.lang.RuntimeException: java.lang.ClassNotFoundException: Class org.apache.hadoop.fs.s3a.S3AFileSystem not found) at org.apache.hadoop.hive.metastore.api.ThriftHiveMetastore$create_table_with_environment_context_result$create_table_with_environment_context_resultStandardScheme.read(ThriftHiveMetastore.java:42070) at org.apache.hadoop.hive.metastore.api.ThriftHiveMetastore$create_table_with_environment_context_result$create_table_with_environment_context_resultStandardScheme.read(ThriftHiveMetastore.java:42038) at org.apache.hadoop.hive.metastore.api.ThriftHiveMetastore$create_table_with_environment_context_result.read(ThriftHiveMetastore.java:41964) at org.apache.thrift.TServiceClient.receiveBase(TServiceClient.java:86) at org.apache.hadoop.hive.metastore.api.ThriftHiveMetastore$Client.recv_create_table_with_environment_context(ThriftHiveMetastore.java:1199) at org.apache.hadoop.hive.metastore.api.ThriftHiveMetastore$Client.create_table_with_environment_context(ThriftHiveMetastore.java:1185) at org.apache.hadoop.hive.metastore.HiveMetaStoreClient.create_table_with_environment_context(HiveMetaStoreClient.java:2399) at org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient.create_table_with_environment_context(SessionHiveMetaStoreClient.java:93) at org.apache.hadoop.hive.metastore.HiveMetaStoreClient.createTable(HiveMetaStoreClient.java:752) at org.apache.hadoop.hive.metastore.HiveMetaStoreClient.createTable(HiveMetaStoreClient.java:740) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.apache.hadoop.hive.metastore.RetryingMetaStoreClient.invoke(RetryingMetaStoreClient.java:173) at com.sun.proxy.$Proxy34.createTable(Unknown Source) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.apache.hadoop.hive.metastore.HiveMetaStoreClient$SynchronizedHandler.invoke(HiveMetaStoreClient.java:2330) at com.sun.proxy.$Proxy34.createTable(Unknown Source) at org.apache.hadoop.hive.ql.metadata.Hive.createTable(Hive.java:852) ... 22 more

而且我的本地 HDFS 与“hdfs dfs -mkdir s3a://bucket/table”配合得很好

奇怪的是,如果我先不在 S3 上创建表,然后稍后在 Metastore 中手动将表的位置更新为 s3,那么 select 语句就像 select COUNT(*) from report_landing_pages group by google_account_id 工作正常。

如何修复 DDL 中的异常?

顺便说一句,我在 MacOS X EI Caption 下使用 Hive 2.3.2、Hadoop 2.7.5 运行。

【问题讨论】:

    标签: hadoop amazon-s3 hive


    【解决方案1】:

    问题解决了。

    放置 S3 jar 后,metastore 服务也应该重启,除了 hiveserver2。

    【讨论】:

      【解决方案2】:

      您是否将所有必需的 jars s3 等放入类路径? (org.apache.hadoop.fs.s3a.S3AFileSystem) - 这是一个 Hadoop 类,在 Hadoop-aws jar 中找到。报告这些类之一丢失的异常意味着此 jar 不在类路径中。

      【讨论】:

      • 是的。否则select语句将不会成功执行。
      • 我把 haddop-aws-2.7.5.jar 和 aws-sdk-1.7.4.jar 放在 hadoop/share/common/libs 下。罐子还应该放在什么地方?也试过“add jar”,“HIVE_AUX_JARS_PATH”也不行。
      • 您是否尝试以这种方式使用 hive shell 接口将 jars 永久添加到 hive 类路径 - 添加 jar 。罐子路径一一
      • 是的。通过直线。并且“list jars”显示正确
      • 一个。您使用的 AWS 开发工具包版本是什么,并且构建了 Hadoop?您是否使用了多个版本的罐子?湾。您是否能够使用 jar -xvf “解压” jar? jar 是否确实包含包和类“org.apache.hadoop.fs.s3a.S3AFileSystem”c。根据 Oracle 文档,ClassNotFoundException 在类加载调用失败后引发 d。通过加载类似依赖项的不同版本来检查依赖项是否被意外覆盖
      【解决方案3】:

      我尝试在我的环境中创建同一个表,它成功了。

      检查您的:fs.s3a.access.key

      "fs.s3a.secret.key","fs.s3a.impl=org.apache.hadoop.fs.s3a.S3AFileSystem" 
      

      配置文件中的属性。

      【讨论】:

        【解决方案4】:

        是的,没错。放置jar后需要重启hive metastore服务

        要重新启动配置单元元存储,需要遵循以下步骤:

        1. ps -ef | grep 'hive'
        

        使用上述命令来识别 hive 正在使用的进程 ID (PID)。默认情况下,hive 使用 9083 端口号,因此对于正在运行的 hive metastore 服务,您还可以使用lsof -i:9083 命令检查 PID。

        2. kill <process number>
        

        这会杀死现有的 hive 元存储服务。

        3. hive --service metastore
        

        此命令再次启动 Metastore 服务。

        或 如果您使用的是 hive-server 2,请使用以下命令:

        $ sudo /etc/init.d/hive-metastore start
        $ sudo /etc/init.d/hive-metastore stop
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多