hadoop的故障检测和自动快速恢复是怎么实现的

hadoop的故障检测和自动快速恢复是怎么实现的,第1张

根据系统备份来还原数据

1、在Hadoop文件系统中文件数据被损坏或者丢失时,使用之前的文件系统备份集来实现文件数据的还原。

2、ucache灾备云平台除了可以对Hadoop文件系统数据定时、实时备份和恢复外,还同时支持windows\linnx\UNIX\ANYShare文件系统的自动定时、实时备份与恢复。

1下载hadoop的安装包,这里使用的是"hadoop-264targz":

2将安装包直接解压到D盘根目录:

3配置环境变量:

4下载hadoop的eclipse插件,并将插件放到eclipse的plugins目录下:

5打开Eclipse,选择菜单"Window"-->"Preferences",在左侧找到"Hadoop Map/Reduce",

  在右侧选择hadoop的目录:

6打开菜单"Window"中的"Show View"窗口,选择"Map/Reduce Locations":

7:在打开的"Map/Reduce Locations"面板中,点击小象图标,打开新建配置窗口:

8填写hadoop集群的主机地址和端口:

9新创建的hadoop集群连接配置,右上角的齿轮可以修改配置信息:

10打开菜单"Window"中的"Show View"窗口,找到"Project Explorer":

11在"Project Explorer"面板中找到"DFS Locations",展开下面的菜单就可以连接上HDFS,

可以直接看到HDFS中的目录和文件:

12在"Project Explorer"面板中点击鼠标右键,选择新建,就可以创建"Map/Reduce"项目了:

13下面我们创建了一个名为"hadoop-test"的项目,可以看到它自动帮我们导入了很多的jar包:

14在项目的src下面创建log4jproperties文件,内容如下:

log4jrootLogger=debug,stdout,R

log4jappenderstdout=orgapachelog4jConsoleAppender

log4jappenderstdoutlayout=orgapachelog4jPatternLayout

log4jappenderstdoutlayoutConversionPattern=%5p - %m%n

log4jappenderR=orgapachelog4jRollingFileAppender

log4jappenderRFile=mapreduce_testlog

楼主说的是Hive,不是HBase。从Oracle里面头导出数据为平面文件后,导入HDFS里面。Hive里面的表结构是要自己手工定的。

建表可以自己写个小程序实现,根据oracle字典表和hive的建表规则,每个地方使用hive的情景不同,建表也不同。数据装载可以用sqoop来实现。

你可以安装下SQOOP,注意这个跟HADOOP的版本要对应的,不然会出现一些问题。以下是我项目用到的例子,不过我有个更高级的方法,只需配到表就行了,就是写个JAVA程序,然后自动生成对应的脚本,再执行就可以了。转载,仅供参考。

方法:修改mapred-sitexml文件,添加如下配置:mapredchildjavaopts-agentlib:jdwp=transport=dt_socket,address=8883,server=y,suspend=y关闭所有的tasktracker,只保留上面配置的一台需要调试的tasktracker启动Mapreducejob右键hadoopsrc项目,右键“DebugAs”,选择“DebugConfigurations”,选择“RemoteJavaApplication”,添加一个新的测试,输入远程hostip和监听端口,上例为8883,然后点击“Debug”按钮。此时应该连接到远程tasktrackerchild进程,并进入断点位置,可以单步调试了。

Hadoop是一个由Apache基金会所开发的分布式系统基础架构。

用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。

Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上;而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。

Hadoop的框架最核心的设计就是:HDFS和MapReduce。HDFS为海量的数据提供了存储,而MapReduce则为海量的数据提供了计算。

广义的Hadoop,一般称为Hadoop生态系统,如下所示。

Hadoop生态系统中这些软件的作用:

HDFS 采用了主从(Master/Slave)结构模型,一个HDFS集群包括一个名称节点(NameNode)和若干个数据节点(DataNode)。

HDFS采用Java语言开发,因此任何支持JVM的机器都可以部署名称节点和数据节点。

