如何在Linux上sonar安装及配置与配置Hadoop-IT168 技术开发专区

Linux环境CUDA 4.0入门:安装步骤详解
 作者: 王玉圆 编辑:
  【IT168 技术】在前面的文章中,笔者向大家介绍了如何在,本文将会详细讲解在Linux环境下安装、配置CUDA 4.0的步骤和注意事项。虽然Linux有很多不同的发行版,但安装的步骤都是相同或者类似的,想要了解不同发行版的具体安装细节,请参阅IT168 CUDA频道的其他文章:      以下是一般步骤:  安装NVIDIA驱动程序  NVIDIA驱动程序和软件下载完毕后,需要先安装驱动程序。通过以下步骤安装驱动程序:  1、退出GUI环境。若在GUI环境中,按下Ctrl - Alt- Backspace键退出桌面。某些Linux发行版需要连续按两次;某些发行版已禁用GUI环境,完全支持如sudo /etc/init.d/gdm stop的命令。还有一些发行版需要改变系统的运行级别,通过/sbin/init 3等命令退出GUI桌面。  2、使用superuser权限,在命令行中运行驱动程序安装包。  3、验证是否安装了正确的驱动程序版本。可以通过系统属性(System Properties)或相同功能,或者执行cat /proc/driver/nvidia/version命令。  4、如果没有使用GUI环境,确保存在设备文件/dev/nvidia*并有正确的文件权限(初始化GUI环境时将自动完成)。创建一个类似于下面的启动脚本,用来加载驱动程序的内核模块,以及在启动时用superuser权限创建记录:  #!/bin/bash  /sbin/modprobe nvidia  if [ &$?& -eq <span style="color: # ]; then  # Count the number of NVIDIA controllers found.  NVDEVS=`lspci | grep -i NVIDIA`  N3D=`echo &$NVDEVS& | grep &<span style="color: #D controller& | wc -l`  NVGA=`echo &$NVDEVS& | grep &VGA compatible controller& | wc -l`  N=`expr $N3D + $NVGA - <span style="color: #`  for i in `seq <span style="color: # $N`; do  mknod -m <span style="color: #6 /dev/nvidia$i c <span style="color: #5 $i  done  mknod -m <span style="color: #6 /dev/nvidiactl c <span style="color: #5 <span style="color: #5  else  exit <span style="color: #  fi  5、重启GUI环境。使用startx、init 5、sudo /etc/init.d/gdm start或者系统中的其他相同功能的命令均可重启GUI环境。  关于Linux环境下安装驱动程序的更多资料可以参见NVIDIA官方网站:http://us./XFree86/Linux-x86/256.35/README/index.html.  需要注意的是,CUDA 4.0需要更高版本的Linux系统和NVIDIA驱动,因此需要常常验证是否运行了正确的版本。  安装CUDA软件  下面将介绍如何将之前下载的CUDA Toolkit和GPU Computing SDK进行正确的安装和配置。  在安装CUDA软件包之前,先要阅读每个绑定的发行说明(Release Notes),这些说明提供了安装和软件功能上的重要细节。  成功安装需要经过以下几个步骤:  1、卸载电脑中旧版本的CUDA Toolkit和GPU Computing SDK。在使用默认安装路径的前提下,可以从/usr/local/cuda和~/NVIDIA_GPU_Computing_SDK路径下删除文件。(需要注意的是,旧版SDK默认安装到~/NVIDIA_CUDA_SDK路径下,而不是~/NVIDIA_GPU_Computing_SDK路径下。)该路径可以根据实际安装目录进行调整。(若想保留文件,就可以用不同版本的CUDA软件进行编译,需要在安装新版本前重命名现有目录,并修改相应的Makefile文件。)  2、使用superuser权限运行已下载的.run文件安装CUDA Toolkit。CUDA Toolkit的默认安装路径为/usr/local/cuda。  3、定义环境变量  ●PATH变量设置为/usr/local/cuda/bin。  ●LD_LIBRARY_PATH设置为/usr/local/cuda/lib或/usr/local/cuda/lib64,分别代表32位或64位操作系统。  在Linux环境中设置以上内容通常的方法是使用如下命令:  export PATH=/usr/local/cuda/bin:$PATH export LD_LIBRARY_PATH=/usr/local/cuda/lib:$LD_LIBRARY_PATH  以上代码假定为32位操作系统,若是64位操作系统,则用lib64的取代上述lib。为了保持这样的设置,将其放置在~/.bash_profile中。  4、作为普通用户(regular user)在默认位置安装SDK(位于第二个.run文件),$(HOME)/NVIDIA_GPU_Computing_SDK。使用普通用户权限进行安装能够避免访问问题。  5、若要创建所有SDK示例,包括那些图形界面而不是命令行界面,如果之前没有使用过,可能还需要安装额外的系统库文件或者头文件。尽管每个Linux发行版在具体名称和安装步骤上略有不同,但有些库文件和头文件是必需的,包括OpenGL(如Mesa)、GLU、GLUT和X11(包括Xi、 Xmu和GLX)。以Ubuntu系统为例,可以安装以下内容:  sudo apt-get install freeglut3-dev build-essential libx11-dev libxmu-dev libxi-dev libgl1-mesa-glx libglu1-mesa libglu1-mesa-dev  需要注意的是,安装Mesa可能会覆盖/usr/lib/libGL.so文件,该文件是由之前的NVIDIA驱动程序安装的,所以安装库文件后可能还需要重新安装NVIDIA驱动程序。  更重要的问题是,多用户Linux系统的最佳实践,同样使用root权限安装GPU Computing SDK 的副本,允许其他用户以只读的方式访问。如果用户损坏了源代码的副本,原始副本可以复制到用户目录。&&&&&&& 更多内容请点击:&&&&&&& CUDA专区:&&&&&&& CUDA论坛:&
