Centos7上Hadoop的安装和配置

来源:互联网 发布:幼儿园大班美工活动 编辑:程序博客网 时间:2024/05/21 09:20


背景介绍



Hadoop是一个能够让用户轻松架构和使用的分布式计算平台,用户可以轻松地在Hadoop上开发和运行处理海量数据的应用程序。

Hadoop是由Apache基金会所开发的分布式系统基础架构,用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。

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


Hadoop集群中不同主机扮演不同的角色,主要分下面几种:

Master

    NameNode

    NameNode用于管理文件系统HDFS ,维护文件系统树结构和文件元数据。当有新文件要写入系统时客户端会先向NameNode查询当前文件系统的状态,然后得知自己可以往哪里写入,最后实际写入文件系统,这中间NameNode就是管理主要信息的核心设备。

    
    ResourceManager

    ResourceManager用于管理和分配工作,它是所有工作的总调度程序。



Slave

    DataNode

    DataNode提供文件存储,它将自己的存储空间分块,然后向NameNode报告自己的存储状态并负责真正保存文件


    NodeManager

    NodeManager用于接受ResourceManager分配的工作并实际工作,是所有工作的实际执行者。


Hadoop安装


注意:Hadoop对JDK的版本要求,参考:https://wiki.apache.org/hadoop/HadoopJavaVersions


Hadoop有三种安装模式:单机模式,伪分布式,真正分布式。


单机模式standalone

单机模式是Hadoop的默认模式。这种模式在一台单机上运行,没有分布式文件系统,而是直接读写本地操作系统的文件系统。

当首次解压Hadoop的源码包时,Hadoop无法了解硬件安装环境,便保守地选择了最小配置。

在这种默认模式下所有3个XML文件均为空。当配置文件为空时,Hadoop会完全运行在本地。

因为不需要与其他节点交互,单机模式就不使用HDFS,也不加载任何Hadoop的守护进程。该模式主要用于开发调试MapReduce程序的应用逻辑。


伪分布模式

这种模式也是在一台单机上运行,但用不同的Java进程模仿分布式运行中的各类结点(NameNode,DataNode,JobTracker,TaskTracker,SecondaryNameNode)。

注意分布式运行中的这些结点的区别:

从分布式存储的角度来说,集群中的结点由一个NameNode和若干个DataNode组成,另有一个SecondaryNameNode作为NameNode的备份。

从分布式应用的角度来说,集群中的结点由一个JobTracker和若干个TaskTracker组成,JobTracker负责任务的调度,TaskTracker负责并行执行任务。

TaskTracker必须运行在DataNode上,这样便于数据的本地计算。JobTracker和NameNode则无须在同一台机器上。

一台机器即当NameNode,又当DataNode,或者说即是JobTracker,又是TaskTracker。没有所谓的在多台机器上进行真正的分布式计算,故称为"伪分布式"。



完全分布式模式

真正的分布式,由3个及以上的实体机或者虚拟机组件的机群。


>下载Hadoop安装包

Hadoop官方资料:http://hadoop.apache.org/docs/r2.4.1/hadoop-project-dist/hadoop-common/SingleCluster.html

Hadoop官方下载镜像:http://www.apache.org/dyn/closer.cgi/hadoop/common/

我下载Hadoop-2.5.2:http://mirrors.cnnic.cn/apache/hadoop/common/hadoop-2.5.2/hadoop-2.5.2.tar.gz 



>JDK安装


我选择java-1.7.0-openjdk-1.7.0.121

先看看系统是否已经默认安装了openjdk

# yum list installed | grep java


如果版本不符,先卸载自带安装的jdk

卸载JDK相关文件输入

# yum -y remove java-1.7.0-openjdk*


卸载tzdata-java输入

# yum -y remove tzdata-java.noarch


安装openjdk-1.7.0

# yum -y install java-1.7.0-openjdk*


查看java版本

# java -version


配置环境变量:

# vim /etc/profile

文件末尾,添加内容:

# for java 

export JAVA_HOME=/lib/jvm/java

export JRE_HOME=$JAVA_HOME/jre

export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH

export PATH=$JAVA_HOME/bin:$PATH


生效配置

# source /etc/profile



>添加hadoop用户

当然也可以直接使用root用户

# useradd hadoop

# passwd hadoop

我直接使用root用户,这里就不添加了。



>ssh免密匙登录

切换到hadoop用户执行.如果直使用root用户,不使用hadoop用户,则无需切换。配置ssh,生成密匙,使到ssh可以免密码连接(RSA算法,基于因数不对称加密:公钥加密私钥才能解密,私钥加密公钥才能解密)。提示输入时,三次直接回车,不输入。


# cd ~

# ssh-keygen -t rsa 

# cd .ssh

