Hadoop 安装

Posted moon__light

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hadoop 安装相关的知识,希望对你有一定的参考价值。

1. 创建 hadoop 用户
    (1) 添加新用户
        sudo useradd -m hadoop -s /bin/bash
    (2) 设置密码
        sudo passwd hadoop
    (3) 增加管理员权限
        sudo adduser hadoop sudo
    (4) 登录账户
        su - hadoop
    (5) 更新
        sudo apt-get update
    (6) 安装 SSH、配置 SSH 无密码登陆
        - Ubuntu 默认已安装了 SSH client,需要安装 SSH server
            sudo apt-get install openssh-server
        - 在 hadoop 用户下,尝试用 ssh 登录本机,需要密码
            ssh localhost
        - 退出登录,生成密钥并加入到授权
            cd ~/.ssh/              # 若没有该目录,请先执行一次 ssh localhost
            ssh-keygen -t rsa       # 会有提示,都按回车就可以
            cat ./id_rsa.pub >> ./authorized_keys       # 加入授权
        - 再用 ssh localhost 登录,无需密码就可以登录了

2. 安装 Java (OpenJDK)
    (1) Hadoop 2.7.3 要求 Java 7,可以使用 OpenJDK 或 Oracle JDK/JRE
        https://wiki.apache.org/hadoop/HadoopJavaVersions
    (2) OpenJDK 1.7 (Ubuntu 14)
        sudo apt-get install openjdk-7-jre openjdk-7-jdk
    (3) OpenJDK 1.7 (Ubuntu 16.04 的安装源已经默认没有 openjdk7)
        sudo add-apt-repository ppa:openjdk-r/ppa
        sudo apt-get update
        sudo apt-get install openjdk-7-jdk  (下载慢,可以换国内的源)
    (4) 设置 Java
        dpkg -L openjdk-7-jdk | grep ‘/bin/javac‘    ## JDK 路径
        vim ~/.bashrc                                ## 添加 export JAVA_HOME=JDK路径
        source ~/.bashrc
        echo $JAVA_HOME
        java -version
        $JAVA_HOME/bin/java -version

3. 安装 Hadoop 2.7.3
    (1) 下载
        http://mirror.bit.edu.cn/apache/hadoop/common/ 或者 
        http://mirrors.cnnic.cn/apache/hadoop/common/
        选择 stable 目录下的,一般有两个,一个是源代码,一个是编译好的,下载编译好
    
    (2) 安装
        sudo tar -zxf hadoop-2.7.3.tar.gz -C /usr/local
        cd /usr/local/
        sudo mv ./hadoop-2.7.3/ ./hadoop
        sudo chown -R hadoop ./hadoop
        cd /usr/local/hadoop
        ./bin/hadoop version
        
    (3) 在 ~/.bashrc 配置 PATH
        PATH=$PATH:/usr/local/hadoop/bin:/usr/local/hadoop/sbin