在配置好Hadoop 集群之后,可以通过浏览器访问 >

具体安装的细节就不说了,网络上的资料多得很。主要介绍一下自己的经验所得。首先介绍一下手头的软硬件资源:

NameNode/JobTracker: HP笔记本 i5 24GHz 8G 500GB Win7 64位家庭普通版 hadoop 112 JDK7u21

DataNode/TaskTracker: HP台式机 i3 33GHz 4G 500GB Win7 32位专业版 hadoop 112 JDK7u21

DataNode/TaskTracker: 联想ThinkPad i5 25GHz 4G 500GB Win7 64位家庭普通版 hadoop 112 JDK7u21

首先,安装CygWin(在官网上下的最新版),一定要选上openssh和openssl的包(缺省是不安装的)。 CygWin在各个计算机上的安装目录可以不同。要把CygWin安装目录下的bin目录、usr/bin目录、usr/sbin目录放到系统环境变量Path中。因为,hadoop会执行一些Linux/UNIX形式的命令如bash、whoami等,而这些命令在CygWin中是以Windows系统中的可执行文件形式存放在前面说的目录中。

CygWin装好之后,以管理员的身份运行Cygwin Terminal,执行ssh-host-config配置SSHD服务。CygWin会在Windows系统中新建一个管理员帐号cyg_server(可以按自己换别的),这个帐号就用来跑hadoop的程序了。过程中有好多地方问yes还是no,我试过全部选yes也试过个别选no(按照网上的资料),结果没发现有什么差别。ssh-host-config执行成功后,SSHD会作为一个系统服务在后台运行,每次系统启动都自动开启。这时,要注意检查或配置Windows的防火墙配置,要放开到SSHD服务的入站连接,我的做法是放开到Cygwin安装目录/usr/sbin/sshd的入站连接。

Cygwin Terminal下执行mkpasswd -l > /etc/passwd和mkgroup -l > /etc/group,主要用途是将Windows的帐号和组别同步到CygWin下。

Windows系统中切换到cyg_server用户(这个帐号的描述缺省是Privileged server),运行Cygwin Terminal,执行ssh-keygen,一直敲回车就行。用ls -a可以看到有一个ssh的目录,把里面的id_rsa,pub导入到authorized_keys,然后把NameNode上的这个authorized_keys文件,拷贝到所有DataNode和TaskTracker的相同位置下,即 cyg_server用户主目录下的ssh目录。这样cyg_server用户就可以不需要密码就可以远程登录各个计算机和执行命令。

Hadoop是用java开发的,因此,系统中要有java的运行环境,可以从Oracle的官网下最新的JDK安装,注意是JDK,不是JRE(因为需要用到bin目录下的server目录)。安装的位置必须全部计算机都一样(因为碰到过在DataNode上找不到java程序的情况),那也就是在C:\下面了,给安装目录起一个简短的名称(不要带空格)。在系统环境变量Path中,将JDK安装目录下的bin目录所在路径添加进去。跟SSHD一样,要修改Windows防火墙的入站规则,放开到JDK的java程序网络连接。

到这里,Hadoop主要的运行条件基本具备了,可以安装Hadoop了。过程很简单,从hadoopapacheorg下载一个hadoop的targz包(我下的是112版本),解压到一个目录下就可以了。这里要注意的是,最好全部 *** 作都在Windows的cyg_server帐号下执行,而且,hadoop解压后存放的目录要所有计算机都一样,例如都放在C:\hadoop-112目录下。

Hadoop是用java开发的,虽然java号称支持跨平台运行。但是,基于Linux的Hadoop移到Windows平台上时,依然出现严重水土不服,即使是在Cygwin的环境下也一样。同样一段java代码,在Linux下的表现和在Windows下的表现会不一样,导致Windows下运行的Hadoop经常出现异常而终止运行。

实验中大部分的时间都是用来探究引起水土不服的原因,把它消除掉。 下面介绍一下我对这些问题采取的一些解决办法。