# cp id_rsa.pub authorized_keys 覆盖公钥,就能免密码连接


测试免密登录,如果不提示输入密码,则配置成功

# ssh localhost



>Hadoop单机模式standalone安装

......


>Hadoop伪分布模式安装


解压

如果以hadoop用户安装,则在用户目录/home/hadoop/下执行解压,我用root用户,在/opt下进行

# cd /opt

# tar -zxvf hadoop-2.5.2.tar.gz


添加Hadoop环境变量

Hadoop 2.5.0后需要添加环境变量

如果用hadoop用户,则在当前hadoop用户下面编辑

$ vim ~/.bashrc 添加如下代码

  export HADOOP_HOME=/home/hadoop/hadoop-2.5.2  

  export PATH=$PATH:$HADOOP_HOME/bin 

  export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native  

  export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib"  



生效环境变量

$ source ~/.bashrc


如果是用的root用户,则在当前root用户下面编辑

# vim /etc/profile

  export HADOOP_HOME=/opt/hadoop-2.5.2 

  export PATH=$PATH:$HADOOP_HOME/bin 

  export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native 

  export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib" 



生效环境变量

# source /etc/profile



创建tmp目录

创建一个tmp目录,未来的查询都可以在这个目录下进行

# mkdir /opt/hadoop-2.5.2/tmp



修改Hadoop的配置文件

下面的配置文件都在hadoop安装目录的etc/hadoop目录下,注意先备份。

最开始的时候hadoop配置文件很少,不过随着项目越来越大配置文件也开始增加了。

到现在为止hadoop的代码大致分为了core,hdfs和map/reduce三部分,配置文件也被分成了三个。不过mapred-site.xml其实可以不配置。



1. hadoop-env.sh

  为hadoop指定jdk。

  这里真正要配置的其实就是配置JAVA_HOME这个参数,虽然配置了环境jdk的环境变量, 但如果没有修改该配置文件,在启动hadoop时,提示找不到jdk:localhost: Error: JAVA_HOME is not set and could not be found.

  
  vim /opt/hadoop-2.5.2/etc/hadoop/hadoop-env.sh

  
  #export JAVA_HOME=${JAVA_HOME} #修改之前

  export JAVA_HOME=/lib/jvm/java #修改以后

  ......

  #export HADOOP_OPTS="$HADOOP_OPTS -Djava.net.preferIPv4Stack=true"  #修改之前

  export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib:$HADOOP_HOME/lib/native"  #修改之后,如果不需改,可能会报错,后面提到的:遇到的错误和解决方法



hadoop可以在单节点上以伪分布式的方式运行,Hadoop进程以分离的Java进程来运行,节点即NameNode也是DataNode。需要修改2个配置文件:etc/hadoop/core-site.xml和etc/hadoop/hdfs-site.xml。



2. core-site.xml

  配置HDFS节点名称和地址。指定接收Client连接的RPC端口,用于获取文件系统metadata信息。

  按照下面的内容配置Master(NameNode/ResourceManager)的地址和端口号,进行下面的配置前一定要创建/opt/hadoop-2.5.2/tmp目录。

  fs.defaultFS用来指定ResourceManager设备。

  
  vim /opt/hadoop-2.5.2/etc/hadoop/core-site.xml

  
  <configuration>

      <property>

         <name>hadoop.tmp.dir</name>

         <value>/opt/hadoop-2.5.2/tmp</value>

         <description>A base for other temporary directories.</description>

      </property>

      
      <property>

          <name>fs.defaultFS</name>

          <value>hdfs://localhost:9000</value>

      </property>

  </configuration>


  注意:这里如果要通过外部访问本机,localhost要改成IP地址(192.168.1.100,不能用127.0.0.1)或者是主机名,否则只能本机访问,无法通过其他机器访问。 

  Hadoop自升级到2.x版本之后,有很多属性的名称已经被遗弃了,虽然这些属性名称目前还可以用,但是还是建议用新的属性名。

  主要遗弃的属性名称参考下面地址:http://www.iteblog.com/archives/923。

  上面的fs.defaultFS在老版本中使用fs.default.name,现在还是可以用的,但是建议使用新的。


  hadoop如果使用主机名,不支持特殊字符。

  
  配置hdfs的指定URL路径,由于是伪分布模式,所以配置的是本机IP ,可为真实Ip、localhost。

    
  注意:上面的hadoop.tmp.dir如果不配置的话默认就会用临时目录/tmp/hadoo-hadoop。

  这个目录每次重启后都会被删掉,必须重新执行format才行(bin/hadoop namenode -format),否则会出错,namenode启动不起来。

  所以建议更改默认的hadoop.tmp.dir路径。一定要先创建好tmp目录。