4. Hadoop 单机配置(非分布式)
    (1) Hadoop 默认模式为非分布式模式,无需进行其他配置即可运行
    
    (2) 单机模式下使用的是本地文件系统,而不是 HDFS 文件系统 (hadoop fs 命令可用,但读写的是本地文件系统)
    
    (3) 运行 Hadoop 附带的例子
    
        cd /usr/local/hadoop
        
        # 列出所有例子
        ./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar
        
        # 运行 wordcount 例子,统计 NOTICE.txt,结果写到 output 文件
        ./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar                          wordcount ./NOTICE.txt ./output
        
        ll output       # output 目录包括 part-r-00000 .part-r-00000.crc _SUCCESS ._SUCCESS.crc 四个文件
        cat output/*    # 可看到统计结果
        rm -r ./output  # Hadoop 默认不会覆盖结果文件,因此再次运行会出错,需要先将 ./output 删除

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

    (2) Hadoop 的配置文件位于 /usr/local/hadoop/etc/hadoop/ 中,/usr/local/hadoop 是安装路径
        伪分布式需要修改2个配置文件 core-site.xml 和 hdfs-site.xml
        
        core-site.xml
            hadoop.tmp.dir      临时文件夹,
                                指定后需将使用到的所有子级文件夹都要手动创建出来,否则无法正常启动服务,
                                要确保该地址是永久性的,不会因重启被清除
            fs.defaultFS        HDFS 文件系统的地址和端口号,就是 NameNode
        =============
        <configuration>
                <property>
                     <name>hadoop.tmp.dir</name>
                     <value>file:/usr/local/hadoop/tmp</value>
                     <description>A base for other temporary directories</description>
                </property>
                <property>
                     <name>fs.defaultFS</name>
                     <value>hdfs://localhost:9000</value>
                     <description>URI of HDFS NameNode</description>
                </property>
        </configuration>
        
        hdfs-site.xml
            dfs.replication         冗余数,默认 3,HDFS 将冗余存在不同节点上,单机版设为 1
            dfs.namenode.name.dir   存放 namenode 的 name table(元数据),
                                    以逗号分隔可以配多个路径,表示多个备份
            dfs.datanode.data.dir   存放 datanode 的 数据块(数据块的默认最大值是 64M),
                                    以逗号分隔可以配多个路径,表示数据块可以存放在多个路径下
        =============
        <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>        
        
    (3) 如果需要从伪分布式模式切换回非分布式模式,需要删除 core-site.xml 中的配置项

    (4) 执行 NameNode 的格式化
        cd /usr/local/hadoop
        ./bin/hdfs namenode -format
        
        成功的话看到有
        Storage directory /usr/local/hadoop/tmp/dfs/name has been successfully formatted
        Exitting with status 0
    
    (5) 开启 NameNode 和 DataNode 守护进程
        cd /usr/local/hadoop
        ./sbin/start-dfs.sh
        
        - 若出现 SSH 提示,输入 yes 即可
        
        - 可能会出现 
                     WARN util.NativeCodeLoader:                      Unable to load native-hadoop library for your platform…                      using builtin-java classes where applicable。
          该 WARN 提示可以忽略
        
        - 如果出现 Could not resolve hostname,在 ./bashrc 配置 
            export HADOOP_HOME=/usr/local/hadoop
            export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
          然后重新启动
    
    (6) jps 来判断是否成功启动,若成功启动则会列出如下进程:NameNode,DataNode,SecondaryNameNode
    
    (7) 成功启动后,可以访问 Web 界面查看 NameNode 和 Datanode 信息,还可以在线查看 HDFS 中的文件
        http://localhost:50070 
    
    (8) 运行 Hadoop 附带的例子
        hdfs dfs -mkdir -p /user/hadoop
        hdfs dfs -mkdir input               ## hadoop 用户下,并且已创建用户目录 /user/hadoop,
                                            ## 因此可以使用相对路径 input,绝对路径是 /user/hadoop/input
                                                            
        hadoop fs -put /usr/local/hadoop/NOTICE.txt input   ## hadoop fs 等于 hdfs dfs
        
        # 列出所有例子
        hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar
        
        # 运行 wordcount 例子,统计 NOTICE.txt,结果写到 output
        hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar                     wordcount input/NOTICE.txt output
        
        hadoop fs -cat output/*
        hadoop fs -get output ./output
        cat ./output/*
        rm -rf ./output
        hadoop fs -rm -r output
    
    (9) 若要关闭 Hadoop,则运行
        stop-dfs.sh
        下次启动 hadoop 时,无需进行 NameNode 的初始化,只需要运行 start-dfs.sh 就可以

6. 启动 YARN
    (1) 不启用 YARN 也可以运行,YARN (也叫 MapReduce V2)
        YARN 负责资源管理与任务调度,为集群在利用率、资源管理、可伸缩性、可靠性等方面带来了巨大好处
        
    (2) 过配置文件 mapred-site.xml,yarn-site.xml 和命令 start-yarn.sh 启动 YARN
    
    (3) mv /usr/local/hadoop/etc/hadoop/mapred-site.xml.template            /usr/local/hadoop/etc/hadoop/mapred-site.xml
        ===============
        <configuration>
                <property>
                     <name>mapreduce.framework.name</name>
                     <value>yarn</value>
                </property>
        </configuration>
    
        /usr/local/hadoop/etc/hadoop/yarn-site.xml
            yarn.nodemanager.aux-services: NodeManager 上运行的附属服务
            yarn.log-aggregation-enable: 聚合日志(yarn logs -applicationId)
            yarn.nodemanager.remote-app-log-dir: 日志上传目录
            yarn.nodemanager.remote-app-log-dir-suffix: 结合日志上传目录日志被存在 /tmp/logs/${user}/logs
            mapreduce.jobhistory.max-age-ms: /user/history/done 下日志的保存时间
            yarn.log-aggregation.retain-seconds: /tmp/logs/${user}/logs 下日志的保存时间
            yarn.log-aggregation.retain-check-interval-seconds: 多长时间检查一次日志,并将满足条件的删除
        ===============
        <configuration>
                <property>
                     <name>yarn.nodemanager.aux-services</name>
                     <value>mapreduce_shuffle</value>
                </property>
                
                <property>
                    <name>yarn.log-aggregation-enable</name>
                    <value>true</value>
                </property>

                <property>
                    <name>yarn.nodemanager.remote-app-log-dir</name>
                    <value>/tmp/logs</value>
                </property>

                <property>
                    <name>yarn.nodemanager.remote-app-log-dir-suffix</name>
                    <value>logs</value>
                </property>

                <property>
                    <name>mapreduce.jobhistory.max-age-ms</name>
                    <value>604800000</value>
                </property>

                <property>
                    <name>yarn.log-aggregation.retain-seconds</name>
                    <value>86400</value>
                </property>

                <property>
                    <name>yarn.log-aggregation.retain-check-interval-seconds</name>
                    <value>21600</value>
                </property>
        </configuration>

        # 正常来说添加了 JAVA_HOME 环境变量就可以提交 Job,但有时需要加到配置文件才行
        /usr/local/hadoop/etc/hadoop/hadoop-env.sh
                export JAVA_HOME=JDK路径

    (4) 启动 YARN
        start-dfs.sh
        start-yarn.sh
        mr-jobhistory-daemon.sh start historyserver     # 开启历史服务器,才能在 Web 中查看任务运行情况
        
    (5) jps 查看,可以看到多了 NodeManager,ResourceManager 和 JobHistoryServer
    
    (6) 启动 YARN 后可以通过 Web 界面查看任务的运行情况
        http://localhost:8088/cluster
    
    (7) 运行 Hadoop 附带的例子
        hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar                    wordcount input/NOTICE.txt output
        hadoop fs -cat output/*
        上 Web 界面查看任务的运行情况
        伪分布式模式下,使用 YARN 反而更慢
        
    (8) 关闭 YARN
        stop-yarn.sh
        mr-jobhistory-daemon.sh stop historyserver

    (9) 如果不想启动 YARN,务必把配置文件 mapred-site.xml 重命名,改成 mapred-site.xml.template
        否则在该配置文件存在,而未开启 YARN 的情况下,
        运行程序会提示 Retrying connect to server: 0.0.0.0/0.0.0.0:8032 的错误
        这也是为何该配置文件初始文件名为 mapred-site.xml.template
        
7. 集群配置 
    (1) 将上面配置好的虚拟机作为 Master
    (2) 关闭 Master 的 Hadoop
            mr-jobhistory-daemon.sh stop historyserver
            stop-yarn.sh
            stop-dfs.sh
    (3) 安装新的虚拟机作为 Slave
    (4) 在 Slave 节点上配置 hadoop 用户、安装 SSH server、配置无密码登录、安装 Java 环境
    
    (5) 网络配置
        a.  将虚拟机(VirtualBox)的网络连接方式改为桥接 (Bridge) 模式,配置好后要验证网络连接正常
            Settings -> Network -> Adapter 1: 
                Attached to 选 Bridged Adapter,Advanced -> MAC Address 确保各节点地址不同
        b.  修改各节点的主机名
            sudo vim /etc/hostname      ## 改为 Master 和 Slave1
        c.  修改各节点的 IP 映射
            ifconfig -a                 ## 查看各节点的 IP
            sudo vim /etc/hosts         ## 添加以下内容
                192.168.1.107   Master
                192.168.1.106   Slave1
        d.  重启
        e.  确保主机名修改成功,并且能 ping 通对方
                ping Master -c 3        ## 只 ping 3次,否则要按 Ctrl+C 中断
                ping Slave1 -c 3
        f.  配置 SSH 无密码登录,让 Master 节点可以无密码 SSH 登陆到各个 Slave 节点上
                Master 中执行
                    cd ~/.ssh                                           # 如没该目录,先执行 ssh localhost
                    rm ./id_rsa*                                        # 删除之前生成的公匙
                    ssh-keygen -t rsa                                   # 一直按回车就可以
                    cat ./id_rsa.pub >> ./authorized_keys               # 无密码 SSH 本机
                    ssh Master 验证一下不需要密码                       # 第一次需要输入 Yes
                    scp ~/.ssh/id_rsa.pub hadoop@Slave1:/home/hadoop/   # 将公匙传输到 Slave 节点
                Slave 中执行
                    cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
                    rm ~/id_rsa.pub
                在 Master 节点上验证可无密码 SSH 到各个 Slave 节点
                    ssh Slave1
    
    (6) 配置集群/分布式环境
        a.  在 Master 上修改 5 个配置文件: 
            slaves、core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml
        
            http://hadoop.apache.org/docs/stable/       ## 左边栏有各种文档,和各个配置文件的说明
            
            /usr/local/hadoop/etc/hadoop/slaves
                将作为 DataNode 的主机名写入该文件,每行一个
                默认为 localhost,所以在伪分布式配置时,节点即作为 NameNode 也作为 DataNode
                分布式配置可以保留 localhost,也可以删掉,让 Master 节点仅作为 NameNode 使用
                这里仅作为 NameNode 使用,因此将文件中原来的 localhost 删除,添加内容:Slave1
    
            /usr/local/hadoop/etc/hadoop/core-site.xml
                ===============
                <configuration>
                        <property>
                                <name>fs.defaultFS</name>
                                <value>hdfs://Master:9000</value>
                        </property>
                        <property>
                                <name>hadoop.tmp.dir</name>
                                <value>file:/usr/local/hadoop/tmp</value>
                                <description>Abase for other temporary directories.</description>
                        </property>
                </configuration>
    
            /usr/local/hadoop/etc/hadoop/hdfs-site.xml
                <configuration>
                        <property>
                                <name>dfs.namenode.secondary.http-address</name>
                                <value>Master: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>

            /usr/local/hadoop/etc/hadoop/mapred-site.xml
                <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>
            
            /usr/local/hadoop/etc/hadoop/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>
                        <property>
                                <name>yarn.log-aggregation-enable</name>
                                <value>true</value>
                        </property>
                        <property>
                                <name>yarn.nodemanager.remote-app-log-dir</name>
                                <value>/tmp/logs</value>
                        </property>
                        <property>
                                <name>yarn.nodemanager.remote-app-log-dir-suffix</name>
                                <value>logs</value>
                        </property>
                        <property>
                                <name>mapreduce.jobhistory.max-age-ms</name>
                                <value>604800000</value>
                        </property>
                        <property>
                                <name>yarn.log-aggregation.retain-seconds</name>
                                <value>86400</value>
                        </property>
                        <property>
                                <name>yarn.log-aggregation.retain-check-interval-seconds</name>
                                <value>21600</value>
                        </property>
                </configuration>
    
        b.  将 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
                在 Slave 执行
                    sudo tar -zxf ~/hadoop.master.tar.gz -C /usr/local
                    sudo chown -R hadoop /usr/local/hadoop
                    在 ~/.bashrc 配置PATH
                        PATH=$PATH:/usr/local/hadoop/bin:/usr/local/hadoop/sbin
                    source ~/.bashrc
        
        c.  启动
                在 Master 上执行
                    hdfs namenode -format 
                    start-dfs.sh
                    start-yarn.sh
                    mr-jobhistory-daemon.sh start historyserver
                
                通过命令 jps 
                在 Master 上可以看到 
                    NameNode、ResourceManager、SecondrryNameNode、JobHistoryServer 进程
                在 Slave 上可以看到
                    DataNode 和 NodeManager 进程
                缺少任一进程都表示出错
                             
                在 Master 节点上通过命令 hdfs dfsadmin -report 查看 DataNode 是否正常启动,
                如果 Live datanodes 不为 0 ,则说明集群启动成功
    
        d.  通过 Web 页面看到查看 DataNode 和 NameNode 的状态
                http://master:50070/
    
    (7) 运行 Hadoop 附带的例子 (在哪个节点执行都可以)
    
        hdfs dfs -mkdir -p /user/hadoop
        hdfs dfs -mkdir input
        hdfs dfs -put /usr/local/hadoop/NOTICE.txt input
        
        # 列出所有例子
        hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar   
        
        # 运行 wordcount 例子,统计 NOTICE.txt,结果写到 output
        hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar                    wordcount input/NOTICE.txt output  
        
        hdfs dfs -cat output/*
        hdfs dfs -get output ./output
        cat ./output/*
        rm -rf ./output
        hdfs dfs -rm -r output
    
        可以通过 Web 界面查看任务进度 
            http://master:8088/cluster
    
    (8) 关闭 Hadoop 集群也是在 Master 节点上执行的
        stop-yarn.sh
        stop-dfs.sh
        mr-jobhistory-daemon.sh stop historyserver
        
    (9) 此外,同伪分布式一样,也可以不启动 YARN,但要记得改掉 mapred-site.xml 的文件名


以上是关于Hadoop 安装的主要内容,如果未能解决你的问题,请参考以下文章

PHP代码-psysh调试代码片段工具

VIM 代码片段插件 ultisnips 使用教程

Apache Hadoop与Gora的组合功能

如何从开源 Hadoop 构建 deb/rpm 存储库或由 ambari 安装的公开可用的 HDP 源代码

hadoop的mapreduce常见算法案例有几种

Android 插件化VirtualApp 源码分析 ( 目前的 API 现状 | 安装应用源码分析 | 安装按钮执行的操作 | 返回到 HomeActivity 执行的操作 )(代码片段