10天Hadoop快速突击(2)——Hadoop的安装与配置

Hadoop的安装与配置

在Linux上安装与配置Hadoop

    Hadoop的下载地址为http://hadoop.apache.org/releases.html

    在安装之前,需要先安装两个程序:

    1)JDK。Hadoop是用Java编写的程序,Hadoop的编译及MapReduce的运行都需要使用JDK。

    2)SSH,推荐安装openssh。Hadoop需要通过SSH来启动Slave列表中各台主机的守护进程。

    安装JDK:

        (1)下载和安装

      下载地址为:http://download.oracle.com/otn-pub/java/jdk/8u171-b11/512cd62ec5174c3487ac17c61aaa89e8/jdk-8u171-linux-x64.tar.gz

        (2)验证JDK是否安装成功

        输入命令:java --version和$JAVA_HOME/bin/java -version,如果出现的信息一致,则说明JDK环境安装成功

        

        

    创建hadoop用户

        $sudo useradd -m hadoop -s /bin/bash

        设置密码

        $sudo passwd hadoop

        为hadoop用户增加管理员权限

        $sudo adduser hadoop sudo 

    配置SSH免密码登录

        (1)确认已经连接互联网,输入命令:sudo apt-get install openssh-clients openssh-server

        (2)配置为可以免密码登录本机,查看在hadoop用户下是否存在.ssh目录,输入命令$ls -a /home/u,如果没有,可以手动创建一个

        (3)输入命令:$ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa

            ssh-keygen代表生成密钥,-t表示指定生成的密钥类型,dsa是dsa密钥认证的意思,即密钥类型,-P用于提供密语,-f指定生成的密钥文件。~代表当前用户文件夹,即/home/hadoop。

            输入命令,将id_dsa.pub追加到授权的key中去:

            $cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys

            这里的authorized_keys是用于认证的公钥文件。

            验证SSH是否已经安装成功,以及是否可以免密码登录本机

            输入命令:ssh localhost

            

            说明安装成功,第一次登录会询问是否继续安装,输入yes即可进入。

    安装并运行Hadoop

        Hadoop分别从三个角度将主机划分为两种角色。第一,最基本的划分为Master和Slave,即主从关系;第二,从HDFS的角度,将主机划分为NameNode和DataNode(NameNode是目录管理者);第三,从MapReduce的角度,将主机划分为JobTracker和TaskTracker(一个Job经常被划分为多个Task)

        Hadoop有三种运行方式:单机模式、伪分布式与分布式

        (1)单机模式配置方法

            安装单机模式的Hadoop无须配置,在该模式下,Hadoop被认为是一个单独的Java进程,这种方式经常用来调试。

        (2)伪分布式Hadoop配置

            可以吧伪分布式的Hadoop看作只有一个节点的集群,在这个集群中,这个节点即是Master,也是Slave;既是NameNode,也是DataNode,既是JobTracker,也是TaskTracker。Hadoop进程以分离的Java进程来运行。

              Hadoop 的配置文件位于 /usr/local/hadoop/etc/hadoop/ 中,伪分布式需要修改2个配置文件 core-site.xml 和 hdfs-site.xml 。Hadoop的配置文件是 xml 格式,每个配置以声明 property 的 name 和 value 的方式来实现。

        进入conf文件夹,修改配置文件:

        修改Hadoo-env.sh

        指定JDK的安装位置:

        export JAVA_HOME = /usr/local/jdk1.8.0_172/bin/java

        配置hadoop的核心配置文件core-site.xml,配置HDFS的地址和端口号:

        <configuration>
            <property>
                 <name>hadoop.tmp.dir</name>
                 <value>file:/usr/local/hadoop/tmp</value>
                 <description>Abase for other temporary directories.</description>
            </property>
            <property>
                 <name>fs.default.name</name>
                 <value>hdfs://localhost:9000</value>
            </property>

        </configuration>

        修改配置文件hdfs-site.xml,配置的备份方式默认为3,在单机版的Hadoop中,需要将其修改为1:

        <configuration>
            <property>
                 <name>dfs.replication</name>
                 <value>1</value>
            </property>
            <property>
                 <name>dfs.namenode.name.dir</name>
                 <value>file:/usr/local/hadoop/tmp/dfs/name</value>
            </property>
            <property>
                 <name>dfs.datanode.data.dir</name>
                 <value>file:/usr/local/hadoop/tmp/dfs/data</value>
            </property>

        </configuration>

        Hadoop中MapReduce的配置文件mapred-site.xml的修改,配置JobTracker的地址及端口:

        <configuration>
            <property>
                 <name>mapred.job.tracker</name>
                 <value>localhost:9001</value>
            </property>

        </configuration>

        配置完成后,可以启动Hadoop。但是在这之前,需要格式化Hadoop的文件系统HDFS。

        进入Hadoop目录,输入bin/hadoop namenode -format

        格式化之后可以启动Hadoop,但只有在第一次启动Hadoop的时候才需要格式化。

        bin/start-all.sh

        最后打开浏览器,输入http://localhost:50070,可以查看HDFS的web页面。

        对于Hadoop来说,启动所有进程是必须的,但是如果有必要,可以只启动HDFS(start-dfs.sh)或MapReduce(start-mapred.sh)。

