分布式处理框架Hadoop的安装与使用

491 阅读5分钟

Hadoop简介

Hadoop是一个由Apache基金会所开发的分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。

充分利用集群的威力进行高速运算和存储。Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称

HDFS。HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上;而且它提供高吞吐量(high throughput)

来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了(relax)POSIX的要求,可以以

流的形式访问(streaming access)文件系统中的数据。Hadoop的框架最核心的设计就是:HDFS和MapReduce。HDFS为海

量的数据提供了存储,而MapReduce则为海量的数据提供了计算  。

环境:

CentOS7。

安装指南:《VMware安装Centos7并联网使用

一、新建hadoop用户

1、以root用户登录虚拟机,创建用户hadoop

$ useradd -m hadoop -s /bin/bash   # 创建新用户hadoop
$ passwd hadoop   #设置密码

 

2、为hadoop用户添加管理员权限

$ visudo

出现以下内容

按下键盘上的esc键,输入“:98”(先输入冒号,再输入98),便于快速定位到98行。按下键盘上的i,进入插入模式。

添加如下内容,空格就是一个tab键。

 最后按下esc键,输入“:wq”(先输入冒号,再输入wq),意为保存并退出。

执行exit,退出root状态,重新以hadoop用户登录。

二、安装SSH、配置SSH无密码登录

SSH 是较可靠,专为远程登录会话和其他网络服务提供安全性的协议。使用SSH,还有一个额外的好处就是传输的数据是经过压

缩的,所以可以加快传输的速度。

一般情况下,CentOS已经默认帮你安装好了ssh-clients、ssh-server,不需要再额外进行安装。

可以使用shell命令,查看你本机的ssh安装情况。

$ rpm -qa | grep ssh

 如果结果如下,包含了ssh-clients、ssh-server,说明已经安装好了,不需要额外安装。

 如果未安装,可以通过yum进行安装:

$ sudo yum install openssh-clients
$ sudo yum install openssh-server

执行命令,查看ssh是否可用:

$ ssh localhost

首次登录会有提示:

输入yes,按照提示输入密码,就可以登录到本机。但是这样连接每次都需要输入密码。配置成无密码登录比较方便。

利用ssh-keygen生成密钥,并将密钥添加到授权信息中。

cd ~/.ssh/                     # 若没有该目录,请先执行一次ssh localhost
ssh-keygen -t rsa              # 会有提示,都按回车就可以
cat id_rsa.pub >> authorized_keys  # 加入授权
chmod 600 ./authorized_keys    # 修改文件权限

 需要键入内容地方直接回车。

我们再次使用ssh localhost,就可以直接登录了。

三、安装java环境

下载jdk-8u51-linux-x64.tar.gz压缩包到/home/hadoop/download文件夹,并解压缩到/usr/lib/jvm文件夹

$ tar -zxf ~/download/jdk-8u51-linux-x64.tar.gz -C /usr/lib/jvm

编辑环境变量:

$ vi ~/.bashrc

添加JAVA_HOME:

export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_51
export PATH=$JAVA_HOME/bin

让环境变量生效:

$ source ~/.bashrc

查看java版本:

$ java -version

 

检验环境变量是否正确:

$ echo $JAVA_HOME     # 检验变量值
$ java -version
$ $JAVA_HOME/bin/java -version  # 与直接执行 java -version 一样

 

 四、安装Hadoop2

镜像仓库:

mirrors.cnnic.cn/apache/hado…

mirror.bit.edu.cn/apache/hado…

下载“*.tar.gz”,-src文件是Hadoop的源码。

将下载的tar.gz文件放到/usr/hadoop/download下。

执行命令解压修改hadoop文件:

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

查看hadoop版本信息:

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

五、Hadoop单机配置(非分布式)

Hadoop 默认模式为非分布式模式,无需进行其他配置即可运行。非分布式即单 Java 进程,方便进行调试。

现在我们可以执行例子来感受下 Hadoop 的运行。Hadoop 附带了丰富的例子(运行 /usr/local/hadoop/bin/hadoop jar

/usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.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-2.7.7.jar grep ./input ./output 'dfs[a-z.]+'
$ cat ./output/*          # 查看运行结果

 

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

删除输出文件:

$ rm -r ./output

六、Hadoop伪分布式配置

Hadoop 可以在单节点上以伪分布式的方式运行,Hadoop 进程以分离的 Java 进程来运行,节点既作为 NameNode 也作为

DataNode,同时,读取的是 HDFS 中的文件。

在设置 Hadoop 伪分布式配置前,我们还需要设置 HADOOP 环境变量,执行如下命令在 ~/.bashrc 中设置:

$ vi ~/.bashrc

在文件最后面增加如下内容:

# Hadoop Environment Variables
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

使文件生效:

$ source ~/.bashrc

Hadoop 的配置文件位于 /usr/local/hadoop/etc/hadoop/中,伪分布式需要修改2个配置文件 core-site.xml 和 hdfs-

site.xml 。

Hadoop的配置文件是 xml 格式,每个配置以声明 property 的 name 和 value 的方式来实现。

修改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>

修改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>

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

$ /usr/local/hadoop/bin/hdfs namenode -format

成功则会显示successfully formatted与Exiting with status 0。失败则会Exiting with status 1。

开启NameNode与DataNode守护进程:

$ /usr/local/hadoop/sbin/start-dfs.sh

 出现“Are you sure you want to continue connecting”提示时,输入yes继续执行。

启动完成后,可以通过命令JPS来判断是否成功启动,若成功启动则会列出如下进程: “NameNode”、”DataNode”和

SecondaryNameNode(如果 SecondaryNameNode 没有启动,请运行 sbin/stop-dfs.sh 关闭进程,然后再次尝试启动尝试)。

如果没有 NameNode 或 DataNode ,那就是配置不成功,请仔细检查之前步骤,或通过查看启动日志排查原因。

通过查看启动日志分析启动失败原因

有时 Hadoop 无法正确启动,如 NameNode 进程没有顺利启动,这时可以查看启动日志来排查原因,注意几点:

  • 启动时会提示形如 “localhost: starting namenode, logging to /usr/local/hadoop/logs/hadoop-hadoop-namenode-localhost.out”,其中 localhost对应你的主机名,但启动的日志信息是记录在 /usr/local/hadoop/logs/hadoop-hadoop-namenode-localhost.log 中,所以应该查看这个后缀为.log的文件;
  • 每一次的启动日志都是追加在日志文件之后,所以得拉到最后面看,看下记录的时间就知道了。
  • 一般出错的提示在最后面,也就是写着 Fatal、Error 或者 Java Exception 的地方。
  • 可以在网上搜索一下出错信息,看能否找到一些相关的解决方法。

成功启动后,可以访问 Web 界面http://localhost:50070查看 NameNode 和 Datanode 信息,还可以在线查看 HDFS 中的文件。

由于本例中未使用CentOS图形化界面,所以需要在windows浏览器上访问虚拟机中hadoop的web界面。

CentOS7中端口开放请移步《CentOS7 中开放端口》。

 七、运行Hadoop伪分布式实例

上面例子是单机模式,读取的数据是本地文件。伪分布式实例数据来源于HDFS文件系统。要使用HDFS,首先需要在HDFS中创

建用户目录。

$ /usr/local/hadoop/bin/hdfs dfs -mkdir -p /user/hadoop

将/usr/local/hadoop/etc/hadoop/下所有xml作为文件复制到hdfs的/user/hadoop/input中。

我们使用的是 hadoop 用户,并且已创建相应的用户目录 /user/hadoop ,因此在命令中就可以使用相对路径如 input,其对应

的绝对路径就是 /user/hadoop/input。

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

复制完成之后,可以通过命令查看HDFS中文件列表:

$ /usr/local/hadoop/bin/hdfs dfs -ls input

 运行MapReduce作业:

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

查看运行结果:

$ /usr/local/hadoop/bin/hdfs dfs -cat output/*

将HDFS中的文件取回到本地:

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

Hadoop在运行时,输出目录不能存在,如果存在,就会抛出org.apache.hadoop.mapred.FileAlreadyExistsException异常。

 所以在运行前,需要删除输出目录。

/usr/local/hadoop/bin/hdfs dfs -rm -r output    # 删除 output 文件夹

关闭Hadoop:

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

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

八、 启动YARN

新版的 Hadoop 使用了新的 MapReduce 框架(MapReduce V2,也称为 YARN,Yet Another Resource Negotiator)。

YARN 是从 MapReduce 中分离出来的,负责资源管理与任务调度。YARN 运行于 MapReduce 之上,提供了高可用性、高扩展

性。

伪分布式不启动 YARN 也可以,一般不会影响程序执行。

上述通过/usr/local/hadoop/sbin/start-dfs.sh启动 Hadoop,仅仅是启动了 MapReduce 环境,我们可以启动 YARN ,让

YARN 来负责资源管理与任务调度。

修改配置文件mapred-site.xml:

$ cd /usr/local/hadoop/etc/hadoop  #进入配置文件的文件夹
$ mv ./mapred-site.xml.template ./mapred-site.xml  #重命名
$ vi ./mapred-site.xml  #编辑文件

将configuration修改如下:

<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
</configuration>

修改配置文件yarn-site.xml:

$ vi ./yarn-site.xml

将configuration修改如下:

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

启动YARN

$ /usr/local/hadoop/sbin/start-yarn.sh      $ 启动YARN
$ /usr/local/hadoop/sbin/mr-jobhistory-daemon.sh start historyserver  # 开启历史服务器,才能在Web中查看任务运行情况

 通过jps查看,可以看到多了ResourceManager与NodeManager两个进程。

启动后,可通过web界面http://localhost:8088/cluster查看任务运行情况

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

$ /usr/local/hadoop/sbin/stop-yarn.sh
$ /usr/local/hadoop/sbin/mr-jobhistory-daemon.sh stop historyserver

image.gif