1 Hadoop介绍

1.1 Hadoop产生背景

Hadoop最早起源于Nutch。Nutch的设计目标是构建一个大型的全网搜索引擎,包括网页抓取、索引、查询等功能,但随着抓取网页数量的增加,遇到了严重的可扩展性问题——如何解决数十亿网页的存储和索引问题。

2003年、2004年谷歌发表的两篇论文为该问题提供了可行的解决方案。

  • (1)分布式文件系统(GFS),可用于处理海量网页的存储
  • (2)分布式计算框架MapReduce,可用于处理海量网页的索引计算问题。

Nutch的开发人员完成了相应的开源实现HDFS和MapReduce,并从Nutch中剥离成为独立项目Hadoop,到2008年1月,Hadoop成为Apache顶级项目,迎来了它的快速发展期。

1.2 Hadoop简介

Hadoop是Apache旗下的一套开源软件平台,Hadoop是利用服务器集群对数据进行存储,根据用户的自定义业务逻辑,对海量数据进行分布式计算。广义上来说,Hadoop通常是指一个更广泛的概念——Hadoop生态圈。

Hadoop解决了海量数据的存储(HDFS)、海量数据的技术(MapReduce)、资源调度(YARN)等问题。其中重点组件包括:

  • (1)HDFS:分布式文件系统;
  • (2)MapReduce:分布式运算程序开发框架;
  • (3)YARN:资源调度系统。
  • (4)ZOOKEEPER:分布式协调服务基础组件;
  • (5)HIVE:SQL数据仓库工具;
  • (6)HBASE:基于Hadoop的分布式海量数据库;
  • (7)Sqoop:数据迁移工具;
  • (8)Flume:日志数据采集框架;

1.3 Hadoop架构

1.3.1 分布式架构简介

(1)单机的问题

  • 存储能力有限;
  • 计算能力有限;
  • 有单点故障等。

(2)分布式架构解决了单机的问题

(3)经典分布式主从架构(Master-Slave)

(4)Master负责管理,且可以有多个,防止单点故障的发生。Slave负责干活,Slave有多个,并且可以动态的添加或移除。




hadoop集群里面的复制命令并重新命名 hadoop文件重命名命令_Hadoop


1.3.2 Hadoop2.0

  • (1)HDFS :NameNode(老大) DataNode(小弟)
  • (2)YARN :ResourceManager(老大) NodeManager(小组长)


hadoop集群里面的复制命令并重新命名 hadoop文件重命名命令_Hadoop_02


1.3.3 伪分布式架构

  • (1)NameNode:HDFS的管理节点,负责DataNode的管理和元数据管理;
  • (2)SecondaryNameNode:NameNode的一个助理,帮助NameNode管理元数据,防止元数据丢失;
  • (3)DataNode:负责数据存储;
  • (4)ResourceManager:YARN的管理节点,负责NodeManager的管理、任务调度等;
  • (5)NodeManager:YARN的节点管理器,负责向ResourceManager汇报当前节点的状态和启动计算任务进程(YarnChild)并监控YarnChild。


hadoop集群里面的复制命令并重新命名 hadoop文件重命名命令_hadoop重命名文件_03


2 实验过程

2.1 ubuntu16.04安装Hadoop伪分布式

2.1.1 实验环境

  • (1)操作系统:Ubuntu16.04
  • (2)Java环境:jdk1.8.0_181
  • (3)Hadoop版本:hadoop-2.7.6

2.1.2 SSH免密码登录

  • (1)输入:sudo apt-get install openssh-server,安装SSH server;
  • (2)输入:cd ~/.ssh/,如果没法进入该目录,执行一次ssh localhost;
  • (3)输入:ssh-keygen -t rsa,三次回车后,该目录下将会产生id_rsa,id_rsa.pub文件;
  • (4)输入:cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys加入授权;
  • (5)输入:ssh localhost,如果不提示输入密码则SSH无密登陆配置成功;

2.1.3 配置java1.8.0_181

