通过 Beeline 使用 Spark SQL 时无法加载 AWS 凭证
Unable to load AWS credentials when using Spark SQL through Beeline
使用 Beeline 连接到 SparkSQL 1.3,我正在尝试创建一个使用 S3 数据(使用 s3a 协议)的 table:
CREATE EXTERNAL TABLE mytable (...) STORED AS PARQUET LOCATION 's3a://mybucket/mydata';
我收到以下错误:
Error: org.apache.spark.sql.execution.QueryExecutionException: FAILED: AmazonClientException Unable to load AWS credentials from any provider in the chain (state=,code=0)
我在spark-env.sh
中设置了以下环境变量:
AWS_ACCESS_KEY_ID=<my_access_key>
AWS_SECRET_ACCESS_KEY=<my_secret_key>
我知道它选择了这个环境,因为这里也设置了类路径,并且它引入了 Hadoop 工具库(它有 S3 连接器)。但是,当我在直线中显示变量时,它说它们未定义:
0: jdbc:hive2://localhost:10000> set env:AWS_ACCESS_KEY_ID;
+------------------------------------+
| |
+------------------------------------+
| env:AWS_ACCESS_KEY_ID=<undefined> |
+------------------------------------+
1 row selected (0.112 seconds)
0: jdbc:hive2://localhost:10000> set env:AWS_SECRET_ACCESS_KEY;
+----------------------------------------+
| |
+----------------------------------------+
| env:AWS_SECRET_ACCESS_KEY=<undefined> |
+----------------------------------------+
1 row selected (0.009 seconds)
设置fs.s3a.access.key
和fs.s3a.secret.key
也没有任何效果:
0: jdbc:hive2://localhost:10000> set fs.s3a.access.key=<my_access_key>;
0: jdbc:hive2://localhost:10000> set fs.s3a.secret.key=<my_secret_key>;
我是否需要在其他地方设置此环境?
FWIW,我可以成功使用 hadoop fs -ls s3a://mybucket/mydata
列出文件。
更新:
我在 hive-site.xml
中添加了以下内容:
<property>
<name>fs.s3a.access.key</name>
<value>my_access_key</value>
</property>
<property>
<name>fs.s3a.secret.key</name>
<value>my_secret_key</value>
</property>
我现在可以毫无错误地创建 table,但任何查询它的尝试都会导致此错误:
Error: org.apache.spark.SparkException: Job aborted due to stage failure:
Task 0 in stage 0.0 failed 1 times, most recent failure:
Lost task 0.0 in stage 0.0 (TID 0, localhost): com.amazonaws.AmazonClientException:
Unable to load AWS credentials from any provider in the chain
解决方案是将我的 hdfs-site.xml
文件(其中包含 fs.s3a.access.key
和 fs.s3a.secret.key
值)复制到 $SPARK_HOME/conf
。然后它神奇地起作用了。
使用 Beeline 连接到 SparkSQL 1.3,我正在尝试创建一个使用 S3 数据(使用 s3a 协议)的 table:
CREATE EXTERNAL TABLE mytable (...) STORED AS PARQUET LOCATION 's3a://mybucket/mydata';
我收到以下错误:
Error: org.apache.spark.sql.execution.QueryExecutionException: FAILED: AmazonClientException Unable to load AWS credentials from any provider in the chain (state=,code=0)
我在spark-env.sh
中设置了以下环境变量:
AWS_ACCESS_KEY_ID=<my_access_key>
AWS_SECRET_ACCESS_KEY=<my_secret_key>
我知道它选择了这个环境,因为这里也设置了类路径,并且它引入了 Hadoop 工具库(它有 S3 连接器)。但是,当我在直线中显示变量时,它说它们未定义:
0: jdbc:hive2://localhost:10000> set env:AWS_ACCESS_KEY_ID;
+------------------------------------+
| |
+------------------------------------+
| env:AWS_ACCESS_KEY_ID=<undefined> |
+------------------------------------+
1 row selected (0.112 seconds)
0: jdbc:hive2://localhost:10000> set env:AWS_SECRET_ACCESS_KEY;
+----------------------------------------+
| |
+----------------------------------------+
| env:AWS_SECRET_ACCESS_KEY=<undefined> |
+----------------------------------------+
1 row selected (0.009 seconds)
设置fs.s3a.access.key
和fs.s3a.secret.key
也没有任何效果:
0: jdbc:hive2://localhost:10000> set fs.s3a.access.key=<my_access_key>;
0: jdbc:hive2://localhost:10000> set fs.s3a.secret.key=<my_secret_key>;
我是否需要在其他地方设置此环境?
FWIW,我可以成功使用 hadoop fs -ls s3a://mybucket/mydata
列出文件。
更新:
我在 hive-site.xml
中添加了以下内容:
<property>
<name>fs.s3a.access.key</name>
<value>my_access_key</value>
</property>
<property>
<name>fs.s3a.secret.key</name>
<value>my_secret_key</value>
</property>
我现在可以毫无错误地创建 table,但任何查询它的尝试都会导致此错误:
Error: org.apache.spark.SparkException: Job aborted due to stage failure:
Task 0 in stage 0.0 failed 1 times, most recent failure:
Lost task 0.0 in stage 0.0 (TID 0, localhost): com.amazonaws.AmazonClientException:
Unable to load AWS credentials from any provider in the chain
解决方案是将我的 hdfs-site.xml
文件(其中包含 fs.s3a.access.key
和 fs.s3a.secret.key
值)复制到 $SPARK_HOME/conf
。然后它神奇地起作用了。