3. hdfs-site.xml

  
  配置HDFS存储目录,复制数量。备份只有一份。

  
  vim /opt/hadoop-2.5.2/etc/hadoop/hdfs-site.xml
  

  <configuration>

      <property>

          <name>dfs.replication</name>

          <value>1</value>

      </property>

  </configuration>

  我配置的伪单机,用的是该配置。

  
  或
  
  <configuration>  

    <property>  

         <name>dfs.replication</name>  

         <value>1</value>  

    </property>  

    <property>  

       <name>dfs.namenode.name.dir</name>  

       <value>file:/opt/hadoop/tmp/dfs/name</value>  

    </property>  

    <property>  

       <name>dfs.datanode.data.dir</name>  

       <value>file:/opt/hadoop/tmp/dfs/data</value>  

    </property>  

</configuration>  

  
  主要是对namenode和datanode存储路径的设置。

  其实默认是存储是在file://${hadoop.tmp.dir}/dfs/name和data下的。由于我配置过hadoop.tmp.dir了,所以这里也不需配置的。

  如果没有配置过hadoop.tmp.dir(默认/tmp),重启重启就没有了,那么这里建议设置专门的路径保存,使用后者配置。

  如果已经配置过了hadoop.tmp.dir为非默认值/tmp,那么这里可以不用配置,使用前者配置。



4. mapred-site.xml

  配置mapreduce的jobtracker地址。告诉hadoop,MapReduce是运行在yarn这个框架上。

  
  cd /opt/hadoop-2.5.2/etc/hadoop/

  mv mapred-site.xml.template mapred-site.xml 并添加下面内容:

  
  <configuration>  

      <property>  

          <name>mapreduce.framework.name</name>  

          <value>yarn</value>  

      </property>  

  </configuration>

  
5. yarn-site.xml


  vim /opt/hadoop-2.5.2/etc/hadoop/yarn-site.xml

  
  <configuration> 

      <property>  

          <name>yarn.nodemanager.aux-services</name>  

          <value>mapreduce_shuffle</value>  

      </property>

  </configuration>  



Hadoop的启动和停止


切换到该安装目录下,首先格式化namenode

# cd /opt/hadoop-2.5.2

# bin/hdfs namenode -format


停止Hadoop 

# cd /opt/hadoop-2.5.2

# sbin/stop-all.sh


重新格式化namenode节点

# cd /opt/hadoop-2.5.2

# bin/hadoop namenode -format


启动Hadoop

# cd /opt/hadoop-2.5.2

# sbin/start-all.sh


jps查看java的后台进程

# jps

7160 NameNode

11256 Jps

7695 ResourceManager

7315 DataNode

7792 NodeManager

7504 SecondaryNameNode



hadoop进程管理页面,Web查看NameNode运行状况:http://localhost:8088 ,

也可以 http://192.168.1.200:8088


hdfs管理页面,Web查看hdfs管理页面:http://localhost:50070 ,

也可以http://192.168.1.200:50070


简单hdfs命令测试:

mkdir -p /opt/hadoop-2.5.2/myinput/test

cd  /opt/hadoop-2.5.2/myinput/test

echo "1;jack;testaaaa" > file01.txt


hdfs dfs -ls /

hdfs dfs -mkdir /test

hdfs dfs put file01.txt /test/file01.txt

hdfs dfs -cat /test/test1.txt



遇到的错误和解决方法:

1. WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable

貌似是32位和64位的原因。首先确认系统是否64为系统,程序默认为32为程序。

解决:

下载native源码重新编译。也可以从下面的地址,直接下载对应的64位版本的hadoop-native:

http://http://dl.bintray.com/sequenceiq/sequenceiq-bin/

我下载了hadoop-native-64-2.5.2.tar。下载完以后,解压到hadoop的native目录下,覆盖原有文件即可。

rm -rf /opt/hadoop-2.5.2/lib/native/*

tar -xvf hadoop-native-64-2.5.2.tar -C /opt/hadoop-2.5.2/lib/native/


如果还是不行,尝试修改hadoop-env.sh中的HADOOP_OPTS:

vim /opt/hadoop-2.5.2/etc/hadoop/hadoop-env.sh

export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib:$HADOOP_HOME/lib/native"

我的这个问题得到解决。

2. hadoop dfs -ls /  提示
DEPRECATED: Use of this script to execute hdfs command is deprecated.
Instead use the hdfs command for it.

原因:该版本hadoop目录已经换成了hdfs了,用hdfs代替。执行:hdfs dfs -ls / 就OK了。


Hadoop开启、关闭调试信息

开启:

export HADOOP_ROOT_LOGGER=DEBUG,console

关闭:

export HADOOP_ROOT_LOGGER=INFO,console




>Hadoop完全分布式模式安装
======待补充

0 0
原创粉丝点击