Hadoop问题集绵

Hadoop问题集绵

作者:admin |  时间:2015-05-13 |  浏览:182 |  0 条评论

1. Hadoop Stream PHP map程序获取记录所在文件路径

map程序处理数据时,有时需要获取当前所读记录所在文件路径,因为路径可能包含重要信息,如日期等,$_ENV['map_input_file']包含路径信息,并且随记录不同随之改变

<?php
error_reporting(0);

if(empty($argv)) {
    exit("argv参数为空\n");
}

$day1 = $argv[1];
$str = "";
$count = 0;

while($line = fgets(STDIN)) {
    $line = trim($line);
    if (empty($line)) {
        continue;
    }

    $data = explode("\t", $line);
    $flag = 1;
    if(strpos($_ENV['map_input_file'], $day1) !== false) {
        $flag = 2;
    }

    $str .= $data[0]."\t".$flag."\t".$data[4]."\n";

    if(++$count > 1000) {
        echo $str;
        $count = 0;
        $str = "";
    }
}

echo $str;

 

2. 

ERROR streaming.StreamJob: Error Launching job : The number of tasks for this job 215250 exceeds the configured limit 200000

添加如下配置:
-D mapred.max.split.size=1073741824
-D mapred.min.split.size=1073741824

 

3. 

Map Task output too many bytes! which shouldn't be more than 21474836480
由于上游gzip压缩无法split导致map输入数据量过大,修改上游配置:
-D mapred.output.compress=true
-D mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec
-outputformat org.apache.hadoop.mapred.TextMultiOutputFormat

 

4. 

Hadoop 解除“Name node is in safe mode”

运行hadoop程序时,有时候会报以下错误:
org.apache.hadoop.dfs.SafeModeException: Cannot delete /user/hadoop/input. Name node is in safe mode
这个错误应该还蛮常见的吧(至少我运行的时候是这样的)

那我们来分析下这个错误,从字面上来理解:
Name node is in safe mode

说明Hadoop的NameNode处在安全模式下。
那什么是Hadoop的安全模式呢?
在分布式文件系统启动的时候,开始的时候会有安全模式,当分布式文件系统处于安全模式的情况下,文件系统中的内容不允许修改也不允许删除,直到安全模式结 束。安全模式主要是为了系统启动的时候检查各个DataNode上数据块的有效性,同时根据策略必要的复制或者删除部分数据块。运行期通过命令也可以进入 安全模式。在实践过程中,系统启动的时候去修改和删除文件也会有安全模式不允许修改的出错提示,只需要等待一会儿即可。
现在就清楚了,那现在要解决这个问题,我想让Hadoop不处在safe mode 模式下,能不能不用等,直接解决呢?
答案是可以的,只要在Hadoop的目录下输入:
bin/hadoop dfsadmin -safemode leave
也就是关闭Hadoop的安全模式,这样问题就解决了。

之前在hadoop执行过程中使用了"ctrl+c"操作
再次使用hadoop时出现“Name node is in safe mode”提示:
root@v-jiwan-ubuntu-0:~/hadoop/hadoop-0.20.2# bin/hadoop fs -put conf input
put: org.apache.hadoop.hdfs.server.namenode.SafeModeException: Cannot create directory /user/root/input/conf. Name node is in safe mode.

最近在測試hadoop,但是沒想到在reduce時卡點,
沒辦法只好Ctrl+c,但是問題也就跟著來了XD
先將hadoop停止後,再啟動hadoop
然後要刪除DFS裡的資料時,
就出現name node is in safe mode,就沒辦法刪除資料啦!
找了好久才找到答案,

bin/hadoop dfsadmin -safemode leave
就可以把safemode解除,為了這個問題煩惱了好久Orz
----------------------------- safemode模式 NameNode在启动的时候首先进入安全模式,如果datanode丢失的block达到一定的比例(1-dfs.safemode.threshold.pct),则系统会一直处于安全模式状态即只读状态。
dfs.safemode.threshold.pct(缺省值0.999f)表示HDFS启动的时候,如果DataNode上报的block个数达到了元数据记录的block个数的0.999倍才可以离开安全模式,否则一直是这种只读模式。如果设为1则HDFS永远是处于SafeMode。
下面这行摘录自NameNode启动时的日志(block上报比例1达到了阀值0.9990)
The ratio of reported blocks 1.0000 has reached the threshold 0.9990. Safe mode will be turned off automatically in 18 seconds. hadoop dfsadmin -safemode leave 有两个方法离开这种安全模式
1. 修改dfs.safemode.threshold.pct为一个比较小的值,缺省是0.999。
2. hadoop dfsadmin -safemode leave命令强制离开

http://bbs.hadoopor.com/viewthread.php?tid=61&extra=page=1

-----------------------------
Safe mode is exited when the minimal replication condition is reached, plus an extension
time of 30 seconds. The minimal replication condition is when 99.9% of the blocks in
the whole filesystem meet their minimum replication level (which defaults to one, and
is set by dfs.replication.min).
安全模式的退出前提 - 整个文件系统中的99.9%(默认是99.9%,可以通过dfs.safemode.threshold.pct设置)的Blocks达到最小备份级别(默认是1,可以通过dfs.replication.min设置)。
dfs.safemode.threshold.pct    float    0.999 
The proportion of blocks in the system that must meet the minimum
replication level defined by dfs.rep lication.min before the namenode
will exit safe mode. Setting
this value to 0 or less forces the name-node not to start in safe mode.
Setting this value to more than 1 means the namenode never exits safe
mode. -----------------------------
用户可以通过dfsadmin -safemode value   来操作安全模式,参数value的说明如下:
enter - 进入安全模式
leave 
get -   返回安全模式是否开启的信息
wait - 等待,一直到安全模式结束。

 

5
Hadoop遇到no datanode to stop问题的解决

在重新格式化一个新的分布式文件时,需要将你NameNode上所配置的dfs.name.dir这一namenode用来存放NameNode 持久存储名字空间及事务日志的本地文件系统路径删除,同时将各DataNode上的dfs.data.dir的路径 DataNode 存放块数据的本地文件系统路径的目录也删除。如本此配置就是在NameNode上删除/home/hadoop/NameData,在DataNode上删除/home/hadoop/DataNode1和/home/hadoop/DataNode2。
这是因为Hadoop在格式化一个新的分布式文件系统时,每个存储的名字空间都对应了建立时间的那个版本(可以查看/home/hadoop /NameData/current目录下的VERSION文件,上面记录了版本信息),在重新格式化新的分布式系统文件时,最好先删除NameData 目录。必须删除各DataNode的dfs.data.dir。这样才可以使namedode和datanode记录的信息版本对应。否则会出现能够启动datanode,但无法访问,也无法结束的错误,如下:
hadoop@HadoopHost:~/HadoopInstall/hadoop$ bin/stop-all.sh
stopping jobtracker
125.216.227.**2: stopping tasktracker
125.216.227.**3: stopping tasktracker
stopping namenode
125.216.227. ** 2: no datanode to stop
125.216.227. ** 3: no datanode to stop
125.216.227. ** 1: stopping secondarynamenode

本文标签:

发表评论

电子邮件地址不会被公开。

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>