(1)https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html下载jdk-8u181-linux-x64.tar.gz,输入:sudo tar zxvf jdk-8u201-linux-x64.tar.gz -C /usr/java/jdk1.8.0_181,将jdk-8u181-linux-x64.tar.gz解压到/usr/java/目录下;

(2)输入:sudo vim ~/.bashrc 配置环境变量,在最后添加三行:


export JAVA_HOME=/usr/java/jdk1.8.0_181
export CLASSPATH=.:$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin


(3)输入:source ~/.bashrc,使新配置的环境变量生效;

(4)输入:java -version,查看Java版本,检测是否安装成功;

2.1.4 配置hadoop-2.7.6

(1)在https://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/下载hadoop-2.7.6.tar.gz,输入:sudo tar zxvf hadoop-2.7.6.tar.gz -C /usr/local/hadoop-2.7.6将hadoop-2.7.6.tar.gz解压到/usr/local/目录下;

(2)输入:sudo vim ~/.bashrc添加如下两行,然后输入source ~./bashrc;


export HADOOP_HOME=/usr/local/hadoop-2.7.6
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin


(3)输入:usr/local/hadoop-2.7.6/bin/hadoop查看hadoop命令相关使用信息;

(4)输入:hadoop version查看版本。

2.1.5 伪分布式配置

Hadoop 可以在单节点上以伪分布式的方式运行,Hadoop 进程以分离的 Java 进程来运行,节点既作为 NameNode 也作为 DataNode,同时,读取的是 HDFS 中的文件。Hadoop 的配置文件位于 /usr/local/hadoop-2.7.6/etc/hadoop/ 中,伪分布式需要修改2个配置文件 cor(1)JAVA_HOME位于/usr/java/jdk1.8.0_181,Hadoop在/usr/local/hadoop-2.7.6。输入:sudo vim /usr/local/hadoop-2.7.6/etc/hadoop/hadoop-env.sh添加两行参数:e-site.xml 和 hdfs-site.xml 。Hadoop的配置文件是 xml 格式,每个配置以声明 property 的 name 和 value 的方式来实现。此处我们另外修改了配置文件。


export JAVA_HOME=/usr/java/jdk1.8.0_181
export HADOOP_PREFIX=/usr/local/hadoop-2.7.6


(2)输入:sudo vim /usr/local/hadoop-2.7.6/etc/hadoop/core-site.xml修改core-site.xml文件添加如下内容:


<configuration>
 <!-- 配置Hadoop运行时产生数据的存储目录,不是临时的数据 -->
        <property>
             <name>hadoop.tmp.dir</name>
             <value>file:/usr/local/hadoop-2.7.6/tmp</value>
             <description>Abase for other temporary directories.</description>
        </property>
        <!-- 配置hdfs的Namenode(老大)的地址 -->
        <property>
             <name>fs.defaultFS</name>
             <value>hdfs://localhost:9000</value>
        </property>
</configuration>


(3)输入:sudo vim /usr/local/hadoop-2.7.6/etc/hadoop/hdfs-site.xml修改配置文件hdfs-site.xml添加如下内容:


<configuration>
        <!-- 指定HDFS存储数据的副本数量 -->
        <property>
             <name>dfs.replication</name>
             <value>1</value>
        </property>
        <property>
             <name>dfs.namenode.name.dir</name>
             <value>file:/usr/local/hadoop-2.7.6/tmp/dfs/name</value>
        </property>
        <property>
             <name>dfs.datanode.data.dir</name>
             <value>file:/usr/local/hadoop-2.7.6/tmp/dfs/data</value>
        </property>
</configuration>


(4)将mapred-site.xml.template重命名为mapred-site.xml,

输入:sudo mv mapred-site.xml.template mapred-site.xml

然后输入:sudo vim /usr/local/hadoop-2.7.6/etc/hadoop/mapred-site.xml,修改配置文件mapred-site.xml添加如下内容:


<configuration>
  <!-- 指定Mapreduce编程模型运行在yarn上  -->
  <property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
  </property>
</configuration>