安装和配置Hadoop集群

    通常来说,一个Hadoop的集群体系结构由两层网络拓扑组成。在Hadoop中,网络的拓扑结构、机器结点及机架的网络位置定位都是通过树结构来描述的。通过树结构来确定节点间的距离。NameNode也是通过这个距离来决定应该把数据副本放在哪里的。当一个Map任务到达时,它会被分配到一个TaskTracker上运行,JobTracker节点则会使用网络位置来确定Map任务执行的机器节点。

    

        在配置Hadoop时,Hadoop会确定节点地址和其网络位置的映射,此映射在代码中通过Java接口DNSToSwitchMaping实现,代码如下:

public interface DNSToSwitchMapping {
    public List<String> resolve(List<String> names);
}    

        其中参数names是IP地址的一个List数据,这个函数的返回值为对应网络位置的字符串列表。在opology.node.switch.mapping.impl中的配置参数定义了一个DNSToSwitchMaping接口的实现,NameNode通过它确定完成任务的机器节点所在的网络位置。

        系统有一个默认的接口实现ScriptBasedMapping。它可以运行用户自定义的一个脚本区完成映射。如果用户没有定义映射,它会将所有的机器节点映射到一个单独的网络位置中默认的机架上;如果用户定义了映射,那么这个脚本的位置由topology.script.file.name的属性控制。脚本必须获取一批主机的IP地址作为参数进行映射,同时生成一个标准的网络位置给输出。

  1. Hadoop集群的配置

        Hadoop的配置文件分为两类。
            1)只读类型的默认文件:src/core/core-default.xml、src/hdfs/hdfs-default.xml、src/mapred/mapred-default.xml、conf/mapred-queues.xml。
            2)定位(site-specific)设置:conf/core-site.xml、conf/hdfs-site.xml、conf/mapred-site.xml、conf/mapred-queues.xml。
            除此之外,也可以通过设置conf/Hadoop-env.sh来为Hadoop的守护进程设置环境变量(在bin/文件夹内)。
            Hadoop是通过org.apache.hadoop.conf.configuration来读取配置文件的。在Hadoop的设置中,Hadoop的配置是通过资源(resource)定位的,每个资源由一系列name/value对以XML文件的形式构成,它以一个字符串命名或以Hadoop定义的Path类命名(这个类是用于定义文件系统内的文件或文件夹的)。如果是以字符串命名的,Hadoop会通过classpath调用此文件。如果以Path类命名,那么Hadoop会直接在本地文件系统中搜索文件。
        资源设定有两个特点:
            1)Hadoop允许定义最终参数(final parameters),如果任意资源声明了final这个值,那么之后加载的任何资源都不能改变这个值,定义最终资源的格式是这样的:

