• 大数据-01-安装Hadoop


    环境

    服务器:ubuntu-16.04.3-desktop-amd64.iso

    创建hadoop用户

    sudo useradd -m hadoop -s /bin/bash
    

    本文中会大量使用到sudo命令。sudo是ubuntu中一种权限管理机制,管理员可以授权给一些普通用户去执行一些需要root权限执行的操作。当使用sudo命令时,就需要输入您当前用户的密码.

    sudo passwd hadoop
    

    接着使用如下命令设置密码,可简单设置为 hadoop,按提示输入两次密码

    sudo adduser hadoop sudo
    

    可为 hadoop 用户增加管理员权限,方便部署,避免一些对新手来说比较棘手的权限问题:

    更新apt

    用 hadoop 用户登录后,我们先更新一下 apt,后续我们使用 apt 安装软件,如果没更新可能有一些软件安装不了。按 ctrl+alt+t 打开终端窗口,执行如下命令:

    sudo apt-get update
    

    安装软件 vim 用作基本文本编辑

    sudo apt-get install vim
    

    安装SSH、配置SSH无密码登陆

    集群、单节点模式都需要用到 SSH 登陆(类似于远程登陆,你可以登录某台 Linux 主机,并且在上面运行命令),Ubuntu 默认已安装了 SSH client,此外还需要安装 SSH server:

    sudo apt-get install openssh-server
    

    安装后,这个时候,就可以用Xshell等工具, 以hadoop用户进行登录进入了:
    可以使用如下命令登陆本机:

    ssh localhost
    

    但这样登陆是需要每次输入密码的,我们需要配置成SSH无密码登陆比较方便。
    首先退出刚才的 ssh,就回到了我们原先的终端窗口,然后利用 ssh-keygen 生成密钥,并将密钥加入到授权中:

    exit                           # 退出刚才的 ssh localhost
    cd ~/.ssh/                     # 若没有该目录,请先执行一次ssh localhost
    ssh-keygen -t rsa              # 会有提示,都按回车就可以
    cat ./id_rsa.pub >> ./authorized_keys  # 加入授权
    

    ~的含义
    在 Linux 系统中,~ 代表的是用户的主文件夹,即 “/home/用户名” 这个目录,如你的用户名为 hadoop,则 ~ 就代表 “/home/hadoop/”。 此外,命令中的 # 后面的文字是注释,只需要输入前面命令即可。
    此时再用 ssh localhost 命令,无需输入密码就可以直接登陆了,如下图所示。

    Welcome to Ubuntu 16.04.3 LTS (GNU/Linux 4.10.0-28-generic x86_64)
    
     * Documentation:  https://help.ubuntu.com
     * Management:     https://landscape.canonical.com
     * Support:        https://ubuntu.com/advantage
    
    Last login: Sun Apr 15 05:44:46 2018 from 192.168.229.1
    To run a command as administrator (user "root"), use "sudo <command>".
    See "man sudo_root" for details.
    

    安装Java环境

    要安装JDK 7,请使用以下命令:
    下载包

    wget https://download.java.net/openjdk/jdk7u75/ri/openjdk-7u75-b13-linux-x64-18_dec_2014.tar.gz
    

    解压缩刚才下载的

    sudo mkdir /usr/local/java 
    cp openjdk-7u75-b13-linux-x64-18_dec_2014.tar.gz /usr/local/java  
    cd /usr/local/java
    sudo tar xvf  openjdk-7u75-b13-linux-x64-18_dec_2014.tar.gz
    

    这里需要将文件夹进行一个重命名, 这里看到的文件夹名字是java-se-7u75-ri, 进行如下重命名:

    sudo mv java-se-7u75-ri java1.7.0_75
    

    然后编辑profile文件,添加路径,环境变量

    sudo vim /etc/profile
    

    在vim编辑器中的profile 末尾添加如下内容:

    export JAVA_HOME=/usr/local/java/jdk1.7.0_75
    export JRE_HOME=/usr/local/java/jdk1.7.0_75/jre
    export PATH=$PATH:/usr/local/java/jdk1.7.0_75/bin
    export CLASSPATH=./:/usr/local/java/jdk1.7.0_75/lib:/usr/local/java/jdk1.7.0_75/jre/lib
    

    输入:wq保存并退出,然后再重启系统.
    检查java版本是否正常:

    java -version
    

    此时显示jdk的版本号,我的显示如下:

    openjdk version "1.7.0_75"
    OpenJDK Runtime Environment (build 1.7.0_75-b13)
    OpenJDK 64-Bit Server VM (build 24.75-b04, mixed mode)
    

    安装Hadoop 2

    Hadoop 2 可以通过 http://mirror.bit.edu.cn/apache/hadoop/common/ 或者 http://mirrors.cnnic.cn/apache/hadoop/common/ 下载,一般选择下载最新的稳定版本,即下载 “stable” 下的 hadoop-2.x.y.tar.gz 这个格式的文件,这是编译好的,另一个包含 src 的则是 Hadoop 源代码,需要进行编译才可使用。
    我们选择将 Hadoop 安装至 /usr/local/ 中:

    sudo tar -zxf hadoop-2.7.5.tar.gz -C /usr/local    # 解压到/usr/local中
    cd /usr/local/
    sudo mv ./hadoop-2.7.5/ ./hadoop                   # 将文件夹名改为hadoop
    sudo chown -R hadoop ./hadoop                      # 修改文件权限
    

    Hadoop 解压后即可使用。输入如下命令来检查 Hadoop 是否可用,成功则会显示 Hadoop 版本信息:

    cd /usr/local/hadoop
    ./bin/hadoop version
    

    **** 相对路径与绝对路径
    请务必注意命令中的相对路径与绝对路径,本文后续出现的 ./bin/...,./etc/... 等包含 ./ 的路径,均为相对路径,以 /usr/local/hadoop 为当前目录。例如在 /usr/local/hadoop 目录中执行 ./bin/hadoop version 等同于执行 /usr/local/hadoop/bin/hadoop version。可以将相对路径改成绝对路径来执行,但如果你是在主文件夹 ~ 中执行 ./bin/hadoop version,执行的会是 /home/hadoop/bin/hadoop version,就不是我们所想要的了。

    Hadoop单机配置(非分布式)

    Hadoop 默认模式为非分布式模式(本地模式),无需进行其他配置即可运行。非分布式即单 Java 进程,方便进行调试。
    现在我们可以执行例子来感受下 Hadoop 的运行。Hadoop 附带了丰富的例子(运行 ./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0.jar 可以看到所有例子),包括 wordcount、terasort、join、grep 等。
    在此我们选择运行 grep 例子,我们将 input 文件夹中的所有文件作为输入,筛选当中符合正则表达式 dfs[a-z.]+ 的单词并统计出现的次数,最后输出结果到 output 文件夹中。

    cd /usr/local/hadoop
    mkdir ./input
    cp ./etc/hadoop/*.xml ./input   # 将配置文件作为输入文件
    ./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grep ./input ./output 'dfs[a-z.]+'
    cat ./output/*          # 查看运行结果
    

    注意,Hadoop 默认不会覆盖结果文件,因此再次运行上面实例会提示出错,需要先将 ./output 删除。

    rm -r ./output
    

    Hadoop伪分布式配置

    Hadoop 可以在单节点上以伪分布式的方式运行,Hadoop 进程以分离的 Java 进程来运行,节点既作为 NameNode 也作为 DataNode,同时,读取的是 HDFS 中的文件。

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

    修改配置文件 core-site.xml (通过 gedit 编辑会比较方便: gedit ./etc/hadoop/core-site.xml),将当中的

    <configuration>
    </configuration>
    

    修改为下面配置:

    <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.defaultFS</name>
            <value>hdfs://localhost:9000</value>
        </property>
    </configuration>
    

    同样的,修改配置文件 hdfs-site.xml:

    <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配置文件说明
    Hadoop 的运行方式是由配置文件决定的(运行 Hadoop 时会读取配置文件),因此如果需要从伪分布式模式切换回非分布式模式,需要删除 core-site.xml 中的配置项。

    此外,伪分布式虽然只需要配置 fs.defaultFS 和 dfs.replication 就可以运行(官方教程如此),不过若没有配置 hadoop.tmp.dir 参数,则默认使用的临时目录为 /tmp/hadoo-hadoop,而这个目录在重启时有可能被系统清理掉,导致必须重新执行 format 才行。所以我们进行了设置,同时也指定 dfs.namenode.name.dir 和 dfs.datanode.data.dir,否则在接下来的步骤中可能会出错。

    配置完成后,执行 NameNode 的格式化:

    ./bin/hdfs namenode -format
    

    成功的话,会看到 “successfully formatted” 和 “Exitting with status 0” 的提示,若为 “Exitting with status 1” 则是出错。

    如果在这一步时提示 Error: JAVA_HOME is not set and could not be found. 的错误,则说明之前设置 JAVA_HOME 环境变量那边就没设置好,请按教程先设置好 JAVA_HOME 变量,否则后面的过程都是进行不下去的。如果已经按照前面教程在.bashrc文件中设置了JAVA_HOME,还是出现 Error: JAVA_HOME is not set and could not be found. 的错误,那么,请到hadoop的安装目录修改配置文件“/usr/local/hadoop/etc/hadoop/hadoop-env.sh”,在里面找到“export JAVA_HOME=${JAVA_HOME}”这行,然后,把它修改成JAVA安装路径的具体地址,比如,“export JAVA_HOME=/usr/lib/jvm/default-java”,然后,再次启动Hadoop。

    接着开启 NameNode 和 DataNode 守护进程。

    ./sbin/start-dfs.sh  #start-dfs.sh是个完整的可执行文件,中间没有空格
    

    启动时可能会出现如下 WARN 提示:WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform… using builtin-java classes where applicable WARN 提示可以忽略,并不会影响正常使用。

    启动 Hadoop 时提示 Could not resolve hostname
    如果启动 Hadoop 时遇到输出非常多“ssh: Could not resolve hostname xxx”的异常情况,如下图所示:
    这个并不是 ssh 的问题,可通过设置 Hadoop 环境变量来解决。首先按键盘的 ctrl + c 中断启动,然后在 ~/.bashrc 中,增加如下两行内容(设置过程与 JAVA_HOME 变量一样,其中 HADOOP_HOME 为 Hadoop 的安装目录):

    export HADOOP_HOME=/usr/local/hadoop
    export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
    

    启动完成后,可以通过命令 jps 来判断是否成功启动,若成功启动则会列出如下进程: “NameNode”、”DataNode” 和 “SecondaryNameNode”(如果 SecondaryNameNode 没有启动,请运行 sbin/stop-dfs.sh 关闭进程,然后再次尝试启动尝试)。如果没有 NameNode 或 DataNode ,那就是配置不成功,请仔细检查之前步骤,或通过查看启动日志排查原因。

    运行Hadoop伪分布式实例

    上面的单机模式,grep 例子读取的是本地数据,伪分布式读取的则是 HDFS 上的数据。要使用 HDFS,首先需要在 HDFS 中创建用户目录:

    ./bin/hdfs dfs -mkdir -p /user/hadoop
    

    注意
    教材《大数据技术原理与应用》的命令是以”./bin/hadoop >dfs”开头的Shell命令方式,实际上有三种shell命令方式。

    1. hadoop fs
    2. hadoop dfs
    3. hdfs dfs

    hadoop fs适用于任何不同的文件系统,比如本地文件系统和HDFS文件系统
    hadoop dfs只能适用于HDFS文件系统
    hdfs dfs跟hadoop dfs的命令作用一样,也只能适用于HDFS文件系统

    接着将 ./etc/hadoop 中的 xml 文件作为输入文件复制到分布式文件系统中,即将 /usr/local/hadoop/etc/hadoop 复制到分布式文件系统中的 /user/hadoop/input 中。我们使用的是 hadoop 用户,并且已创建相应的用户目录 /user/hadoop ,因此在命令中就可以使用相对路径如 input,其对应的绝对路径就是 /user/hadoop/input:

    ./bin/hdfs dfs -mkdir input
    ./bin/hdfs dfs -put ./etc/hadoop/*.xml input
    

    复制完成后,可以通过如下命令查看文件列表:

    ./bin/hdfs dfs -ls input
    

    伪分布式运行 MapReduce 作业的方式跟单机模式相同,区别在于伪分布式读取的是HDFS中的文件(可以将单机步骤中创建的本地 input 文件夹,输出结果 output 文件夹都删掉来验证这一点)。

    ./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grep input output 'dfs[a-z.]+'
    

    查看运行结果的命令(查看的是位于 HDFS 中的输出结果):

    ./bin/hdfs dfs -cat output/*
    

    我们也可以将运行结果取回到本地:

    rm -r ./output    # 先删除本地的 output 文件夹(如果存在)
    ./bin/hdfs dfs -get output ./output     # 将 HDFS 上的 output 文件夹拷贝到本机
    cat ./output/*
    

    Hadoop 运行程序时,输出目录不能存在,否则会提示错误 “org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory hdfs://localhost:9000/user/hadoop/output already exists” ,因此若要再次执行,需要执行如下命令删除 output 文件夹:

    ./bin/hdfs dfs -rm -r output    # 删除 output 文件夹
    

    运行程序时,输出目录不能存在
    运行 Hadoop 程序时,为了防止覆盖结果,程序指定的输出目录(如 >output)不能存在,否则会提示错误,因此运行前需要先删除输出目录。在实际开>发应用程序时,可考虑在程序中加上如下代码,能在每次运行时自动删除输出目录>,避免繁琐的命令行操作:

    Configuration conf = new Configuration();
    Job job = new Job(conf);
    
    /* 删除输出目录 */
    Path outputPath = new Path(args[1]);
    outputPath.getFileSystem(conf).delete(outputPath, true);
    

    若要关闭 Hadoop,则运行

    ./sbin/stop-dfs.sh
    

    注意
    下次启动 hadoop 时,无需进行 NameNode 的初始化,只需要运行 >./sbin/start-dfs.sh 就可以!

    配置集群/分布式环境

    准备工作

    本教程简单的使用两个节点作为集群环境: 一个作为 Master 节点,局域网 IP 为 192.168.3.236;另一个作为 Slave 节点,局域网 IP 为 192.168.3.237。
    Hadoop 集群的安装配置大致为如下流程:

    1. 选定一台机器作为 Master
    2. 在 Master 节点上配置 hadoop 用户、安装 SSH server、安装 Java 环境
    3. 在 Master 节点上安装 Hadoop,并完成配置
    4. 在其他 Slave 节点上配置 hadoop 用户、安装 SSH server、安装 Java 环境
    5. 将 Master 节点上的 /usr/local/hadoop 目录复制到其他 Slave 节点上
    6. 在 Master 节点上开启 Hadoop

    配置 hadoop 用户、安装 SSH server、安装 Java 环境、安装 Hadoop 等过程已经在之前的单机/伪分布式配置中有详细介绍,请前往查看,不再重复叙述

    继续下一步配置前,请先完成上述流程的前 4 个步骤。

    网络配置

    我的虚拟机软件用的是VMware,在已经配置好的一份虚拟机上,将虚拟机关机后, 复制一份出来作为另一个虚拟机。同时需要更改网络连接方式为桥接(Bridge)模式,这个各个虚拟机上局域网络上, 才有各自独立的IP地址。
    Linux 中查看节点 IP 地址的命令为 ifconfig。
    首先在 Master 节点上完成准备工作,并关闭 Hadoop (/usr/local/hadoop/sbin/stop-dfs.sh),再进行后续集群配置。

    /usr/local/hadoop/sbin/stop-dfs.sh
    

    为了便于区分,可以修改各个节点的主机名(在终端标题、命令行中可以看到主机名,以便区分)。在 Ubuntu/CentOS 7 中,我们在 Master 节点上执行如下命令修改主机名(即改为 Master,注意是区分大小写的); 我们在 Slave1 节点上执行如下命令修改主机名(即改为 Slave1,注意是区分大小写的):

    sudo vim /etc/hostname
    

    然后执行如下命令修改自己所有节点的IP映射:

    sudo vim /etc/hosts
    

    例如本教程使用两个节点的名称与对应的 IP 关系如下:

    192.168.3.236 Master
    192.168.3.237 Slave1
    ####### 我们在 /etc/hosts 中将该映射关系填写上去即可,如下图所示(一般该文件中只有一个 127.0.0.1,其对应名为 localhost,如果有多余的应删除,特别是不能有 “127.0.0.1 Master” 这样的记录):
    通常就是3条即
    127.0.0.1 localhost
    192.168.3.236 Master
    192.168.3.237 Slave1

    修改完成后需要重启一下,重启后在终端中才会看到机器名的变化。接下来的教程中请注意区分 Master 节点与 Slave 节点的操作。
    配置好后需要在各个节点上执行如下命令,测试是否相互 ping 得通,如果 ping 不通,后面就无法顺利配置成功:

    ping Master -c 3   # 只ping 3次,否则要按 Ctrl+c 中断
    ping Slave1 -c 3
    

    例如我在 Master 节点上 ping Slave1,ping 通的话会显示 time,显示的结果如下所示:

    PING Slave1 (192.168.3.237) 56(84) bytes of data.
    64 bytes from Slave1 (192.168.3.237): icmp_seq=1 ttl=64 time=0.022 ms
    64 bytes from Slave1 (192.168.3.237): icmp_seq=2 ttl=64 time=0.031 ms
    64 bytes from Slave1 (192.168.3.237): icmp_seq=3 ttl=64 time=0.023 ms

    --- Slave1 ping statistics ---
    3 packets transmitted, 3 received, 0% packet loss, time 2030ms

    SSH无密码登陆节点

    因为我的两个服务器是复制的,两个服务器中都有一样的公钥,所有它们之前已经可以互相访问了,所有跳过本节(SSH无密码登陆节点)。 便是在现实的系统中,可能需要给不同的机器生成各自的连接钥匙,可以参考如下操作。

    这个操作是要让 Master 节点可以无密码 SSH 登陆到各个 Slave 节点上。
    首先生成 Master 节点的公匙,在 Master 节点的终端中执行(因为改过主机名,所以还需要删掉原有的再重新生成一次):

    cd ~/.ssh               # 如果没有该目录,先执行一次ssh localhost
    rm ./id_rsa*            # 删除之前生成的公匙(如果有)
    ssh-keygen -t rsa       # 一直按回车就可以
    

    让 Master 节点需能无密码 SSH 本机,在 Master 节点上执行:

    cat ./id_rsa.pub >> ./authorized_keys
    

    完成后可执行 ssh Master 验证一下(可能需要输入 yes,成功后执行 exit 返回原来的终端)。接着在 Master 节点将上公匙传输到 Slave1 节点:

    scp ~/.ssh/id_rsa.pub hadoop@Slave1:/home/hadoop/
    

    scp 是 secure copy 的简写,用于在 Linux 下进行远程拷贝文件,类似于 cp 命令,不过 cp 只能在本机中拷贝。执行 scp 时会要求输入 Slave1 上 hadoop 用户的密码(hadoop),输入完成后会提示传输完毕,如下所示:

    idrsa.puib 100% ....

    接着在 Slave1 节点上,将 ssh 公匙加入授权:

    mkdir ~/.ssh       # 如果不存在该文件夹需先创建,若已存在则忽略
    cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
    rm ~/id_rsa.pub    # 用完就可以删掉了
    

    如果有其他 Slave 节点,也要执行将 Master 公匙传输到 Slave 节点、在 Slave 节点上加入授权这两步。

    这样,在 Master 节点上就可以无密码 SSH 到各个 Slave 节点了,可在 Master 节点上执行如下命令进行检验,如下所示:

    ssh Slave1
    

    这样,在 Master 节点上就可以无密码 SSH 到各个 Slave 节点了,可在 Master 节点上执行如下命令进行检验,如下图所示:

    配置PATH变量

    ( 单机配置 Hadoop 的教程中有配置这一项了,这一步可以跳过)

    在单机伪分布式配置教程的最后,说到可以将 Hadoop 安装目录加入 PATH 变量中,这样就可以在任意目录中直接使用 hadoo、hdfs 等命令了,如果还没有配置的,需要在 Master 节点上进行配置。首先执行 vim ~/.bashrc,加入一行:

    export PATH=$PATH:/usr/local/hadoop/bin:/usr/local/hadoop/sbin

    保存后执行 source ~/.bashrc 使配置生效。

    配置集群/分布式环境

    集群/分布式模式需要修改 /usr/local/hadoop/etc/hadoop 中的5个配置文件,更多设置项可点击查看官方说明,这里仅设置了正常启动所必须的设置项: slaves、core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml 。

    1, 文件 slaves,将作为 DataNode 的主机名写入该文件,每行一个,默认为 localhost,所以在伪分布式配置时,节点即作为 NameNode 也作为 DataNode。分布式配置可以保留 localhost,也可以删掉,让 Master 节点仅作为 NameNode 使用。

    本教程让 Master 节点仅作为 NameNode 使用,因此将文件中原来的 localhost 删除,只添加二行内容:

    Master
    Slave1

    2, 文件 core-site.xml 改为下面的配置:
    fs.defaultFS为NameNode的地址。

    <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.defaultFS</name>
            <value>hdfs://Master:9000</value>
        </property>
    </configuration>
    
    

    3, 文件 hdfs-site.xml,dfs.replication 一般设为 3,但我们只有一个 Slave 节点,所以 dfs.replication 的值还是设为 1:

    <configuration>
            <property>
                    <name>dfs.namenode.secondary.http-address</name>
                    <value>Slave1:50090</value>
            </property>
            <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>
    

    4, 文件 mapred-site.xml (可能需要先重命名,默认文件名为 mapred-site.xml.template),然后配置修改如下:

    <configuration>
            <property>
                    <name>mapreduce.framework.name</name>
                    <value>yarn</value>
            </property>
            <property>
                    <name>mapreduce.jobhistory.address</name>
                    <value>Master:10020</value>
            </property>
            <property>
                    <name>mapreduce.jobhistory.webapp.address</name>
                    <value>Master:19888</value>
            </property>
    </configuration>
    

    5, 文件 yarn-site.xml:

    <configuration>
            <property>
                    <name>yarn.resourcemanager.hostname</name>
                    <value>Master</value>
            </property>
            <property>
                    <name>yarn.nodemanager.aux-services</name>
                    <value>mapreduce_shuffle</value>
            </property>
    </configuration>
    

    配置好后,将 Master 上的 /usr/local/Hadoop 文件夹复制到各个节点上。因为之前有跑过伪分布式模式,建议在切换到集群模式前先删除之前的临时文件。在 Master 节点上执行:

    cd /usr/local
    sudo rm -r ./hadoop/tmp     # 删除 Hadoop 临时文件
    sudo rm -r ./hadoop/logs/*   # 删除日志文件
    tar -zcf ~/hadoop.master.tar.gz ./hadoop   # 先压缩再复制
    cd ~
    scp ./hadoop.master.tar.gz Slave1:/home/hadoop
    
    

    在 Slave1 节点上执行:

    sudo rm -r /usr/local/hadoop    # 删掉旧的(如果存在)
    sudo tar -zxf ~/hadoop.master.tar.gz -C /usr/local
    sudo chown -R hadoop /usr/local/hadoop
    

    同样,如果有其他 Slave 节点,也要执行将 hadoop.master.tar.gz 传输到 Slave 节点、在 Slave 节点解压文件的操作。

    首次启动需要先在 Master 节点执行 NameNode 的格式化:

    /usr/local/hadoop/bin/hdfs namenode -format       # 首次运行需要执行初始化,之后不需要
    

    系统需要关闭防火墙

    CentOS系统默认开启了防火墙,在开启 Hadoop >集群之前,需要关闭集群中每个节点的防火墙。有防火墙会导致 ping 得通但 >telnet 端口不通,从而导致 DataNode 启动了,但 Live datanodes 为 0 >的情况。
    在 CentOS 6.x 中,可以通过如下命令关闭防火墙:

    sudo service iptables stop   # 关闭防火墙服务
    sudo chkconfig iptables off  # 禁止防火墙开机自启,就不用手动关闭了
    

    若用是 CentOS 7,需通过如下命令关闭(防火墙服务改成了 firewall):

    systemctl stop firewalld.service    # 关闭firewall
    systemctl disable firewalld.service # 禁止firewall开机启动
    

    Ubuntu

    ufw disable  #关闭ubuntu的防火墙
    ufw enable   #开启防火墙
    

    接着可以启动 hadoop 了,启动需要在 Master 节点上进行:

    start-dfs.sh
    start-yarn.sh
    mr-jobhistory-daemon.sh start historyserver
    

    相应的停止语句如下:
    stop-dfs.sh
    stop-yarn.sh
    mr-jobhistory-daemon.sh stop historyserver

    通过命令 jps 可以查看各个节点所启动的进程。正确的话,在 Master 节点上可以看到 NameNode、ResourceManager、SecondrryNameNode、JobHistoryServer 进程,如下图所示:
    通过jps查看Master的Hadoop进程

    在 Slave 节点可以看到 DataNode 和 NodeManager 进程,如下图所示:

    缺少任一进程都表示出错。另外还需要在 Master 节点上通过命令 hdfs dfsadmin -report 查看 DataNode 是否正常启动,如果 Live datanodes 不为 0 ,则说明集群启动成功。例如我这边一共有 2 个 Datanodes:

    也可以通过 Web 页面看到查看 DataNode 和 NameNode 的状态:http://192.168.3.236:50070/。如果不成功,可以通过启动日志排查原因。

    伪分布式、分布式配置切换时的注意事项
    1, 从分布式切换到伪分布式时,不要忘记修改 slaves 配置文件;
    2, 在两者之间切换时,若遇到无法正常启动的情况,可以删除所涉及节点的临时文件夹,这样虽然之前的数据会被删掉,但能保证集群正确启动。所以如果集群以前能启动,但后来启动不了,特别是 DataNode >无法启动,不妨试着删除所有节点(包括 Slave 节点)上的 >/usr/local/hadoop/tmp 文件夹,再重新执行一次 hdfs namenode >-format,再次启动试试。

    执行分布式实例

    执行分布式实例过程与伪分布式模式一样,首先创建 HDFS 上的用户目录:

    hdfs dfs -mkdir -p /user/hadoop
    

    将 /usr/local/hadoop/etc/hadoop 中的配置文件作为输入文件复制到分布式文件系统中:

    hdfs dfs -mkdir input
    hdfs dfs -put /usr/local/hadoop/etc/hadoop/*.xml input
    

    通过查看 DataNode 的状态(占用大小有改变),输入文件确实复制到了 DataNode 中,如下图所示:

    接着就可以运行 MapReduce 作业了:

    hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grep input output 'dfs[a-z.]+'
    

    执行完毕后的输出结果:

    hdfs dfs -cat output/*
    

    如图所示:

    查看相关命令

    hdfs dfs
    

    自此,你就掌握了 Hadoop 的集群搭建与基本使用了。

    以上内容主要拷贝自 http://dblab.xmu.edu.cn/blog/install-hadoop/ 感谢原作者

  • 相关阅读:
    spring前两天
    代理模式
    学习spring第三天
    Spring集成MyBatis配置文件
    学习spring第二天
    学习spring第一天
    Bind关闭递归查询
    织梦DedeCMS v5.7 实现导航条下拉菜单
    Debian下修改系统时间的方式
    js禁止页面复制功能禁用页面右键菜单示例代码
  • 原文地址:https://www.cnblogs.com/freebird92/p/8849342.html
Copyright © 2020-2023  润新知