http://youzitool.com  新博客,欢迎访问】
【收集】hadoop,hbase,zookeeper错误日志及部分解决办法

这是一位网友收集的hadoop,hbase,zookeeper错误日志及部分解决办法,以备以后遇到问题作为参考之用。

hadoop-0.20.2 & hbase-0.90.1集群启动错误问题解决:

问题如下:org.apache.hadoop.ipc.RPC$VersionMismatch: Protocol org.apache.hadoop.hdfs.protocol.ClientProtocol version mismatch. (client = 42, server = 41) 

        at org.apache.hadoop.ipc.RPC.getProxy(RPC.java:364)
        at org.apache.hadoop.hdfs.DFSClient.createRPCNamenode(DFSClient.java:113)
        at org.apache.hadoop.hdfs.DFSClient.<init>(DFSClient.java:215)
        at org.apache.hadoop.hdfs.DFSClient.<init>(DFSClient.java:177)

……………………………………

2011-01-21 00:14:41,550 INFO org.apache.hadoop.hbase.master.HMaster: Aborting

初步认为是hadoop-0.20.2 & hbase-0.90.1版本问题造成的,hbase-0.90.1/lib中hadoop-core-0.20-append- r1056497.jar使用的hadoop-core-0.20,因此将其替换为hadoop-0.20.2-core.jar即可

Hbase重启之后就无法启动的现象
当我们使用Hbase 0.20.2的时候,遇到了2个奇怪的问题。

我们使用了数台机器构建了一个集群,并且按照Hadoop/Hbase的"Getting Started"安装配置了Hadoop和Hbase。之后能够正常启动Hadoop和Hbase,并且创建table和插入数据。

不过,当我们访问Master的页面时: http://10.37.17.252:60010/master.jsp ,我们发现了第一个问题:在regionserver区域,出现了2个127.0.0.1的regionserver,但是我们并没有在conf/regionservers将master设置为regionserver:

Region Servers
Address Start Code Load
127.0.0.1:60030 1263383321075 requests=0, regions=0, usedHeap=0, maxHeap=0
127.0.0.1:60030 1263383321096 requests=0, regions=0, usedHeap=0, maxHeap=0

………………………………

但是,虽然出现了以上的怪现象,但是hbase似乎仍然能够正常工作。只是,当我们打算重启hbase的时候,我们发现了第二个问题:我们尝试运行bin/stop-hbase.sh,之后,又运行启动hbase的脚本:bin/ start-hbase.sh,这一次,当我们访问master页面的时候http://10.37.17.252:60010/master.jsp,出现了如下的错误

HTTP ERROR: 500
Trying to contact region server null for region , row ", but failed after 3 attempts.
Exceptions:

org.apache.hadoop.hbase.client.RetriesExhaustedException: Failed setting up proxy to /10.37.17.248:60020 after attempts=1

…………………………

此时,Hbase能够进入shell,但是无法执行任何操作。于是再次试图关闭hbase的时候,却发现无法停止master,那个"stop master"后面的“.”出现了许许多多,仍然无法停止master节点。于是我们不得不强制kill掉master。Hbase就这样挂掉了。。。。。

Hbase重启之后就无法启动的原因分析
经过多方排查,最后我在尝试使用netstat -an查看端口占用情况的时候发现:
在WAMDM1节点上,regionserver占用的60020端口占用为:127.0.0.1:60020
而在WAMDM2节点上, regionserver占用的60020端口占用为:10.37.17.249:60020
我感觉颇为蹊跷,之后便检查/etc/hosts文件,果然发现在WAMDM1和WAMDM2下的hosts文件不同。在WAMDM1的hosts文件中的内容为:

127.0.0.1 WAMDM1 localhost.localdomain localhost
10.37.17.248 WAMDM1.ruc.edu.cn WAMDM1
10.37.17.249 WAMDM2.ruc.edu.cn WAMDM2
10.37.17.250 WAMDM3.ruc.edu.cn WAMDM3
10.37.17.251 WAMDM4.ruc.edu.cn WAMDM4
10.37.17.252 WAMDM5.ruc.edu.cn WAMDM5

大家注意第一行。我们在使用配置Hadoop/Hbase的时候,常常使用主机名来代替IP使用,但是在WAMDM1的机器上,WAMDM1被映射为127.0.0.1,于是master和regionserver之间的通信就出错。这也就是为什么我们经常在日志中以及错误提示中看到如下信息:

Server at /10.37.17.248:60020 could not be reached after 1 tries, giving up.

org.apache.hadoop.hbase.client.RetriesExhaustedException: Failed setting up proxy to /10.37.17.248:60020 after attempts=1

  at org.apache.hadoop.hbase.ipc.HBaseRPC.waitForProxy(HBaseRPC.java:424)

………………