<property>
    <name>dfs.client.buffer.dir</name>
    <value>/tmp/Hadoop/dfs/client</value>
    <final>true</final>   //注意这个值
</property>

            2)Hadoop允许参数传递,示例如下,当tenpdir被调用时,basedir会作为值被调用。

<property>
    <name>basedir</name>
    <value>/user/${user.name}</value>
<property>

<property>
    <name>tempdir</name>
    <value>${basedir}/tmp</value>
</property>

        可以通过设置conf/Hadoop-env.sh为Hadoop的守护进程设置环境变量。
        一般来说,大家至少需要在这里设置在主机上安装的JDK的位置(JAVA_HOME),以使Hadoop找到JDK。大家也可以在这里通过HADOOP_*_OPTS对不同的守护进程分别进行设置,如表2-1所示。


0e626abbf48e5809029fc1a5cc7a8db4dc48e373

         一般而言,除了规定端口、IP地址、文件的存储位置外,其他配置都不是必须修改的,可以根据读者的需要决定采用默认配置还是自己修改。还有一点需要注意的是,以上配置都被默认为最终参数(final parameters),这些参数都不可以在程序中再次修改。
        接下来可以看一下conf/mapred-queues.xml的配置列表,如表2-5所示。
        表2-5 conf/mapred-queues.xml的配置


cad3b41382f3e3b67e5066631a04c91d5a6bb4cd

        queues是JobTracker中的一个抽象概念,可以在一定程度上管理Job,因此它为管理员提供了一种管理Job的方式。这种控制是常见且有效的,例如通过这种管理可以把不同的用户划分为不同的组,或分别赋予他们不同的级别,并且会优先执行高级别用户提交的Job。
        按照这个思想,很容易想到三种原则:
            同一类用户提交的Job统一提交到同一个queue中;
            运行时间较长的Job可以提交到同一个queue中;
            把很快就能运行完成的Job划分到一个queue中,并且限制queue中Job的数量上限。
        queue的有效性很依赖在JobTracker中通过mapreduce.jobtracker.taskscheduler设置的调度规则(scheduler)。一些调度算法可能只需要一个queue,不过有些调度算法可能很复杂,需要设置很多queue。
        对queue大部分设置的更改都不需要重新启动MapReduce系统就可以生效,不过也有一些更改需要重启系统才能有效,具体如表2-5所示。
conf/mapred-queues.xml的文件配置与其他文件略有不同,配置格式如下:

<queues aclsEnabled="$aclsEnabled">
        <queue>
         <name>$queue-name</name>
         <state>$state</state>
         <queue>
           <name>$child-queue1</name>
           <properties>
             <property key="$key" value="$value"/>
               ...
           </properties>
           <queue>
             <name>$grand-child-queue1</name>
             ...
           </queue>
         </queue>
         <queue>
           <name>$child-queue2</name>
             ...
         </queue>
           ...
           ...
           ...
           <queue>
            <name>$leaf-queue</name>
            <acl-submit-job>$acls</acl-submit-job>
            <acl-administer-jobs>$acls</acl-administer-jobs>
            <properties>
              <property key="$key" value="$value"/>
              ...
            </properties>
           </queue>
          </queue>
         </queues>
  1. 一个具体的配置
    搭建一个有三台主机的小集群示例

        Hadoop对主机的三种定位方式,分别为Master和Slave,JobTracker和TaskTracker,NameNode和DataNode。在分配IP地址时我们顺便规定一下角色。
        下面为这三台机器分配IP地址及相应的角色:
            10.37.128.2—master,namonode,jobtracker—master(主机名)
            10.37.128.3—slave,dataNode,tasktracker—slave1(主机名)
            10.37.128.4—slave,dataNode,tasktracker—slave2(主机名)
        首先在三台主机上创建相同的用户(这是Hadoop的基本要求):
            1)在三台主机上均安装JDK 1.6,并设置环境变量。
            2)在三台主机上分别设置/etc/hosts及/etc/hostname。
            hosts这个文件用于定义主机名与IP地址之间的对应关系。