众所周知,文件路径在Linux下和在Windows下的解析是不一样的。在Cygwin中运行Windows版本的java时,两种不同形式的文件路径一起出现会导致程序异常。Cygwin下对C:\hadoop-112的解析是/cygdrive/c/hadoop-112,而Windows版本的java对'/cygdrive/c/hadoop-112'的解析又变成C:\cygdrive\c\hadoop-112,由于这是一个不存在的文件路径,所以Hadoop经常抛出异常说文件找不到,或者自己直接把这个路径创建了(例如,DataNode存放HDFS文件块时寻找dfsdatadir时)。要解决这个问题,可以利用Windows7的文件链接的特性(类似于linux的链接ln -s),在C:\下创建cygdrive目录,在这个目录里执行MKLINK /D c C:\创建一个到目的目录的目录链接。这样当java访问C:\cygdrive\c\hadoop-112时就会如我们所愿访问到C:\hadoop-112这个目录。

能不能用ln -s命令来建这样的链接呢?答案是不行的。Hadoop的源代码中就使用了这样的方法,可是Windows的java不能识别,因此,TaskTracker就不能执行JobTracker分配给它的Task任务。对于这样的情况,除了修改Hadoop代码,好像还没别的办法。要修改的是orgapachehadoopfs包里的FileUtiljava文件,里面有一个symLink方法,就是用了ln -s的办法来建文件链接,我们要把它改成使用Windows7的方式建立文件链接。原代码如下:

public static int symLink(String target, String linkname) throws IOException{

String cmd = "ln -s " + target + " " + linkname;

Process p = RuntimegetRuntime()exec(cmd, null);

int returnVal = -1;

try{

returnVal = pwaitFor();

} catch(InterruptedException e){

//do nothing as of yet

}

if (returnVal != 0) {

LOGwarn("Command '" + cmd + "' failed " + returnVal +

" with: " + copyStderr(p));

}

return returnVal;

}

修改后,变成如下的样子

public static int symLink(String target, String linkname) throws IOException{

// String cmd = "ln -s " + target + " " + linkname;

String newTarget;

String newLinkname;

newTarget = new CygPathWinCommand("C:" + target)getResult();

newLinkname = new CygPathWinCommand(linkname)getResult();

String cmd = "CMD /C \"MKLINK /D " + newLinkname + " " + newTarget + "\"";

Process p = RuntimegetRuntime()exec(cmd, null);

int returnVal = -1;

try{

returnVal = pwaitFor();

} catch(InterruptedException e){

//do nothing as of yet

}

if (returnVal != 0) {

LOGwarn("Command '" + cmd + "' failed " + returnVal +

" with: " + copyStderr(p));

}

return returnVal;

}

private static class CygPathWinCommand extends Shell {

String[] command;

String result;

CygPathWinCommand(String path) throws IOException {

command = new String[]{"cygpath", "-d", path};

run();

}

String getResult() throws IOException {

return result;

}

protected String[] getExecString() {

return command;

}

protected void parseExecResult(BufferedReader lines) throws IOException {

String line = linesreadLine();

if (line == null) {

throw new IOException("Can't convert '" + command[2] +

" to a cygwin path");

}

result = line;

}

}

红色部分就是改动后的代码。其中CygPathWinCommand是新加的一个类,它是复制原来CygPathCommand类的样子来作的,只不过原来是使用cygpath -u命令,这里使用cygpath -d命令。

Hadoop在创建完链接或者目录后,通常都设置Linux/Unix形式的访问权限。这在Windows系统上是没有作用的事。所以,Hadoop的文件权限设置 *** 作是无效的,所以当Hadoop验证文件权限设置结果时就会抛出异常而终止。我们可以改动代码,不让它终止。Hadoop验证文件权限的 *** 作是通过orgapachehadoopfs包里FileUtiljava文件的checkReturnValue方法实现的,原代码如下:

private static void checkReturnValue(boolean rv, File p,

FsPermission permission

) throws IOException {

if (!rv) {

throw new IOException("Failed to set permissions of path: " + p +

" to " +

Stringformat("%04o", permissiontoShort()));

}

}

修改很简单,不让它抛异常就行了

private static void checkReturnValue(boolean rv, File p,

FsPermission permission

) throws IOException {

if (!rv) {

LOGinfo("Failed to set permissions of path: " + p +

" to " +

Stringformat("%04o", permissiontoShort()));

}

}

除了文件路径解析和文件权限设置两个方面,Linux下和在Windows下的进程和线程管理也是不一样的。这会导致orgapachehadoopmapred包里JvmManagerjava文件里的kill方法抛出异常,原代码如下

synchronized void kill() throws IOException, InterruptedException {

if (!killed) {

TaskController controller = trackergetTaskController();

// Check inital context before issuing a kill to prevent situations

// where kill is issued before task is launched

String pidStr = jvmIdToPidget(jvmId);

if (pidStr != null) {

String user = envconfgetUser();

int pid = IntegerparseInt(pidStr);

// start a thread that will kill the process dead

if (sleeptimeBeforeSigkill > 0) {

new DelayedProcessKiller(user, pid, sleeptimeBeforeSigkill,

SignalKILL)start();

controllersignalTask(user, pid, SignalTERM);

} else {

controllersignalTask(user, pid, SignalKILL);

}

} else {

LOGinfo(Stringformat("JVM Not killed %s but just removed", jvmId

toString()));

}

killed = true;

}

}

在网上找了好久,终于找到一篇老外的文章讲这个问题,改动也比较简单

synchronized void kill() throws IOException, InterruptedException {

if (!killed) {

TaskController controller = trackergetTaskController();

// Check inital context before issuing a kill to prevent situations

// where kill is issued before task is launched

String pidStr = jvmIdToPidget(jvmId);

if ((pidStr != null) && !(pidStrisEmpty())) {

String user = envconfgetUser();

int pid = IntegerparseInt(pidStr);

// start a thread that will kill the process dead

if (sleeptimeBeforeSigkill > 0) {

new DelayedProcessKiller(user, pid, sleeptimeBeforeSigkill,

SignalKILL)start();

controllersignalTask(user, pid, SignalTERM);

} else {

controllersignalTask(user, pid, SignalKILL);

}

} else {

LOGinfo(Stringformat("JVM Not killed %s but just removed", jvmIdtoString()));

}

killed = true;

}

}

在我的实验中,代码的改动到这里,Hadoop基本就可以跑起来了,HDFS和MapReduce应用都可以运行。下面介绍一下怎么编译改动后的代码。我不是java程序员,只会用原始笨拙的办法去调试和编译。Hadoop的源码在src目录下,在我实验中是C:\hadoop-112\src,里面有好几个子目录,我们要改动的JvmManagerjava文件和FileUtiljava文件都在core子目录下。由于Hadoop是在Linux环境中开发的,所以我们编译最好也在Linux环境下(我试过Windows环境,结果不行,技术有限,没法解决)。首先把这些源文件拷到一台Linux,我的做法是直接下个hadoop的targz包,解压到/var/tmp下,源码就在/var/tmp/hadoop-111/src目录下了。

1)先解压jar包,我们改动的源码最后都编译打包到hadoop-core-112jar包里

cd /var/tmp

mkdir newjar

cp /var/tmp/hadoop-112/hadoop-core-112jar /var/tmp/newjar

cd newjar

jar -xvf hadoop-core-112jar

rm -f hadoop-core-112jar

2)编译改动后的源码

cd /var/tmp/hadoop-112/src/core

javac -cp /var/tmp/hadoop-112/lib/commons-logging-111jar:/var/tmp/hadoop-112/hadoop-core-112jar org/apache/hadoop/mapred/JvmManagerjava