(5)输入:sudo vim /usr/local/hadoop-2.7.6/etc/hadoop/yarn-site.xml修改配置文件yarn-site.xml添加如下内容:


<configuration>
  <!-- 指定yarn的老大(ResourceManager的地址) -->
  <property>
    <name>yarn.resourcemanager.hostname</name>
    <value>yancy</value>
  </property>
 
  <!-- mapreduce执行shuffle时获取数据的方式 -->
  <property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
  </property>
</configuration>


2.1.6 运行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,否则在接下来的步骤中可能会出错。

在Hadoop安装包目录下有几个比较重要的目录:

  • 1)sbin:启动或停止Hadoop相关服务的脚本;
  • 2)bin:对Hadoop相关服务(HDFS,YARN)进行操作的脚本;
  • 3)etc:Hadoop的配置文件目录;
  • 4)share:Hadoop的依赖jar包和文档,文档可以被删掉;
  • 5)lib:Hadoop的本地库(对数据进行压缩解压缩功能的)。
  • (1)输入:/usr/local/hadoop-2.7.6/bin/hdfs namenode -format执行 NameNode 的格式化;
  • (2)输入:/usr/local/hadoop-2.7.6/sbin/start-dfs.sh启动NameNode和DataNode进程,并查看启动结果;
  • (3)输入:/usr/local/hadoop-2.7.6/sbin/start-yarn.sh启动ResourceManager和NodeManager;
  • (4)输入:jps,判断是否成功启动,若成功启动则会列出如下进程: “NameNode”、”DataNode”、“SecondaryNameNode”、“ResourceManager”和NodeManager;
  • (5)访问HDFS的管理界面:在浏览器访问http://localhost:50070 查看 NameNode 和 DataNode的相关信息,还可以在线查看 HDFS 中的文件;
  • (6)访问YARN的管理界面:在浏览器访问http://localhost:8088查看Cluster相关信息。

2.1.7 WordCount词频统计

下面为一些HDFS常用命令:


hadoop fs -mkdir /tmp/input 在HDFS上目录/tmp/input;
hadoop fs -put input1.txt /tmp/input 把本地input1.txt传到HDFS的/tmp/input目录下;
hadoop fs -get input1.txt /tmp/input/input1.txt 把HDFS文件拉到本地;
hadoop fs -ls /tmp/output 列出HDFS的目录/tmp/output;
hadoop fs -cat /tmp/ouput/output1.txt 查看HDFS上文件/tmp/ouput/output1.txt;
hadoop fs -rmr /tmp/intput 删除HDFS上的目录/tmp/intput;
hadoop dfsadmin -report 查看HDFS状态,比如每个DataNode的情况;
hadoop dfsadmin -safemode leave 离开安全模式;
hadoop dfsadmin -safemode enter 进入安全模式。


WordCount词频统计如下步骤:

  • (1)输入:start-all.sh,启动HDFS;
  • (2) 输入:hadoop dfs -ls /,查看HDFS下面包含的文件目录,第一次运行hdfs什么文件都没有;
  • (3)输入:hdfs dfs -mkdir /input_wordcount,在HDFS中创建一个文件目录input_wordcount;
  • (4)输入:hadoop fs -put /usr/local/hadoop-2.7.6/README.txt /input_wordcount,将/usr/local/hadoop-2.7.6/README.txt上传至input_wordcount中;
  • (5)输入:hadoop dfs -ls /input_wordcount查看就发现多了个_wordcount目录;
  • (6)执行如下命令运行wordcount 并将结果输到output_wordcount:hadoop jar /usr/local/hadoop-2.7.6/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.6.jar wordcount /input_wordcount /output_wordcount;
  • (7)执行成功后output_wordcount 目录下会生成两个文件:一个是_SUCCESS 成功标志的文件,里面没有内容,另一个是 part-r-00000 ,通过以下命令查看执行的结果:hadoop fs -cat /output_wordcount/part-r-00000。


hadoop集群里面的复制命令并重新命名 hadoop文件重命名命令_hadoop重命名文件_04


Reference