/etc/hosts:
127.0.0.1 localhost
10.37.128.2 master
10.37.128.3 slave1
10.37.128.4 slave2
hostname这个文件用于定义Ubuntu的主机名。
/etc/hostname:
“你的主机名”(如master,slave1等)

            3)在这三台主机上安装OpenSSH,并配置SSH可以免密码登录。
                安装方式不再赘述,建立~/.ssh文件夹,如果已存在,则无须创建。生成密钥并配置SSH免密码登录本机,输入命令:

ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
将文件复制到两台Slave主机相同的文件夹内,输入命令:
scp authorized_keys slave1:~/.ssh/
scp authorized_keys slave2:~/.ssh/
查看是否可以从Master主机免密码登录Slave,输入命令:
ssh slave1
ssh slave2

            4)配置三台主机的Hadoop文件,内容如下。

conf/Hadoop-env.sh:
export JAVA_HOME=/usr/lib/jvm/jdk
conf/core-site.xml:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<!-- Put site-specific property overrides in this file. -->

<configuration>
  <property>
     <name>fs.default.name</name>
     <value>hdfs://master:9000</value>
  </property>
<property>
     <name>hadoop.tmp.dir</name>
     <value>/tmp</value> 
</property>
</configuration>
conf/hdfs-site.xml:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<!-- Put site-specific property overrides in this file. -->

<configuration>
<property>
   <name>dfs.replication</name>
   <value>2</value>
</property>
</configuration>
conf/mapred-site.xml:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<!-- Put site-specific property overrides in this file. -->
<configuration>
 <property>
    <name>mapred.job.tracker</name>
   <value>master:9001</value>
</property>
</configuration>
conf/masters:
master
conf/slaves:
slave1
slave2
5)启动Hadoop。
bin/Hadoop NameNode –format
bin/start-all.sh

        通过以下命令或者通过http://master:50070http://master:50030查看集群状态。

Hadoop dfsadmin –report

日志分析及几个小技巧

    Hadoop记录了详尽的日志信息,日志文件保存在logs目录内。无论是启动还是每一个Job,或是HDFS等相关信息,Hadoop均存在日志文件以供分析。

        例如:NameNode和DataNode的namespaceID不一致,这个错误是很多人在安装时都会遇到的。日志信息为:

java.io.IOException: Incompatible namespaceIDs in /root/tmp/dfs/data:namenode namespaceID = 1307672299; datanode namespaceID = 389959598

        若HDFS一直没有启动,读者可以查询日志,并通过日志进行分析,日志提示信息显示了NameNode和DataNode的namespaceID不一致。
        这个问题一般是由于两次或两次以上格式化NameNode造成的,有两种方法可以解决,第一种方法是删除DataNode的所有资料,第二种方法就是修改每个DataNode的namespaceID(位于/dfs/data/current/VERSION文件中)或修改NameNode的namespaceID(位于/dfs/name/current/VERSION文件中)。使其一致。
        下面这两种方法在实际应用也可能会用到。
            1)重启坏掉的DataNode或JobTracker。当Hadoop集群的某单个节点出现问题时,一般不必重启整个系统,只须重启这个节点,它会自动连入整个集群。
            在坏死的节点上输入如下命令即可:

bin/Hadoop-daemon.sh start datanode
bin/Hadoop-daemon.sh start jobtracker

            2)动态加入DataNode或TaskTracker。下面这条命令允许用户动态地将某个节点加入到集群中。

bin/Hadoop-daemon.sh --config ./conf start datanode
bin/Hadoop-daemon.sh --config ./conf start tasktracker

参考文章:

https://yq.aliyun.com/articles/173984

http://www.powerxing.com/install-hadoop/

https://cloud.tencent.com/developer/labs/lab/10190

https://blog.csdn.net/zhang89xiao/article/details/72188400

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

镰刀韭菜

看在我不断努力的份上,支持我吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值