Google Cloud 上的 Hive 需要对 /tmp 的权限,但无法更改权限
Hive on Google Cloud wants permissions on /tmp, but no way to change permissions
我正在尝试 运行 Hive 在 Google 云上,click-to-deploy 安装了 Hadoop。 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 version: 1.2.9-hadoop2
Found 8 items
....
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 version: 1.2.9-hadoop2
$ hadoop fs -ls
15/01/28 23:09:35 INFO gcs.GoogleHadoopFileSystemBase: GHFS version: 1.2.9-hadoop2
Found 8 items
....
drwx------ - xxx_gmail_com xxx_gmail_com 0 2015-01-28 21:54 tmp
不同的 chmod
选项,例如 a+w
,无法更改权限。并且文件的 owner/group 始终等于 ssh 用户(上面的日志来自从 Google Cloud 控制台启动的 ssh 终端,它使用您的电子邮件作为用户名)。但是我ssh进去的时候遇到了同样的问题
如何更改权限或让 Hive 不给出错误?
谢谢。
目前,Hadoop 的 GCS 连接器不支持细粒度的 HDFS 权限,因此报告的 700 是 "fake";事实上,权限是通过 ACLs 控制的,如果使用具有 read/write 访问权限的服务帐户,则经过身份验证的 GCE VM 中的任何 linux 用户实际上都能够 read/write/对 GCS 内的所有文件执行。
新出现的 Hive 0.14.0 introduces an unfortunate attempt 检查根目录的最低权限 733,即使它只是忽略了权限,可访问性也会很好。不幸的是,目前 "required permissions" 在 Hive 的 SessionState 中不可配置,在 Hadoop 的 GCS 连接器中也不可配置;在未来的版本中,我们可能会为 Hadoop 的 GCS 连接器提供一个配置设置,以指定要报告的权限,and/or 在所有目录上实现完全细粒度的 posix 权限。
与此同时,Hive 0.13.0 似乎没有相同的不幸检查,所以如果您对稍旧的 Hive 版本没问题,它应该可以正常工作。
重要提示: 也就是说,请注意 "click to deploy" 解决方案目前不正式支持 Pig 或 Hive,部分原因是它尚未设置更高级 "NFS consistency cache" 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 工程团队的持续测试和验证,因此您将获得更好的验证体验。如果愿意,您还可以在 GitHub 上查看 bdutil 的内容,网址为 https://github.com/GoogleCloudPlatform/bdutil
我正在尝试 运行 Hive 在 Google 云上,click-to-deploy 安装了 Hadoop。 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 version: 1.2.9-hadoop2
Found 8 items ....
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 version: 1.2.9-hadoop2
$ hadoop fs -ls 15/01/28 23:09:35 INFO gcs.GoogleHadoopFileSystemBase: GHFS version: 1.2.9-hadoop2
Found 8 items ....
drwx------ - xxx_gmail_com xxx_gmail_com 0 2015-01-28 21:54 tmp
不同的 chmod
选项,例如 a+w
,无法更改权限。并且文件的 owner/group 始终等于 ssh 用户(上面的日志来自从 Google Cloud 控制台启动的 ssh 终端,它使用您的电子邮件作为用户名)。但是我ssh进去的时候遇到了同样的问题
如何更改权限或让 Hive 不给出错误?
谢谢。
目前,Hadoop 的 GCS 连接器不支持细粒度的 HDFS 权限,因此报告的 700 是 "fake";事实上,权限是通过 ACLs 控制的,如果使用具有 read/write 访问权限的服务帐户,则经过身份验证的 GCE VM 中的任何 linux 用户实际上都能够 read/write/对 GCS 内的所有文件执行。
新出现的 Hive 0.14.0 introduces an unfortunate attempt 检查根目录的最低权限 733,即使它只是忽略了权限,可访问性也会很好。不幸的是,目前 "required permissions" 在 Hive 的 SessionState 中不可配置,在 Hadoop 的 GCS 连接器中也不可配置;在未来的版本中,我们可能会为 Hadoop 的 GCS 连接器提供一个配置设置,以指定要报告的权限,and/or 在所有目录上实现完全细粒度的 posix 权限。
与此同时,Hive 0.13.0 似乎没有相同的不幸检查,所以如果您对稍旧的 Hive 版本没问题,它应该可以正常工作。
重要提示: 也就是说,请注意 "click to deploy" 解决方案目前不正式支持 Pig 或 Hive,部分原因是它尚未设置更高级 "NFS consistency cache" 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 工程团队的持续测试和验证,因此您将获得更好的验证体验。如果愿意,您还可以在 GitHub 上查看 bdutil 的内容,网址为 https://github.com/GoogleCloudPlatform/bdutil