Hbase重启之后就无法启动的解决办法
于是,我将所有机器的/etc/hosts文件,都改为了如下配置:

127.0.0.1 localhost
10.37.17.248 WAMDM1.ruc.edu.cn WAMDM1
10.37.17.249 WAMDM2.ruc.edu.cn WAMDM2
10.37.17.250 WAMDM3.ruc.edu.cn WAMDM3
10.37.17.251 WAMDM4.ruc.edu.cn WAMDM4
10.37.17.252 WAMDM5.ruc.edu.cn WAMDM5
# The following lines are desirable for IPv6 capable hosts
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts

同时,为了保险起见,我在stop-hbase.sh中,也加入停止regionservers的命令(虽然在网上查不到停止regionservers的必要性,以及这个脚本存在bug的证据,但是这样改经过测试是没有问题的):

"$bin"/hbase-daemons.sh --config "${HBASE_CONF_DIR}" --hosts "${HBASE_REGIONSERVERS}" stop regionserver 

这个命令需要加在stop master之前。至于不加入这个停止regionservers的命令是否可行,在未来我会进一步测试。

通过以上修改,出现两个127.0.0.1的Regionserver的问题,以及Hbase重启就挂的问题得到彻底解决!

Hbase重启之后就无法启动的问题解决之后的反思
从这次问题解决中吸取如下教训:

在配置分布式系统的时候,一定要注意各个机器之间配置的统一性,包括主机名(hosts文件)、用户名、Hadoop/Hbase各种配置文件等,对于不一致的情况,一定要特别仔细的检查,然后统一起来。已经不止一次在这方面吃亏了,希望大家切记!!!!

转自:http://www.wangzhongyuan.com/archives/788.html

在重新启动HBase服务的时候可能会出现如下的错误:

INFO ipc.HbaseRPC: Server at /227.23.56.100:60020 could not be reached after 1 tries, giving up.

出现这个错误的原因可能会有很多,比如各个配置文件中的地址不一致等,但我这里给出的一个可能原因是端口号被其他某一进程占用,或者还是HBase进程使用着,但此服务(或说此端口)已经不再可用,解决的方式为:通过此端口查找到对应的进程,然后杀死对应的进程,再重启HBase服务,你会发现上面出现的错误将消失,服务启动正常。

具体步骤为:

1、  lsof -i:60020                  2、  kill -9 PID(进程ID)                      3、  重启HBase服务。

FAILED: Error in metadata: MetaException(message:org.apache.hadoop.hbase.MasterNotRunningExceptio

n: dfsname1.cptrue.com:60000

最近在做数据挖掘方面的事情,需要hive+hbase表,但是使用hive链接hbase现有的数据库时,总是抛异常。

FAILED: Error in metadata: MetaException(message:org.apache.hadoop.hbase.MasterNotRunningExceptio

n: dfsname1.cptrue.com:60000
        at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.getMaster(HConnectionManager.java:394)
        at org.apache.hadoop.hbase.client.HBaseAdmin.<init>(HBaseAdmin.java:83)
        at org.apache.hadoop.hive.hbase.HBaseStorageHandler.getHBaseAdmin(HBaseStorageHandler.java:74)

………………………………

FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask
下面是我的hiveql语句

hive> create EXTERNAL table hbase_table_log(key string, label bigint) stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'          
    > with SERDEPROPERTIES ("hbase.columns.mapping"=":key, b:label")                                                    
    > TBLPROPERTIES("hbase.table.name" = "log");    

 解决方案:这个问题基本就是hive+hbase版本的问题,你需要将你所使用的hbase的jar包拷贝到hive的lib目录下进行替换,这还不算结束,你需要将hbase-site.xml拷贝到conf目录下面。在不重启hive的情况下,重新建立external table,恭喜,运行成功!!!

这里需要注意的地方是with下面的mapping,它对应的值":key,b:label",不能出现空格,否则它会告诉你

FAILED: Error in metadata: MetaException(message:Column Family  b is not defined in hbase table log)
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask

希望大家日后遇到这个问题的时候,可以顺利解决!

FAILED: Error in metadata: MetaException(message:org.apache.hadoop.hbase.MasterNotRunningException: CNC-JN-R-541:60000 

出现这个错误的原因是我引入的hbase包和hive自带的hive包冲突,删除hive/lib下的 hbase-0.89.0-SNAPSHOT.jar, OK了。

FAILED: Error in metadata: MetaException(message:Column Family department is not defined in hbase table hello)

当使用hive相关管理已经存在的hbase 多列table时,出现上面错误,而且列族“department ”的确存在,最终发现原因是:在hive中使用CREATE EXTERNAL TABLE 创建表的时候,"hbase.columns.mapping"的值中不能包含空格


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 onhadoop出现以下错误:

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,保存后执行没有问题(即将执行时虚拟机内存调大)


Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