Google云上的Hive需要/ tmp上的权限,但无法更改权限

时间:2015-01-28 23:16:56

标签: hadoop hive google-compute-engine chmod google-cloud-platform

我正在尝试在Google云上运行Hive,其中Hadoop由click-to-deploy安装。 Hive似乎安装得很好,但是当我运行hive时,我得到以下错误输出:

Logging initialized using configuration in jar:file:/home/michael_w_sherman_gmail_com/apache-hive-0.14.0-bin/l
ib/hive-common-0.14.0.jar!/hive-log4j.properties
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/home/hadoop/hadoop-install/share/hadoop/common/lib/slf4j-log4j12-1.7.5.jar!
/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/home/michael_w_sherman_gmail_com/apache-hive-0.14.0-bin/lib/hive-jdbc-0.14.
0-standalone.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
Exception in thread "main" java.lang.RuntimeException: java.lang.RuntimeException: The root scratch dir: /tmp/
hive on HDFS should be writable. Current permissions are: rwx------
        at org.apache.hadoop.hive.ql.session.SessionState.start(SessionState.java:444)
        at org.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:672)
        at org.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:616)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at org.apache.hadoop.util.RunJar.main(RunJar.java:212)
Caused by: java.lang.RuntimeException: The root scratch dir: /tmp/hive on HDFS should be writable. Current per
missions are: rwx------
        at org.apache.hadoop.hive.ql.session.SessionState.createRootHDFSDir(SessionState.java:529)
        at org.apache.hadoop.hive.ql.session.SessionState.createSessionDirs(SessionState.java:478)
        at org.apache.hadoop.hive.ql.session.SessionState.start(SessionState.java:430)
        ... 7 more

我的第一个问题是检查hdfs-site.xml并更改dfs.permissions.enabled设置,但已将其设置为false。接下来,我尝试chmod权限。但是chmod的变化并没有。

  

$ hadoop fs -ls

     

15/01/28 23:03:13 INFO gcs.GoogleHadoopFileSystemBase:GHFS版本:1.2.9-hadoop2

     

找到8项   ....

     

drwx ------ - xxxx_gmail_com xxxx_gmail_com 0 2015-01-28 21:54 tmp

     

$ hadoop fs -chmod -R 777 / tmp

     

15/01/28 23:03:31 INFO gcs.GoogleHadoopFileSystemBase:GHFS版本:1.2.9-hadoop2

     

$ hadoop fs -ls   15/01/28 23:09:35 INFO gcs.GoogleHadoopFileSystemBase:GHFS版本:1.2.9-hadoop2

     

找到8项   ....

     

drwx ------ - xxx_gmail_com xxx_gmail_com 0 2015-01-28 21:54 tmp

chmod等不同a+w选项无法更改权限。并且文件的所有者/组始终等于ssh用户(上面的日志来自从Google Cloud的控制台启动的ssh终端,该控制台使用您的电子邮件作为用户名)。但是当我进入ssh时,我遇到同样的问题。

如何更改权限或让Hive不提供错误?

谢谢。

1 个答案:

答案 0 :(得分:3)

目前,Hadoop的GCS连接器不支持细粒度的HDFS权限,因此报告的700是“假的”;实际上,权限是通过ACLs控制的,如果使用具有读/写访问权限的服务帐户,则经过身份验证的GCE VM中的任何Linux用户实际上都能够读取/写入/执行GCS内的所有文件。 / p>

Hive 0.14.0新鲜introduces an unfortunate attempt来检查根目录上的最小权限733,即使它只是忽略了权限,可访问性也会很好。不幸的是,目前,“必需的权限”在Hive的SessionState中是不可配置的,也不能在Hadoop的GCS连接器中配置;在将来的版本中,我们可以为Hadoop的GCS连接器提供配置设置,以指定要报告的权限,和/或在所有目录上实现完全细粒度的posix权限。

与此同时,看起来Hive 0.13.0没有相同的不幸检查,所以如果你对Hive版本略胜一筹,它应该可以正常工作。

重要说明那就是说,请注意“点击部署”解决方案目前尚未正式支持Pig或Hive,部分原因是它尚未设置更高级的“NFS一致性”缓存“introduced in gcs-connector-1.3.0/bdutil-0.36.4,自动设置列表一致性缓存。 如果没有列表一致性缓存,Hive和Pig可能会意外丢失数据,因为它们依赖“ls”提交临时文件

您最好的选择是下载latest bdutil-1.1.0然后使用它;它支持Pig和Hive:

./bdutil -e querytools deploy

或等效地:

./bdutil -e extensions/querytools/querytools_env.sh deploy

querytools_env.sh文件中,您会找到:

# URIs of tarballs to install.
PIG_TARBALL_URI='gs://querytools-dist/pig-0.12.0.tar.gz'
HIVE_TARBALL_URI='gs://querytools-dist/hive-0.12.0-bin.tar.gz'

您可以选择将自己的Hive版本上传到自己的广告位,并修改HIVE_TARBALL_URI bdutil以获取它。 Hive 0.14.0仍然无法正常工作,但你可能会对Hive 0.13.0感到满意。或者,如果您不太关心版本,默认的Hive 0.12.0会接受来自Google工程团队的持续测试和验证,因此您将获得更好的验证体验。如果您愿意,还可以在https://github.com/GoogleCloudPlatform/bdutil

上查看GitHub上的bdutil内容