处理 SSI 文件时出错
已有条评论
处理 SSI 文件时出错
处理 SSI 文件时出错博客访问: 617380
博文数量: 387
博客积分: 10
博客等级: 民兵
技术积分: 5676
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: HADOOP
4、代码开发和调试示例
前面部署时曾经测试过wordcount程序,这样我们在Eclipse也调试这一功能。HADOOP提供了这些示例的源代码,大家可以在HADOOP安装文件根路径下的examples目录下,比如WordCount位于:examples/org/apache/hadoop/examples/WordCount.java
我们新建一个文件,右键选中项目名称,点击New&-&&Class创建一个新的Java&Class文件,弹出窗口如下:
将示例代码直接复制进来,而后修改文件头部包名即可。新创建的WordCount.java文件内容如下:
package&com.jss.hadoop.mapreduce.
import&java.io.IOE
import&java.util.StringT
import&org.apache.hadoop.conf.C
import&org.apache.hadoop.fs.P
import&org.apache.hadoop.io.IntW
import&org.apache.hadoop.io.T
import&org.apache.hadoop.mapreduce.J
import&org.apache.hadoop.mapreduce.M
import&org.apache.hadoop.mapreduce.R
import&org.apache.hadoop.mapreduce.lib.input.FileInputF
import&org.apache.hadoop.mapreduce.lib.output.FileOutputF
import&org.apache.hadoop.util.GenericOptionsP
public&class&WordCount&{
&&public&static&class&TokenizerMapper&
&&&&&&&extends&Mapper&Object,&Text,&Text,&IntWritable&{
&&&&private&final&static&IntWritable&one&=&new&IntWritable(1);
&&&&private&Text&word&=&new&Text();
&&&&public&void&map(Object&key,&Text&value,&Context&context
&&&&&&&&&&&&&&&&&&&&)&throws&IOException,&InterruptedException&{
&&&&&&StringTokenizer&itr&=&new&StringTokenizer(value.toString());
&&&&&&while&(itr.hasMoreTokens())&{
&&&&&&&&word.set(itr.nextToken());
&&&&&&&&context.write(word,&one);
&&public&static&class&IntSumReducer&
&&&&&&&extends&Reducer&Text,IntWritable,Text,IntWritable&&{
&&&&private&IntWritable&result&=&new&IntWritable();
&&&&public&void&reduce(Text&key,&Iterable&IntWritable&&values,&
&&&&&&&&&&&&&&&&&&&&&&&Context&context
&&&&&&&&&&&&&&&&&&&&&&&)&throws&IOException,&InterruptedException&{
&&&&&&int&sum&=&0;
&&&&&&for&(IntWritable&val&:&values)&{
&&&&&&&&sum&+=&val.get();
&&&&&&result.set(sum);
&&&&&&context.write(key,&result);
&&public&static&void&main(String[]&args)&throws&Exception&{
&&&&Configuration&conf&=&new&Configuration();
&&&&String[]&otherArgs&=&new&GenericOptionsParser(conf,&args).getRemainingArgs();
&&&&if&(otherArgs.length&!=&2)&{
&&&&&&System.err.println("Usage:&wordcount&&in&&&out&");
&&&&&&System.exit(2);
&&&&Job&job&=&new&Job(conf,&"word&count");
&&&&job.setJarByClass(WordCount.class);
&&&&job.setMapperClass(TokenizerMapper.class);
&&&&job.setCombinerClass(IntSumReducer.class);
&&&&job.setReducerClass(IntSumReducer.class);
&&&&job.setOutputKeyClass(Text.class);
&&&&job.setOutputValueClass(IntWritable.class);
&&&&FileInputFormat.addInputPath(job,&new&Path(otherArgs[0]));
&&&&FileOutputFormat.setOutputPath(job,&new&Path(otherArgs[1]));
&&&&System.exit(job.waitForCompletion(true)&?&0&:&1);
WordCount如要运行,需要指定两个参数,即代码中65行和66行所需指定的路径。针对这种情况,我们即可以改动代码,直接在此处写好目标路径(同时还需要将53-57行之间的代码注释)而后即可直接运行调试;也可以配置WordCount的调试运行环境,为其配置运行参数。这里我们选择后一种方式。
选择菜单:Run&-&&Run&Configurations&-&&Java&Application,点击窗口左上角处的图标:
新建一个配置,将弹出的窗口显示项切换到Arguments选项:
此处需要我们填写Program&arguments,即指定程序运行所需参数,根据程序设定,此时需要指定两个参数,一个指定要处理的文件源路径,另一个是处理后文件的输出路径,中间以空格分隔。请根据实际情况指定参数,配置好后,即可点击Run运行。
如果配置正确,执行成功后,在HDFS中就会创建jssout文件夹,如上图所示,其中保存的文件,就是对源路径中数据处理后的输出结果。
若要操作HDFS中的目录和文件也是同理,继续创建文件(过程不演示)FileOper.java,代码如下:
$&more&/data/developer/workspace/FirstHadoopProject/src/com/jss/hadoop/hdfs/test/FileOper.java&
package&com.jss.hadoop.hdfs.
import&java.io.IOE
import&org.apache.hadoop.conf.C
import&org.apache.hadoop.fs.FSDataOutputS
import&org.apache.hadoop.fs.FSDataInputS
import&org.apache.hadoop.fs.FileS
import&org.apache.hadoop.fs.FileS
import&org.apache.hadoop.fs.P
public&class&FileOper&{
&&&&&&&&public&static&void&main(String[]&args)&throws&Exception&{
&&&&&&&&&&&&&&&&if&(args.length&&&1)&{
&&&&&&&&&&&&&&&&&&&&&&&&System.out.println("Must&define&parameters!");
&&&&&&&&&&&&&&&&}&else&{
&&&&&&&&&&&&&&&&&&&&&&&&Configuration&conf&=&new&Configuration();
&&&&&&&&&&&&&&&&&&&&&&&&conf.set("fs.default.name",&args[0]);
&&&&&&&&&&&&&&&&&&&&&&&&FileOper.listHDFSFiles(conf);&//&显示目录结构
&&&&&&&&&&&&&&&&&&&&&&&&//FileOper.uploadLocal2HDFS(conf,&args[1],&args[2]);&//&上传文件
&&&&&&&&&&&&&&&&&&&&&&&&//FileOper.createHDFSFile(conf,&args[1],&args[2]);&//&创建文件
&&&&&&&&&&&&&&&&&&&&&&&&//FileOper.deleteHDFSFile(conf,&args[1]);&//&删除文件
&&&&&&&&&&&&&&&&&&&&&&&&//FileOper.readHDFSFile(conf,&args[1]);&//&读取文件
&&&&&&&&&&&&&&&&&&&&&&&&//FileOper.makeHDFSDirectory(conf,&args[1]);&//&创建目录
&&&&&&&&&&&&&&&&&&&&&&&&//FileOper.removeHDFSDirectory(conf,&args[1]);&//&删除目录
&&&&&&&&&&&&&&&&}
&&&&&&&&public&static&void&listHDFSFiles(Configuration&conf)&throws&IOException&{
&&&&&&&&&&&&&&&&FileSystem&fs&=&FileSystem.get(conf);
&&&&&&&&&&&&&&&&FileStatus&files[]&=&fs.listStatus(new&Path("/"));
&&&&&&&&&&&&&&&&for&(FileStatus&file&:&files)&{
&&&&&&&&&&&&&&&&&&&&&&&&System.out.println(file.getPath());
&&&&&&&&&&&&&&&&}
&&&&&&&&public&static&void&uploadLocal2HDFS(Configuration&conf,&String&s,&String&d)
&&&&&&&&&&&&&&&&&&&&&&&&throws&IOException&{
&&&&&&&&&&&&&&&&FileSystem&fs&=&FileSystem.get(conf);
&&&&&&&&&&&&&&&&Path&src&=&new&Path(s);
&&&&&&&&&&&&&&&&Path&dst&=&new&Path(d);
&&&&&&&&&&&&&&&&fs.copyFromLocalFile(src,&dst);
&&&&&&&&&&&&&&&&fs.close();
&&&&&&&&&&&&&&&&System.out.println("Upload&to&"&+&conf.get("fs.default.name"));
&&&&&&&&public&static&void&createHDFSFile(Configuration&conf,&String&createFilePath,
&&&&&&&&&&&&&&&&&&&&&&&&String&content)&throws&IOException&{
&&&&&&&&&&&&&&&&FileSystem&fs&=&FileSystem.get(conf);
&&&&&&&&&&&&&&&&FSDataOutputStream&fsos&=&fs.create(new&Path(createFilePath));
&&&&&&&&&&&&&&&&fsos.write(content.getBytes("UTF-8"));
&&&&&&&&&&&&&&&&fsos.close();
&&&&&&&&&&&&&&&&fs.close();
&&&&&&&&&&&&&&&&System.out.println("Succeeded&created&file&"&+&createFilePath);
&&&&&&&&public&static&boolean&deleteHDFSFile(Configuration&conf,&String&dst)
&&&&&&&&&&&&&&&&&&&&&&&&throws&IOException&{
&&&&&&&&&&&&&&&&FileSystem&fs&=&FileSystem.get(conf);
&&&&&&&&&&&&&&&&Path&path&=&new&Path(dst);
&&&&&&&&&&&&&&&&boolean&isDeleted&=&fs.delete(path,&true);
&&&&&&&&&&&&&&&&fs.close();
&&&&&&&&&&&&&&&&return&isD
&&&&&&&&public&static&byte[]&readHDFSFile(Configuration&conf,&String&dst)
&&&&&&&&&&&&&&&&&&&&&&&&throws&Exception&{
&&&&&&&&&&&&&&&&FileSystem&fs&=&FileSystem.get(conf);
&&&&&&&&&&&&&&&&Path&path&=&new&Path(dst);
&&&&&&&&&&&&&&&&if&(fs.exists(path))&{
&&&&&&&&&&&&&&&&&&&&&&&&FSDataInputStream&is&=&fs.open(path);
&&&&&&&&&&&&&&&&&&&&&&&&//&get&the&file&info&to&create&the&buffer
&&&&&&&&&&&&&&&&&&&&&&&&FileStatus&stat&=&fs.getFileStatus(path);
&&&&&&&&&&&&&&&&&&&&&&&&//&create&the&buffer
&&&&&&&&&&&&&&&&&&&&&&&&byte[]&buffer&=&new&byte[Integer.parseInt(String.valueOf(stat
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&.getLen()))];
&&&&&&&&&&&&&&&&&&&&&&&&is.readFully(0,&buffer);
&&&&&&&&&&&&&&&&&&&&&&&&is.close();
&&&&&&&&&&&&&&&&&&&&&&&&fs.close();
&&&&&&&&&&&&&&&&&&&&&&&&return&
&&&&&&&&&&&&&&&&}&else&{
&&&&&&&&&&&&&&&&&&&&&&&&throw&new&Exception("the&file&is&not&found&.");
&&&&&&&&&&&&&&&&}
&&&&&&&&public&static&void&makeHDFSDirectory(Configuration&conf,&String&dst)
&&&&&&&&&&&&&&&&&&&&&&&&throws&IOException&{
&&&&&&&&&&&&&&&&FileSystem&fs&=&FileSystem.get(conf);
&&&&&&&&&&&&&&&&fs.mkdirs(new&Path(dst));
&&&&&&&&&&&&&&&&fs.close();
&&&&&&&&&&&&&&&&System.out.println("Succeeded&created&directory&"&+&dst);
&&&&&&&&public&static&void&removeHDFSDirectory(Configuration&conf,&String&dst)
&&&&&&&&&&&&&&&&&&&&&&&&throws&IOException&{
&&&&&&&&&&&&&&&&FileSystem&fs&=&FileSystem.get(conf);
&&&&&&&&&&&&&&&&fs.delete(new&Path(dst),&true);
&&&&&&&&&&&&&&&&fs.close();
&&&&&&&&&&&&&&&&System.out.println("Succeeded&remove&directory&"&+&dst);
FileOper能够读取HDFS中的文件目录结构,操作文件和目录。程序在执行时,同样需要指定参数,具体步骤与前面操作WordCount的原理相同,就不一一演示了。
阅读(10044) | 评论(1) | 转发(3) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。详解如何在Windows上安装与配置Hadoop
 作者: 陆嘉恒 编辑:
  【IT168 技术】在之前的文章中,我们介绍过,本文将以Windows为平台介绍Hadoop的安装与配置方法。  相对于Linux,Windows版本的JDK安装过程更容易,你可以在/zh_CN/download/manual.jsp下载到最新版本的JDK。这里再次申明,Hadoop的编译及MapReduce程序的运行,很多地方都需要使用JDK的相关工具,因此只安装JRE是不够的。  安装过程十分简单,运行即可,程序会自动配置环境变量(在之前的版中还没有这项功能,新版本的JDK中已经可以自动配置环境变量了)。  一、安装Cygwin  Cygwin是在Windows平台下模拟Unix环境的一个工具,只有通过它才可以在Windows环境下安装Hadoop。可以通过这个链接下载Cygwin:  /setup.exe  &双击运行安装程序,选择install from internet。  &根据网络状况,选择合适的源下载程序。  &进入 select packages界面,然后进入Net,勾选openssl及openssh(如下图所示)。▲勾选openssl及openssh  如果打算在Eclipse上编译Hadoop,还必须安装&Base Category&下的&sed&(如下图所示)。▲勾选sed  另外建议安装&Editors Category&下的&vim&,以便在Cygwin 上直接修改配置文件。  二、配置环境变量  依次点击我的电脑&属性&高级系统设置&环境变量,修改环境变量里的path设置,在其后添加Cygwin的bin目录和Cygwin的usr\bin目录。  三、安装和启动sshd服务  点击桌面上的Cygwin图标,启动Cygwin,执行ssh-host-config 命令,当要求输入Yes/No时,选择输入No。当看到&Have fun&时,表示sshd 服务安装成功。  在桌面上的&我的电脑&图标上右击,点击&管理&菜单,启动CYGWIN sshd 服务。  四、配置SSH免密码登录  执行ssh-keygen 命令生成密钥文件。按如下命令生成authorized_keys文件:  cd ~/..ssh/  cp id_rsa.pub authorized_keys  完成上述操作后,执行exit 命令先退出Cygwin 窗口,如果不执行这一步操作,下面的操作可能会遇到错误。  接下来,重新运行Cygwin,执行ssh localhost 命令,在第一次执行时会有提示,然后输入yes,直接回车即可。  另外,在Windows上安装Hadoop的过程与Linux一样,这里就不再赘述了。  作者简介  陆嘉恒,《Hadoop实战》作者,中国人民大学副教授,新加坡国立大学博士,美国加利福尼亚大学尔湾分校(University of California, Irvine) 博士后。&
大学生分期购物销量榜
IT168企业级Hadoop 0.23.x从原理详解到安装体验
 作者: yanbohappy 编辑:
  【IT168 技术】从0.23.0开始,Hadoop开始支持分布式NameNode,通过NameNode federation的形式实现。这样实现了NameNode的横向扩展,使得Hadoop集群的规模可以达到上万台。同时在NameNode HA机制方面,trunk中的代码也开始merge进ha-branch的功能,原来的SecondaryNamenode被BackupNode和CheckpointNode替代。本文主要讨论NameNode federation。  1,分布式NameNode基本原理和设计  HDFS存储包括两层:  (1) Namespace 管理directory, file and block,支持文件系统操作(也就是client端的文件系统操作,如create,delete,read,write等首先与Namespace打交道)。  (2) Block Storage主要由两部分组成:Block Management负责维护集群中NameNode与众多DataNode的关系以及create chunk,delete chunk等数据块操作;Physical Storage负责chunk的存储。    上面这张图可以清晰的看出,Block Storage的两部分功能分别在NameNode和DataNode中完成。在原来的单NameNode架构中,一个NameNode对应一个Namespace,对应多个DataNode组成的存储池空间,实现和理解起来非常容易。但是随着单NameNode遇到越来越多的问题,例如随着集群规模的扩大NameNode的内存已不能容纳所有的元数据;单NameNode制约文件元数据操作的吞吐量使得目前的只能支持60K的MapR还有就是不同用户的隔离性问题。  那么社区为什么会选择NameNode federation这种方案呢?因为从系统设计的角度看,ceph的动态分区看起来更适合分布式NameNode的需求。这里就不得不说在系统领域学术界和工业界的区别了。Ceph的设计固然比较先进,但是稳定性非常不好。而对于一个像Hadoop这样规模的存储系统,稳定性固然非常重要,而且开发成本和兼容性也要考虑。NameNode federation这个方案对代码的改动大部分是在DataNode这块,对NameNode的改动很小。这使得NameNode的鲁棒性不会受到影响,同时也兼容原来的版本。  在工业界也有几种其他的分布式NameNode的实现方式,例如在百度内部使用的就是把NameNode做成一主多从的集群的形式,结构如下图所示。Namespace server负责整个集群的 文件&&唯一的块集合ID 映射,然后把不同的 块集合ID分配到对应的FMS server上(类似于数据库里的sharding,可以采用hash类似的策略)。然后每个FMS server负责一部分块集合的管理和操作。那么这种方法显然client的每次文件操作都会经过Namespace server和其中的一个FMS server的处理。具体是怎么做的,百度也没开源出来。    另外就是MapR的实现方式(/),用Hbase的方式(Google在GFS2中使用的策略,有开源POC实现/p/hdfs-dnn/),用MySQL的方式(/lalithsuresh/Scaling-HDFS-NameNode)等。  在NameNode federation中,每个NameNode节点是一个nameservice ,负责管理一个Namespace和对应的Block pool。整个集群有一个公共的ClusterID。在我的部署方案中,共有两个Namespace: ns1和ns2。所以对应有两个block pool。相应的Block pool ID可以在format文件系统之后获取,这个后面会讲到。同时在每个DataNode节点的dfs.datanode.dir目录下会为每个block pool分配以block pool ID命名的文件夹来存储对应block pool的块数据。    Federation中存在多个命名空间,如何划分和管理这些命名空间非常关键。例如查看某个目录下面的文件,如果采用文件名hash的方法存放文件,则这些文件可能被放到不同namespace中,HDFS需要访问所有namespace,代价过大。为了方便管理多个命名空间,HDFS NameNode Federation采用了经典的Client Side Mount Table。    如上图所示,下面四个蓝色三角形代表一个独立的Namespace,上方灰色的三角形代表从客户角度去访问的逻辑Namespace。各个蓝色的Namespace mount到灰色的表中,客户可以通过访问不同的挂载点来访问不同的namespace,这就如同在Linux系统中访问不同挂载点的磁盘一样。这就是HDFS NameNode Federation中命名空间管理的基本原理。但是这种方式容易造成不同Namespace下文件数量和存储量的不均衡,需要人工介入已达到理想的负载均衡。  HDFS NameNode Federation并没有完全解决单点故障问题。虽然namenode/namespace存在多个,但是从单个namenode/namespace看,仍然存在单点故障:如果某个namenode挂掉了,其管理的相应的文件就不可以访问。所以对于其中的任何一个namenode依然存在SPOF问题,而这个问题的解决要依赖于HA的实现。就是给每个NameNode配备一个对应的BackupNode和CheckpointNode。  2, 编译源代码  注:如果你只关注怎么安装和使用,对Hadoop的源代码编译不是很感兴趣,可以直接从官网上download安装包,然后跳过这一节,直接进入第二节:安装与部署。  先从SVN中checkout代码,我checkout的是trunk中的代码。据说trunk中的代码merge了ha-branch,具体都merge了哪些jira讨论的东西没仔细看。  下图就是Checkout出的代码结构。这个和以前的版本源代码结构有很大的不同。整个项目采用maven作为项目管理工具。我对maven也是新手,不过BUILDING.txt会告诉我们大部分想要知道的东西。    Maven管理项目有很强的层次关系,在这里hadoop-project是Main Hadoop project,也是所有Hadoop Maven modules的parent POM。而hadoop-project-dist是用来生成分发模块的;hadoop-annotations是用来生成文档的;hadoop-common-project,hadoop-hdfs-project,hadoop-mapreduce-project这三个就是hadoop的主要三个功能模块;hadoop-tools是像Streaming, Distcp这样的工具。  具体到怎么编译source code,就按照BUILDING.txt里所说的。我简单说下我的环境:Ubuntu Linux, Java 1.7.0_02, protocolbuffer-2.4.1。这些准备工作都好了,就可以按照BUILDING.txt里所说的一样,敲一个mvn package -Pdist -DskipTests &Dtar,然后等大概15分钟左右(我的开发机是虚拟机,比较弱)就编译完了。  编译成功之后会在hadoop-dist目录下出现一个文件夹target,在这个文件夹里的内容如下:  其中的hadoop-3.0.0-SNAPSHOT.tar.gz就是我们部署时要用到的jar包和脚本的所在地了,和我们从hadoop.apache.org中download下来的安装包是基本一样的。例如,我们从官网上download下来的分发安装包hadoop-0.23.1.tar.gz,里面有:bin etc include lib libexec LICENSE.txt NOTICE.txt README.txt sbin share。在我们自己编译出来的hadoop-3.0.0-SNAPSHOT.tar.gz解压出来也是这些东西。  至此,我们通过自己编译的方式,得到了和官网上download下来的安装包一样的东西。那么我们的第一阶段工作就结束了。  3,安装与部署。  大家可以使用第一节自己编译出来的安装包,或者从官网上download下来的安装包。0.23.0以后的版本在hadoop的安装包的文件布局发生了很大的变化。    从中可以看出,这个目录结构很像Linux操作系统的目录结构,是不是可以看出Hadoop希望自己成为在Big Data领域的操作系统啊。各个目录的作用如下:  (1)在新版本的hadoop中,由于使用hadoop的用户被分成了不同的用户组,就像Linux一样。因此执行文件和脚本被分成了两部分,分别存放在bin和sbin目录下。存放在sbin目录下的是只有超级用户(superuser)才有权限执行的脚本,比如start-dfs.sh, start-yarn.sh, stop-dfs.sh, stop-yarn.sh等,这些是对整个集群的操作,只有superuser才有权限。而存放在bin目录下的脚本所有的用户都有执行的权限,这里的脚本一般都是对集群中具体的文件或者block pool操作的命令,如上传文件,查看集群的使用情况等。  (2)etc目录下存放的就是在0.23.0版本以前conf目录下存放的东西,就是对common, hdfs, mapreduce(yarn)的配置信息。  (3)include和lib目录下,存放的是使用Hadoop的C语言接口开发用到的头文件和链接的库。  (4)libexec目录下存放的是hadoop的配置脚本,具体怎么用到的这些脚本,我也还没跟踪到。目前我就是在其中hadoop-config.sh文件中增加了JAVA_HOME环境变量。  (5)logs目录在download到的安装包里是没有的,如果你安装并运行了hadoop,就会生成logs 这个目录和里面的日志。  (6)share这个文件夹存放的是doc文档和最重要的Hadoop源代码编译生成的jar包文件,就是运行hadoop所用到的所有的jar包。  这样的目录结构是不是很清晰啊~  下一步就开始安装了。这次我主要测试和分析了NameNode federation这个feature,所以我的部署结构是这样的:  我一共有3台机器,133和134这两台作为我的NameNode,同时相应的SecondaryNamenode也放到这两台上(实际生产的集群中不应该这样使用,本文中只是做了功能测试,为了简便。而且在0.23.1后面的版本中SecondaryNamenode也是一个Deprecated的类,将会被BackupNode with -checkpoint argument所代替)。在133,134,135三台机器中部署DataNode。  部署步骤:  (1) 配置SSH无密码登录,注意所有的NameNode都要能够无密码登录到所有的DataNode中。  (2)配置环境变量,hadoop的那些执行脚本会用到。  在~/.bashrc文件内添加(注意,此处我们目前只配置了HDFS的环境变量,没有配置MapReduce/yarn的环境变量)  export HADOOP_DEV_HOME=/home/administrator/cloud/hadoop-<span style="color: #.23.<span style="color: #  export HADOOP_COMMON_HOME=$HADOOP_DEV_HOME  export HADOOP_HDFS_HOME=$HADOOP_DEV_HOME  export HADOOP_CONF_DIR=$HADOOP_DEV_HOME/etc/hadoop&  (3)在libexec/hadoop-config.sh中添加JAVA_HOME ==/usr/lib/jvm/java-6-openjdk  (4)然后就是按照我们的部署方案,配置hadoop的参数了。我们前面已经提到了,在0.23.1之后的版本中,hadoop的配置文件都是放到了etc/hadoop/目录里,而且所有节点的配置文件都是统一的,省得还去区分NameNode和DataNode,配置一份然后拷贝到所有节点就行了。我们首先修改core-site.xml,添加hadoop.tmp.dir属性。由于在core-default.xml中,hadoop.tmp.dir被默认设置在/tmp目录下,重启机器数据就会丢失,所以我们必须覆盖这个配置项。&configuration&&property&&name&hadoop.tmp.dir&/name&&value&/home/administrator/cloud/tmp&/value&&/property&&/configuration&&  Hdfs-site.xml中的配置项:&configuration&&property&&name&dfs.namenode.name.dir&/name&&value&file:///home/administrator/cloud/hdfs23&/value&&/property&&property&&name&dfs.federation.nameservices&/name&&value&ns1,ns2&/value&&/property&&property&&name&dfs.namenode.rpc-address.ns1&/name&&value&<span style="color: #2.168.<span style="color: #.133:<span style="color: #00&/value&&/property&&property&&name&dfs.namenode.http-address.ns1&/name&&value&<span style="color: #2.168.<span style="color: #.133:<span style="color: #001&/value&&/property&&property&&name&dfs.namenode.secondary.http-address.ns1&/name&&value&<span style="color: #2.168.<span style="color: #.133:<span style="color: #002&/value&&/property&&property&&name&dfs.namenode.rpc-address.ns2&/name&&value&<span style="color: #2.168.<span style="color: #.134:<span style="color: #00&/value&&/property&&property&&name&dfs.namenode.http-address.ns2&/name&&value&<span style="color: #2.168.<span style="color: #.134:<span style="color: #001&/value&&/property&&property&&name&dfs.namenode.secondary.http-address.ns2&/name&&value&<span style="color: #2.168.<span style="color: #.134:<span style="color: #002&/value&&/property&&/configuration&&  NameNode federation的配置其实是向后兼容的,你还可以像原来的方式一样把它配置成single namenode。对于我们想配置成NameNode federation的方式的话,引入了一些新的参数如下表所示:  Daemon Configuration Parameter  Namenode dfs.namenode.rpc-address   dfs.namenode.servicerpc-address   dfs.namenode.http-address   dfs.namenode.https-address   dfs.namenode.keytab.file   dfs.namenode.name.dir   dfs.namenode.edits.dir   dfs.namenode.checkpoint.dir   dfs.namenode.checkpoint.edits.dir   dfs.federation.nameservices  Secondary Namenode dfs.namenode.secondary.http-address dfs.secondary.namenode.keytab.file  BackupNode dfs.namenode.backup.address dfs.secondary.namenode.keytab.file  就像我的部署实例中描述的那样,dfs.federation.nameservices表示两个NameServiceID,在我的例子中分别是ns1和ns2。然后分别配置这两个nameservice的rpc-address。这个dfs.namenode.rpc-address.是非常重要的属性,因为在后续对NameService的访问中都是通过这个属性的值来完成的。dfs.namenode.http-address是通过web浏览器访问监控信息的端口,也就是默认50070的那个端口。dfs.namenode.name.dir和dfs.namenode.edits.dir表示的是NameNode节点的Namespace元数据存放的本地目录,默认是在hadoop.tmp.dir目录下的某一位置,我们可以修改。  同时,这里面提到了两个RPC端口,分别是dfs.namenode.rpc-address和dfs.namenode.servicerpc-address。如果像我的例子中一样,只配置dfs.namenode.rpc-address,那么NameNode-Client和NameNode-DataNode之间的RPC都走的是这个端口。如果配置了后者与前者不同,那么dfs.namenode.rpc-address表示的是NameNode-Client之间的RPC,而dfs.namenode.servicerpc-address表示的是NameNode-DataNode之间的RPC。之所以要区别开来,我想主要是因为datanode和namenode通讯时不会影响client和namenode的通讯,因为同一个端口同时打开的句柄毕竟是预先设定的,缺省为10个。  (5)配置好了这些之后,就可以格式化文件系统了。由于我们部署了2个NameNode,所以我们需要在133和134两台机器上分别执行${HADOOP_DEV_HOME}/bin/hdfs namenode -format -clusterid eric命令。注意两台机器上指定的clusterid是一样的,表示这两个namenode组成的是同一个集群。  那么在执行了format之后,在192.168.12.133节点的dfs.namenode.name.dir目录下生成了current目录,在current目录里有个VERSION文件,内容如下:#Thu Apr <span style="color: # <span style="color: #:<span style="color: #:<span style="color: # CST <span style="color: #12namespaceID=<span style="color: #clusterID=ericcTime=<span style="color: #storageType=NAME_NODEblockpoolID=BP-<span style="color: #-<span style="color: #2.168.<span style="color: #.133-<span style="color: #layoutVersion=-<span style="color: #&  和以前的版本相比多了clusterID和blockpoolID这两项。clusterID就是我们刚才在format时指定的集群ID,在整个集群中是唯一的。而blockpoolID就是针对每一个Namespace所对应的blockpool的ID,上面的这个BP--192.168.12.133-4就是在我的ns1的namespace下的存储块池的ID,这个ID包括了其对应的NameNode节点的ip地址。  在format的同时也会生成fsimage和edits文件,及其对应的md5校验文件。    然后就可以通过执行sbin/start-dfs.sh启动整个HDFS集群了。  (6)FsShell使用  在使用过程中也有些不同,例如使用FsShell进行一些文件操作,例如原来的操作是:Bin/hadoop fs &put /home/test /cloud/  那么现在要这样操作Bin/hadoop fs &put /home/test hdfs://<span style="color: #2.168.<span style="color: #.133:<span style="color: #00/cloud/&  也就是说从FsShell中操作文件要指定HDFS的namespace,这也是我前面说的为什么dfs.namenode.rpc-address这个属性很重要的原因。  而且在0.23.1以后的版本中,像bin/hdfs dfsadmin &report这样的命令执行是需要配置fs.default.name这个参数的。也就是说很多hdfs的命令需要指定相应的namespace,然后这个shell的操作都是对这个namespace的操作。  当然大多数情况下还是利用client-api来进行hdfs的操作,从api的角度看,现在提供的接口除了DistributedFileSystem外,又提供了一个DFSAdmin接口,用于对文件系统的管理操作。hadoop在后续的版本中会发布hadoop-client这个工程模块,相信会把client的易用性有所提升。  (7)web监控界面  
大学生分期购物销量榜
已有条评论
IT168企业级

我要回帖

更多关于 tomcat8.0安装配置 的文章

 

随机推荐