• 0


    一开始是要学习spark的,安装hadoop有多方面原因,一方面学习分布式知识需要对hadoop有一定的了解,毕竟hadoop如此经典,一方面spark对hadoop的hdfs、map-reduce的支持,以及spark的运行模式可以选择hadoop的yarn模式,因此觉得学习hadoop也是向分布式进军的必经之路。在开始着手学习hadoop时,安装hadoop往往会成为新手的一道门槛。查了很多网上教程,最后找到了一个靠谱教程,附上网址http://www.powerxing.com/install-hadoop/ 
     
    环境及软件

    Ubuntu操作系统 14.04.1 64位
    Hadoop 2.6.0版本
    JDK 1.7以上,采用的是1.8.0_102
    SSH
     
    步骤

    • 创建hadoop用户
    • 安装ssh,配置ssh无密码登陆
    • 安装jdk
    • 安装hadoop
    • hadoop单机(非分布式)配置
    • hadoop伪分布式配置
    • yarn启动配置
       
    环境变量

    在这里先讲一下环境变量配置的相关知识,后续会用到
     
    环境变量的配置有两种方式,一种是通过修改文件,一种是通过export命令:
    文件的配制方法可分为全局环境变量配置和单个用户配置
    export命令方式只对当前终端shell有效,适合设置一些临时变量
     
    /etc/profile,为系统每个用户设置环境变量,当用户登录时,该文件被执行一次,一般用于设置所有用户使用的全局变量
    /etc/bashrc,当bash shell被打开,该文件被读取一次,每次新打开一个终端,该文件就会被读取
    ~/.bash_profile和~/.profile只对单个用户生效,登录时执行一次
    ~/.bashrc只对单个用户生效,当登录及每次打开新的shell时,该文件被读取
     
    上面的都是针对于用户来说的,还有修改系统环境变量的方法,即修改/etc/environment
     
    source 命令会使得配置在当前shell生效,因此配置时有时无需退出终端或重启
     
    PATH环境变量,我们在linux中执行命令时,例如ls,实际上执行的是/bin/ls,系统会根据PATH这个环境变量中包含的路径逐一进行查找,直到找到匹配的程序。各个路径以冒号分割
     
    创建hadoop用户

    这一步的意义在于什么?
     
    sudo useradd -m hadoop -s /bin/bash  创建了hadoop用户,并使用/bin/bash作为shell
    sudo passwd hadoop 为hadoop用户创建密码
    sudo adduser hadoop sudo 为hadoop用户增加管理员权限,方便部署
    sudo gedit /etc/sudoers 为hadoop用户添加权限,在root ALL=(ALL:ALL) ALL下增加hadoop ALL=(ALL:ALL) ALL
     
    注销当前用户,切换到hadoop用户
     
    安装SSH、配置SSH无密码登陆

    安装ssh的意义在于什么?集群中各台机器的ssh密钥如何生成?
     
    sudo apt-get update 更新apt
    sudo apt-get install openssh-server
    ssh localhost 首次使用ssh时,会提示是否继续链接,输入yes,然后输入密码hadoop,就登录到本机了,目前每次都要输入密码
    为了免密码登录,需要用ssh-keygen生成秘钥,并将其加入到授权中:
    exit 先退出刚刚登陆的localhost
    cd ~/.ssh/ 在第一次执行ssh会生成该目录
    ssh-keygen -t rsa 全部按回车即可
    cat ./id_rsa.pub >> ./authorized_keys 加入授权
    ssh localhost,此时免密码登陆成功,exit退出
     
    这一步很重要,遇到的坑:
    (1)权限问题
    Chmod 700 .ssh
    Chmod 600 .ssh/*
     
    因为修改了id_rsa,所有的跳板机的需要重新生成
     
     
    安装Java环境

    下载java_1.8.0_102版本
    解压到/usr/local文件夹下
     
    在/etc/profile中进行如下配置:
    # java
    export JAVA_HOME=/usr/local/jdk1.8.0_102
    export JRE_HOME=/usr/local/jdk1.8.0_102/jre
    export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
    export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
     
    想要永久有效,退出登陆吧,不然source一下
    检验是否安装成功,echo $JAVA_HOME, java -version
     
    这样jdk安装好了
     
    安装Hadoop

    下载hadoop-2.6.0.tar.gz,解压到/usr/local中,得到的是hadoop-2.6.0目录,这时进入/user/local/目录下,
    sudo mv ./hadoop-2.6.0/ ./hadoop, 将文件夹重命名为hadoop
    sudo chown -R hadoop:hadoop ./hadoop 修改hadoop文件夹以及内部文件的权限
    sudo gedit /etc/profile 添加hadoop的配置
     
    # hadoop
    export HADOOP_HOME=/usr/local/hadoop
    export HADOOP_INSTALL=$HADOOP_HOME
    export HADOOP_MAPRED_HOME=$HADOOP_HOME
    export HADOOP_COMMON_HOME=$HADOOP_HOME
    export HADOOP_HDFS_HOME=$HADOOP_HOME
    export YARN_HOME=$HADOOP_HOME
    export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
    export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin
     
    上面先不用关心其他的变量,只需要关心HADOOP-HOME以及PATH的配置
     
    现在hadoop version试一下,可以看到hadoop版本号,说明安装无问题
     
    hadoop单机配置以及实验

    刚刚安装了hadoop,无需进行其他配置即可运行单机模式,单机模式即单java进程,方便进行调试
    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目录的./etc/hadoop/下有core-site.xml、hdfs-site.xml, mapred-site.xml以及yarn-site.xml,其中mapred-site.xml有些特殊,一开始并没有
    hadoop的运行是基于配置文件的,运行hadoop时会读取配置文件信息。配置十分关键
     
    先运行一个单机的实例
     
    Hadoop伪分布式配置

    Hadoop支持在单节点上以伪分布式的方式运行,hadoop进程以分离的java进行来运行,这个单节点既作为NameNode又作为DataNode,同时读取的是HDFS中的文件。
     
    需要配置core-site.xml以及hdfs-site.xml
     
    配置如下:
    core-site.xml
     
    <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>
    这里面配置了tmp的dir,默认的dir是/usr/hadoop-hadoop,这个目录有可能被系统清理掉,导致必须重新format才可以,为了避免这个,因此在这里指定一下,同样的,下面会配置namenode和datanode的dir。、
    此外这里面配置了fs.defaultFs,记住这个端口9000
     
    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>
    这里配置了dfs.replication,指定hdfs存1个副本
    配置完成后,执行namenode的格式化,
    替换成./bin/hdfs namenode -format命令
    注意打印的日志,里面有成功的信息
     
    下面插一下hdfs、namenode和datanode的概念
     
    对外部客户机而言,HDFS就像一个传统的分级文件系统。可以创建、删除、移动或重命名文件,等等。但是 HDFS 的架构是基于一组特定的节点构建的(参见图 1),这是由它自身的特点决定的。这些节点包括 NameNode(仅一个),它在 HDFS 内部提供元数据服务;DataNode,它为 HDFS 提供存储块。由于仅存在一个 NameNode,因此这是 HDFS 的一个缺点(单点失败)。
     
    存储在 HDFS 中的文件被分成块,然后将这些块复制到多个计算机中(DataNode)。这与传统的 RAID 架构大不相同。块的大小(通常为 64MB)和复制的块数量在创建文件时由客户机决定。NameNode 可以控制所有文件操作。HDFS 内部的所有通信都基于标准的 TCP/IP 协议。
    NameNode 是一个通常在 HDFS 实例中的单独机器上运行的软件。它负责管理文件系统名称空间和控制外部客户机的访问。
    DataNode 也是一个通常在 HDFS实例中的单独机器上运行的软件。Hadoop 集群包含一个 NameNode 和大量 DataNode。
     
     
    接下来,启动dfs,开启namenode和datanode守护进程
    ./sbin/start-dfs.sh
    重启成功后,通过jps来判断是否执行成功
    如果发现缺少datanode,说明datanode没有启动
    # 针对 DataNode 没法启动的解决方法
    ./sbin/stop-dfs.sh   # 关闭
    rm -r ./tmp     # 删除 tmp 文件,注意这会删除 HDFS 中原有的所有数据
    ./bin/hdfs namenode -format   # 重新格式化 NameNode
    ./sbin/start-dfs.sh  # 重启
     
    可以访问http://localhost:50070查看Namenode和Datanode的信息,还可以在线查看HDFS文件、log等
     
    接下来,运行一个伪分布式实例:
     
    这个运行结果目前在hdfs中,可以取回到本地,调用dfs -get
    rm -r ./output    # 先删除本地的 output 文件夹(如果存在)
    ./bin/hdfs dfs -get output ./output     # 将 HDFS 上的 output 文件夹拷贝到本机
    cat ./output/*
     
    将hdfs中的output删除
    /bin/hdfs dfs-rm-r output
    输出目录不能存在,为了防止覆盖结果,程序指定不能有输出目录存在,否则提示错误
     
    关闭hadoop
    ./sbin/stop-dfs.sh
     
    启动YARN

    有的读者可能会疑惑,怎么启动 Hadoop 后,见不到书上所说的 JobTracker 和 TaskTracker,这是因为新版的 Hadoop 使用了新的 MapReduce 框架(MapReduce V2,也称为 YARN,Yet Another Resource Negotiator)。
     
    YARN 是从 MapReduce 中分离出来的,负责资源管理与任务调度。YARN 运行于 MapReduce 之上,提供了高可用性、高扩展性,YARN 的更多介绍在此不展开,有兴趣的可查阅相关资料。
     
    上述通过 ./sbin/start-dfs.sh 启动 Hadoop,仅仅是启动了 MapReduce 环境,我们可以启动 YARN ,让 YARN 来负责资源管理与任务调度。
     
    首先修改配置文件 mapred-site.xml,这边需要先进行重命名:
     
    1. mv./etc/hadoop/mapred-site.xml.template ./etc/hadoop/mapred-site.xml
    Shell 命令
    然后再进行编辑,同样使用 gedit 编辑会比较方便些 gedit ./etc/hadoop/mapred-site.xml :
     
    1. <configuration>
    2. <property>
    3. <name>mapreduce.framework.name</name>
    4. <value>yarn</value>
    5. </property>
    6. </configuration>
    XML
    接着修改配置文件 yarn-site.xml:
     
    1. <configuration>
    2. <property>
    3. <name>yarn.nodemanager.aux-services</name>
    4. <value>mapreduce_shuffle</value>
    5. </property>
    6. </configuration>
    XML
    然后就可以启动 YARN 了(需要先执行过 ./sbin/start-dfs.sh):
     
    1. ./sbin/start-yarn.sh # 启动YARN
    2. ./sbin/mr-jobhistory-daemon.sh start historyserver # 开启历史服务器,才能在Web中查看任务运行情况
    Shell 命令
    开启后通过 jps 查看,可以看到多了 NodeManager 和 ResourceManager 两个后台进程,如下图所示。
     
    开启YARN
     
    启动 YARN 之后,运行实例的方法还是一样的,仅仅是资源管理方式、任务调度不同。观察日志信息可以发现,不启用 YARN 时,是 “mapred.LocalJobRunner” 在跑任务,启用 YARN 之后,是 “mapred.YARNRunner” 在跑任务。
     
    接下来继续执行之前的例子:
     
     ./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grep input output 'dfs[a-z.]+’
     
    这里有些坑(MAC OS):
     
    failed 2 times due to AM Container for appattempt_1496332588261_0008_000002 exited with  exitCode: 1
     
    这个问题的原因在于Yarn的java路径与OS的不同,检查java的硬编码路径/bin/java,如果找不到,那么yarn启动就fail了,为了解决这个问题,可以有两种方案:
    (1)把/usr/bin/java复制到/bin/java下
    (2)如果不允许复制,那么需要修改hadoop-env.sh和yarn-env.sh,里面加入export JAVA_HOME=‘你的JAVA_HOME路径’  export JAVA=‘你的JAVA_HOME路径/bin/java'
     
    Failing this attempt.Diagnostics: Exception from container-launch.
     
    如果继续报这个错,可以查相关yarn logs,看是否是class not found,如果是的话,那么要
     
    记得删掉output目录
     
    启动 YARN 有个好处是可以通过 Web 界面查看任务的运行情况:http://localhost:8088/cluster,如下图所示。
     
    开启YARN后可以查看任务运行信息
     
    但 YARN 主要是为集群提供更好的资源管理与任务调度,然而这在单机上体现不出价值,反而会使程序跑得稍慢些。因此在单机上是否开启 YARN 就看实际情况了。
     
    不启动 YARN 需重命名 mapred-site.xml
    如果不想启动 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。
     
    同样的,关闭 YARN 的脚本如下:
     
    1. ./sbin/stop-yarn.sh
    2. ./sbin/mr-jobhistory-daemon.sh stop historyserver
    Shell 命令
    自此,你已经掌握 Hadoop 的配置和基本使用了。
     
    记得各个模式的切换需要修改哪些配置文件
     
    此外,hadoop运行jar,命令为./bin/hadoop jar jar包名 类名 输入路径 输出路径 参数
    可以参考这篇文章,详解了wordcount的运行过程
     
    hadoop@guoqiaozhou-Latitude-E5450:/usr/local/hadoop$ sudo mkdir file 本地文件夹
    hadoop@guoqiaozhou-Latitude-E5450:/usr/local/hadoop$ cd file/ 进入文件夹
    hadoop@guoqiaozhou-Latitude-E5450:/usr/local/hadoop/file$ sudo touch myTest1.txt 新建文件
    hadoop@guoqiaozhou-Latitude-E5450:/usr/local/hadoop/file$ sudo touch myTest2.txt 新建文件
    修改两个文件,内容分别为:
    hadoop@guoqiaozhou-Latitude-E5450:/usr/local/hadoop/file$ cd .. 退到上一级目录
    hadoop@guoqiaozhou-Latitude-E5450:/usr/local/hadoop$ ./bin/hadoop fs -mkdir hdfsInput hdfs中新建输入目录
    hadoop@guoqiaozhou-Latitude-E5450:/usr/local/hadoop$ ./bin/hadoop fs -put file/myTest*.txt hdfsInput 拷贝到hdfs的输入目录
    hadoop@guoqiaozhou-Latitude-E5450:/usr/local/hadoop$ ./bin/hdfs dfs -ls hdfsInput  查看一下是否有文件
    hadoop@guoqiaozhou-Latitude-E5450:/usr/local/hadoop$ ./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0.jar wordcount hdfsInput hdfsOutput
    伪分布式执行wordcount,指定输入输出
    hadoop@guoqiaozhou-Latitude-E5450:/usr/local/hadoop$ ./bin/hdfs dfs -cat hdfsOutput/* 看一下结果
    hadoop@guoqiaozhou-Latitude-E5450:/usr/local/hadoop$ ./bin/hdfs dfs -rm -r hdfsOutput 删掉输出结果
     
     
     
     
  • 相关阅读:
    程序员掌握的单词汇总
    Django--基础补充
    C#入门概述
    python常用模块
    软件开发经验之谈
    p7.BTC-挖矿总结
    p6.BTC-挖矿难度
    p5.BTC-网络
    p4.BTC-实现
    p3.BTC-协议
  • 原文地址:https://www.cnblogs.com/43726581Gavin/p/9043982.html
Copyright © 2020-2023  润新知