`
thomas0988
  • 浏览: 473385 次
  • 性别: Icon_minigender_1
  • 来自: 南阳
社区版块
存档分类
最新评论

hadoop,hbase,zookeeper错误日志及部分解决办法(2)

 
阅读更多

hdfs中,提示权限错误:

代码如下:
public class Loadup {
public static void main(String[] args) throws Exception{
final int piece=10;
String localSrc=args[0];
String Dst=args[1];
Configuration conf=new Configuration();
InputStream in=new BufferedInputStream(new FileInputStream(localSrc));
FileSystem fs=FileSystem.get(URI.create(Dst),conf);
OutputStream out=fs.create(new Path(Dst),new Progressable(){
public void progress(){
System.out.println("copy:......");
}
});
IOUtils.copyBytes(in, out, 4096,true);
System.out.println("success");
}
}
报错情况如下:

Exception in thread "main" org.apache.hadoop.security.AccessControlException:

org.apache.hadoop.security.AccessControlException: Permission denied: user=lenovo-pc\lenovo, access=WRITE, inode="hadoopnode":hadoopnode:supergroup:rwxr-xr-x
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)

解决办法如下:
hadoop fs -chmod 777 /user/input
hadoop fs -chmod 777 /user/output

hadoop fs -chmod 777 /user/hadoop

Hadoop】集群之外的机器如何连接到集群并与HDFS交互,提交作业给Hadoop集群

转自:http://blog.csdn.net/zklth/article/details/5618942

集群以外的机器如何访问Hadoop集群,并像集群中提交作业和传送数据
(1)首先,在机器上安装nutch或者hadoop
(2)配置两个文件
hadoop-site.xml:
<configuration><property>
 <name>fs.default.name</name>
 <value>hdfs://gc04vm12:9000</value>
 <description> </description>
</property>

<property>
     <name>mapred.job.tracker</name>
 <value>gc04vm12:9001</value>
 <description> </description>
</property>

</configuration>

(3)这样便能执行命令,查看集群状态,向集群提交作业


(4)hdfs中的用户
使用root登陆而hadoop中没有创建root用户时,使用如下命令时,查看到的就不是nutch用户主目录 /user/root了
[root@gc03vm12 nutch-1.0]# bin/hadoop dfs -ls   执行此命令时,即是列出/user/root(root用户主目录)目录下的文件或目录
ls: Cannot access .: No such file or directory.  没有此目录

[root@gc03vm12 nutch-1.0]# bin/hadoop dfs -ls /
Found 3 items
drwxr-xr-x   - nutch supergroup          0 2010-05-21 00:42 /tmp
drwxr-xr-x   - nutch supergroup          0 2010-05-21 00:53 /user
drwxr-xr-x   - nutch supergroup          0 2010-05-21 00:55 /usr    这个是什么?

[root@gc03vm12 nutch-1.0]# bin/hadoop dfs -mkdir x  主目录(/user/root)中创建x目录,提示以下信息
mkdir: org.apache.hadoop.security.AccessControlException: Permission denied: user=root, access=WRITE, inode="user":nutch:supergroup:rwxr-xr-x
这是因为root用户对/user/目录没有写权限(drwxr-xr-x   - nutch supergroup          0 2010-05-21 00:53 /user)


hdfs中的nutch用户是启动hadoop集群的这个用户,当客户机中也存在nutch用户时,登陆后访问hdfs时,进入的是home目录(/user/nutch)。
hdfs中文件和目录的权限类似linux,可以修改其权限,改变其所属组

nutch用户格式化namenode,启动hadoop集群(会用到nutch用户的公钥信息,ssh配置)后,执行命令,
[nutch@gc03vm12 nutch-1.0]# bin/hadoop dfs -ls   执行此命令时,即是列出/user/nutch(nutch用户主目录)目录下的文件或目录
ls: Cannot access .: No such file or directory.
因为没有/user/nutch目录,所以不能访问,而此时若创建一个文件,如使用以下命令
[nutch@gc03vm12 nutch-1.0]# bin/hadoop dfs -mkdir x  则可以顺利执行,此时它将创建/user/nutch/x目录。
而使用root用户不行,是因为 root用户对/user/目录没有写权限。

那么如何创建一个root用户呢,可以这样做
超级用户nutch在hdfs中创建目录/user/root,即 bin/hadoop dfs -mkdir /user/root
更改/user/root目录所属用户和组, bin/hadoop dfs -chown -R root:root /user/root (若此处没有指定组,则默认root属于supergroup组, bin/hadoop dfs -chown -R root /user/root)
这样就相当于在hdfs中创建了用户root,组root;

用户权限和Linux类似,nutch是超级用户。

例如nutch在root的home目录下创建目录s,则s的权限如下,属于nutch,组是root
drwxr-xr-x   - nutch root          0 2010-05-21 04:41 /user/root/s
root用户此时就不能写s目录了
[root@gc04vm14 nutch-1.0]# bin/hadoop dfs -mkdir s/x
mkdir: org.apache.hadoop.security.AccessControlException: Permission denied: user=root, access=WRITE, inode="s":nutch:root:rwxr-xr-x


root用户属于root组,并且执行作业,会提示错误,如下
[root@gc03vm12 nutch-1.0]# bin/nutch crawl  /user/nutch/urls -dir data2 -depth 5 -topN 8
提示如下错误
org.apache.hadoop.security.AccessControlException: org.apache.hadoop.security.AccessControlException: Permission denied: user=root, access=WRITE, inode="tmp":nutch:supergroup:rwxr-xr-x

这是因为root用户对/tmp目录(hdfs目录)没有写权限,因为作业执行时,会在/tmp目录下生成相应的job文件,
/tmp的权限如下:
drwxr-xr-x   - nutch supergroup          0 2010-05-21 00:42 /tmp

因此非超级用户提交作业时,用户问题是一个很麻烦的问题

注:

hadoop有些命令只能在namenode上执行

 

 

在windows eclipse开发环境提交job到远处linux hadoop集群,运行mapred报错“IOException: Cannotrunprogram "chmod": CreateProcess error=2

 原因:安装cygwin,而且需要设置"cygwin\bin"到环境变量PATH中,使用eclipse-plugin提交mapreduce程序,必须在window端安装cygwin,并将cygwin\bin"到环境变量PATH中,否则不行。

 如果eclipse-plugin提交任务遇到这个错误:org.apache.hadoop.security.AccessControlException: Permission denied: user=cyg_server, access=EXECUTE, inode="job_201010161322_0003":heipark:supergroup:rwx------

 解决:

1、刚开始还使用“./bin/hadoop dfs -chmod 777 ”,后来发现老是这样设置麻烦。可以取消hadoop hdfs的用户权限检查。打开conf/hdfs-site.xml,找到dfs.permissions属性修改为false(默认为true)OK了。注意生产环境处于安全考虑不要这么搞。

2、修改hadoop location参数,在advanced parameter选项卡中,找到hadoop.job.ugi项,将此项改为“你的hadoop用户名”,Tardis,这样就不会出现那个错误了

 

 

如果运行简单的hadoop mapreduce wordcount程序,点击run on hadoop出现以下错误:

11/08/16 10:31:39 WARN mapred.LocalJobRunner: job_local_0001
java.lang.OutOfMemoryError: Java heap space
 at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.<init>(MapTask.java:781)
 at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:350)
 at org.apache.hadoop.mapred.MapTask.run(MapTask.java:307)
 at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:177)
11/08/16 10:31:39 INFO mapred.JobClient:  map 0% reduce 0%
11/08/16 10:31:39 INFO mapred.JobClient: Job complete: job_local_0001
11/08/16 10:31:39 INFO mapred.JobClient: Counters: 0
Exception in thread "main" java.io.IOException: Job failed!
 at org.apache.hadoop.mapred.JobClient.runJob(JobClient.java:1252)
 at mapred.WordCount.main(WordCount.java:110)

 原因:客户端程序运行时java虚拟机内存分配不够

 解决:修改run configuration(右键要执行的程序,run as >run configurations),弹出窗口中左侧选择要执行的程序,右边选择Arguments选项卡,在VM arguments栏中加入-Xmx1024m,保存后执行没有问题(即将执行时虚拟机内存调大)

 

来自: http://hi.baidu.com/xinfeng999/blog/item/3bf0ae509c42d07e84352401.html
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics