我在Hadoop上运行Hive,并使用bdutil 1.3.1版成功安装在Google Cloud Storage上。我运行了以下命令:
./bdutil -e platforms/hdp/ambari_env.sh deploy
作为配置单元用户,我能够轻松创建/删除数据库和表:
hive> create database db_final location 'gs://cip-hadoop-dev-data/apps/hive/warehouse/db_final';
OK
Time taken: 1.816 seconds
但是,如果我尝试以任何其他用户身份访问数据库,则会收到以下错误:
hive> use db_final;
FAILED: SemanticException MetaException(message:java.security.AccessControlException: Permission denied: user=andy, path="gs://cip-hadoop-dev-data/apps/hive/warehouse/db_final":hive:hive:drwx------)
我可以说这是权限错误,因为文件权限为700,该权限已在上面列出并通过命令行确认:
[andy@hadoop-m ~]$ hdfs dfs -ls gs:///apps/hive/warehouse/
drwx------ - andy andy 0 2015-09-11 01:46 gs:///apps/hive/warehouse/db_final
我尝试使用hdfs命令更改文件的权限,但它们保持不变:
[andy@hadoop-m ~]$ sudo hdfs dfs -chmod 750 gs:///apps/hive/warehouse/db_final
[andy@hadoop-m ~]$ hdfs dfs -ls gs:///apps/hive/warehouse/
drwx------ - andy andy 0 2015-09-11 01:46 gs:///apps/hive/warehouse/db_final
我还向用户授予了对数据库的SELECT权限,这成功了,但是当我尝试使用数据库时仍然遇到相同的错误。
这似乎有点类似于this issue,但是我使用的是最新版本的bdutil,所以我不知道这是否是同一问题。我还确认dfs.permissions.enabled设置为false。
因此,如果我以配置单元用户身份运行它,一切似乎都可以正常工作,但是我不想将配置单元用户名/密码发送给需要访问数据库的每个人。
我还应该尝试/研究什么?
谢谢你的帮助
最佳答案
确实,部分问题是GCS连接器实际上没有posix / hdfs权限。它仅报告静态权限,而实际上使用不与GCE VM上的linux帐户绑定(bind)的oauth2凭据进行身份验证。
我们最近添加了一项功能,允许使用fs.gs.reported.permissions
从GCS连接器修改报告的权限:https://github.com/GoogleCloudPlatform/bigdata-interop/commit/93637a136cdb7354b1a93cc3c7a61c42b0bc78a6
它尚未在正式版本中发布,但是您可以按照此处的说明尝试构建快照:https://github.com/GoogleCloudPlatform/bigdata-interop
mvn -P hadoop2 package
然后,使用新版本替换现有的GCS连接器jarfile。另外,要进行快速测试,可以使用temporary snapshot build we have,请记住,提供的链接将在截止日期后停止工作,并且尚未针对生产工作负载验证快照构建。如果您只想先通过快照构建来验证概念验证,那么应该很快会有一个正式版本,它将提供jarfile的完整构建。
替换jar文件后,您可以尝试修改
core-site.xml
以将fs.gs.reported.permissions
设置为类似于755
甚至是777
的权限;请注意,将GCS连接器报告的权限设置为允许实际上不会泄漏任何其他访问权限,因为GCS访问仅取决于oauth2凭据(如果您使用的是GCE VM,则可能通过service-account)。唯一的目标是找到一个已报告的许可,该许可使您使用的Hadoop工具感到高兴(某些工具可能抱怨777
太宽松)。