javac -cp /var/tmp/hadoop-112/lib/commons-logging-111jar:/var/tmp/hadoop-112/hadoop-core-112jar org/apache/hadoop/fs/FileUtiljava

3)打jar包

cp org/apache/hadoop/mapred/class /var/tmp/newjar/org/apache/hadoop/mapred

cp org/apache/hadoop/fs/class /var/tmp/newjar/org/apache/hadoop/fs

cd /var/tmp/newjar

jar cvfm /var/tmp/testjar META-INF/MANIFESTMF

把testjar拷下来,替换掉所有计算机的hadoop-core-112jar就可以了。

好了,所有事情都就绪了,配置好hadoop的各种配置文件后,顺利启动了hadoop的HDFS和MapReduce框架,以下是进行的一些测试

hadoop jar C:/hadoop-112/hadoop-test-112jar TestDFSIO -write -nrFiles 10 -sizeFile 1000 执行成功,但吞吐量不是很理想

hadoop jar C:/hadoop-112/hadoop-test-112jar TestDFSIO -read -nrFiles 10 -sizeFile 1000 执行成功,但吞吐量比前面的测试还差

hadoop jar C:/hadoop-112/hadoop-examples-112jar randomwriter random-data 执行成功,但时间花了两个多小时,处理的数据有20GB多

hadoop jar C:/hadoop-112/hadoop-examples-112jar sort random-data sorted-data 执行成功,但时间也是花了两个多小时,处理的数据有20GB多

hadoop jar C:/hadoop-112/hadoop-test-112jar testmapredsort -sortInput random-data -sortOut sorted-data 执行成功,但时间也是花了两个多小时,,处理的数据还是20GB多但时间好像还更长些

hadoop jar C:/hadoop-112/hadoop-examples-112jar wordcount /user/cyg_server/tbdata_big output 其中tbdata_big是一个3GB多的文本文件,里面有1亿3千万行文本。实验环境给出的性能是7分钟16秒。自己在NameNode上写一个perl脚本做wordcount相同的事情,耗时562秒。这个Hadoop只快了106秒。是不是数据太少了?

Hadoop实现了一个分布式文件系统,设计用来部署在低廉的硬件上;而且提供高吞吐量来访问应用程序的数据,适合那些有着超大数据集的应用程序。

Hadoop得以在大数据处理应用中广泛应用得益于其自身在数据提取、变形和加载(ETL)方面上的天然优势。Hadoop的分布式架构,将大数据处理引擎尽可能的靠近存储,对例如像ETL这样的批处理 *** 作相对合适,因为类似这样 *** 作的批处理结果可以直接走向存储。

Hadoop的MapReduce功能实现了将单个任务打碎,并将碎片任务(Map)发送到多个节点上,之后再以单个数据集的形式加载(Reduce)到数据仓库里。

扩展资料

Hadoop 由许多元素构成。其最底部是 HDFS,存储 Hadoop 集群中所有存储节点上的文件。HDFS的上一层是MapReduce 引擎,该引擎由 JobTrackers 和 TaskTrackers 组成。

通过对Hadoop分布式计算平台最核心的分布式文件系统HDFS、MapReduce处理过程,以及数据仓库工具Hive和分布式数据库Hbase的介绍,基本涵盖了Hadoop分布式平台的所有技术核心。

对外部客户机而言,HDFS就像一个传统的分级文件系统。可以创建、删除、移动或重命名文件,等等。但是 HDFS 的架构是基于一组特定的节点构建的,这是由它自身的特点决定的。

这些节点包括 NameNode(仅一个),它在 HDFS 内部提供元数据服务;DataNode,它为 HDFS 提供存储块。

参考资料来源:百度百科-Hadoop

以上就是关于hadoop的故障检测和自动快速恢复是怎么实现的全部的内容,包括:hadoop的故障检测和自动快速恢复是怎么实现的、如何在Windows下面运行hadoop的MapReduce程序、hdfs在hadoop里如何建立索引呢等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9540574.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存