您现在的位置是:首页 >技术教程 >Hadoop问题拾零网站首页技术教程
Hadoop问题拾零
hadoop的文件系统叫做hdfs,就是hadoop分布式分布式文件系统的中文简写。这个系统是对google的gfs的开源实现。下面来回答问题。
首先是节点故障:
google在他们那篇gfs的论文中说,google在使用gfs曾说过,google在使用gfs时遇到过各种各样的问题,主要有:应用程序bug、操作系统的bug、人为失误,甚至还有硬盘、内存、连接器、网络以及电源失效。在一个大型的系统中,硬盘内存等等组件的老化,过度使用(因为数据读写非常频繁)等问题也是不容忽视的。hadoop的hdfs是需要考虑这些问题的。
然后是备份恢复的处理:
可以先搭建一个只有3台datanode的小集群,设置数据备份为2。首先清空已有数据,然后在其中一台datanode上上传数据,默认时,hadoop是会在上传数据的datanode存入一个数据备份的。然后在down掉这台datanode,这样,你就少了一个数据备份,之后,你在另一台机器上读取数据,这时,你可以查看剩下的两台datanode中的dfs文件夹(也就是你存储hdfs数据的文件夹),打开其中block开头的文件看,这时应该就可以看到两台机器都有备份了。
根据gfs的论文,hadoop应该在数据被再次使用时进行检查,如果发现少了一个备份,会进行数据恢复工作。另一个事情是,机器空闲时会在后台监测数据备份情况。也就是说,数据恢复是自动,这也是hadoop的强大之处嘛。
至于namenode的恢复:
没有处理过类似的问题,不过猜想和secondary namenode 有关,应该是将secondary namenode 存储的数据copy到namenode上,或是直接将secondary namenode 变成namenode 。
至于节点问题:
down的节点经过恢复后,可以直接链接进入hadoop集群,而不用重新启动集群。命令是bin/hadoop-daemon.sh start datanode
--------------------------------------------------------------------------------------------------------
备注:
1,系统默认的分块大小是64M,所以存储文件的时候如果单一文件大于64M就会被HDFS系统进行相应的划分,这个64M是可以通过HDFS的配置文件进行配置的,配置成你认为适合你应用的大小。
2,0.21版不稳定,且不提供支持,现在学的话找0.20版本的学吧。
3,HDFS not found可能是由于你的HADOOP_HOME没有设置,
执行如下命令后再hdfs namenode -format:
export HADOOP_HOME="你的hadoop安装路径"
http://hadoop.apache.org/common/releases.html
3,成功在windows下配置了hadoop,启动成功后,利用./hadoop fs -ls / 只查出一项正常,新建hadoop系统就是这样的。原因是,没有创建目录,也没上传文件。
用这个命令试试:./hadoop fs -lsr /
创建目录:./hadoop fs -mkdir testdir
上传:./hadoop fs -put resfile testdir
4,hadoop配置不成功,你可以通过两种方式查看:
a、netstat -tnp,看下你的9000端口是否开启了。
b、通过web-ui的浏览器方式,输入:http:master:50030/就可以看到,真正起动的节点数了。
5,建议组合hadoop-0.20.2-cdh3u0+cdh3u0的其他套件,这是生产线版本,官方修改版,是现在最稳定的,hadoop-0.20.x 与 hbase-0.20.x组合,如需单独配置zookeeper集群可以参考官方文档进行配置
------------------------------------------------------------------------------------------
6,Hbase连不上zookeeper。
我给你一个连接代码看看吧,要保证机器IP是对的。
Configuration conf = HBaseConfiguration.create();
conf.set("hbase.zookeeper.quorum", ip);
conf.set("hbase.zookeeper.property.clientPort", port);
conf.set("hbase.master", master);
然后再用HTable table = new HTable(conf,"表名");来获得 HTable句柄。
如果还是不行,要在zookeeper机器上用netstat -pan|grep 2181看看这个端口上的zookeeper是不是正常,同为Hadoop出身的Hypertable和Hbase分别倾向于C和Java,Hbase本身并没有开放面向C的API,但是可以通过Thrift实现,Hbase已经发布了ThriftAPI用以Hbase与C程序之间的交互
7,关于hadoop编程的一个小问题
hadoop任务运行时,hadoop将输入目录分割成行,传递给mappper的标准输入,mapper进而对输入进行处理。将输入目录下所有文件处理完毕时,hadoop就会使此任务完成,进而停止工作。而且输入目录好像都是任务运行之前就已经确定不会改变。如果我想往hadoop的输入目录中不断添加文件,让hadoop不停地运行,如果输入目录的所有文件都已经处理完毕,并不完成任务,而是等待新文件的到来。该怎么办?
这个在现有Hadoop中,是无法实现的。
在目录定下的时候,目录下的文件已经信息已经被读入hadoop中,输入已经确定了,mapreduce跑完当前所有文件,hadoop依然会等待输入,但可以想象,怎么给hadoop信号让他停止运行。
在我的程序中,服务器一直等待用户的命令,并根据命令作相应的处理。那么这个服务器端如果用hadoop来实现分布式编程呢?我现在只能想到服务器接收到一定命令或等待一定时间后启动一次mapreduce来处理当前阶段接收到的命令。然后服务器继续接收命令放在另一个目录下,待新目录下的命令达到一定数量或过了一定时间后,再次启动mapreduce来处理这阶段接收到的命令。如此反复下去。
但这样不停的启动mapreduce,似乎开销巨大啊!
回答mapreduce只是被抽象成一种简单模型,如果按照你这个处理,那是需要在前面增加一步如你所说。所以脚本启动是必不可少,关于开销巨大的问题,如果你使用mapreduce就无需要考虑这个了,使用上mapreduce的,都是大数据集的工作,启动mapreduce相比这个,可以忽略不计。