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 删掉输出结果
 
 
 
 
原文地址:https://www.cnblogs.com/43726581Gavin/p/9043982.html