Hadoop分布式计算框架入门指南
引言
当代计算环境随着网络基础设施的快速发展,社交媒体、电子商务以及物联网的普及产生了海量数据。这些数据的规模已远超传统单机处理能力,推动了人工智能领域的显著进步。大数据的存储与分析成为技术发展的关键方向,国家相关部门也发布了相关白皮书予以指导。
学习大数据技术,Hadoop是不可绕过的基础。作为当前最具影响力的分布式数据处理框架,Hadoop提供了一套完整的编程模型和生态系统。
概念说明:大数据具有四个核心特征——Volume(容量大)、Velocity(产生速度快)、Variety(结构多样)、Value(价值密度低)。其中Volume指数据量超出单台或少数高性能服务器的处理能力;Variety指数据不仅包含结构化数据,还包括半结构化数据(如传感器日志、文本格式的监测数据)以及非结构化数据(视频、图像等)。价值密度低是大数据的普遍特点,需要通过专业处理技术从海量数据中提取有效信息。
Hadoop技术体系
Hadoop是专为大规模分布式数据处理设计的开源框架,围绕其核心功能形成了丰富的生态系统,主要包括:
- HBase:分布式NoSQL数据库
- Hive:数据仓库基础设施
- Pig:高级查询语言平台
- Spark:快速通用计算引擎
- ZooKeeper:分布式协调服务
应用场景解析
考虑一个实际场景:某研究机构需要分析过去30年的气象监测数据,数据来源于多个观测站点的文本日志文件。每个站点每0.1秒记录一条数据,单个文件记录15分钟数据(约9000条),每天96个文件,30年累计超过100万个文件,数据总量达百亿条级别。此外还需处理部分损坏文件和缺失值标记。
面对如此庞大的数据量,单机处理耗时过长。传统方案是搭建服务器集群,将任务分配到多台机器上并行处理,最终汇总结果。然而实现过程中会面临诸多挑战:任务分配策略(如何平衡新旧机器的性能差异)、结果汇总机制(网络传输中的数据可靠性保障)、故障恢复策略(节点宕机后的任务重分配)。这些非功能性需求的开发往往比核心业务逻辑更为复杂。
Hadoop正是为解决这类问题而设计的。开发者只需在map方法中定义数据处理逻辑,在reduce方法中定义结果聚合逻辑,其余工作由框架自动完成。这使得分布式计算的开发门槛大幅降低。
实际上,上述数据规模在某些场景下仍属中等。若每日产生TB级数据,即使采用高速固态硬盘,完整扫描也需要数小时。更理想的方案是将数据分散存储在由普通计算机组成的集群中,每个节点负责处理部分数据,最后汇总结果。Hadoop正是实现这一方案的最佳选择。
核心组件架构
Hadoop集群包含五类守护进程:
- NameNode
- DataNode
- Secondary NameNode
- JobTracker
- TaskTracker
集群节点分为两类:主节点(NameNode、JobTracker所在)和从节点(DataNode、TaskTracker所在)。
NameNode
NameNode负责管理HDFS文件系统元数据,将文件分割为多个数据块,并记录各数据块在DataNode上的存储位置。一个集群通常只有一个NameNode,该节点通常不运行DataNode和TaskTracker进程。
DataNode
DataNode负责实际存储数据块,接受NameNode的调度管理。当数据块发生变化时,DataNode会通知NameNode;同时与其他DataNode保持通信,实现数据块的冗余复制,确保数据可靠性。
Secondary NameNode
Secondary NameNode定期与NameNode通信,获取元数据的快照备份。仅在主节点故障时作为备用NameNode使用。
JobTracker
JobTracker负责MapReduce任务的调度与监控,包括任务失败后的重试机制。运行在主节点上,通常不运行DataNode和TaskTracker。
TaskTracker
TaskTracker负责执行JobTracker分配的任务,并向JobTracker报告执行状态。运行在从节点上。
架构示意
Hadoop集群中NameNode和JobTracker可部署在同一节点(适用于小规模集群)或分别部署在独立节点(提高可靠性)。
环境配置
部署Hadoop前需准备以下软件环境:
- JDK(推荐JDK 8)
- ssh远程登录服务
- sshd守护进程
- ssh-keygen密钥生成工具
本文以Ubuntu 16.04为例进行说明。
JDK安装
创建安装目录并解压JDK压缩包:
sudo mkdir /usr/local/lib/jvm
sudo tar -zxvf ~/downloads/jdk-8u301-linux-x64.tar.gz -C /usr/local/lib/jvm
配置环境变量,编辑/etc/profile文件添加:
export JAVA_HOME=/usr/local/lib/jvm/jdk1.8.0_301
export PATH=$JAVA_HOME/bin:$PATH
执行source /etc/profile使配置生效,验证安装:echo $JAVA_HOME
SSH服务配置
安装openssh-server:
sudo apt install openssh-server
配置免密码登录:
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 0600 ~/.ssh/authorized_keys
验证:ssh localhost
Hadoop安装
下载Hadoop 1.0.4版本,解压到目标目录:
sudo tar -zxvf hadoop-1.0.4.tar.gz -C /usr/local/
sudo chown -R $USER:$USER /usr/local/hadoop-1.0.4
编辑conf/hadoop-env.sh,设置JAVA_HOME:
export JAVA_HOME=/usr/local/lib/jvm/jdk1.8.0_301
Hadoop支持三种运行模式:本地模式、伪分布式模式、完全分布式模式。开发环境推荐使用伪分布式模式。
core-site.xml配置
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/user/hadoop/tmp/</value>
</property>
<property>
<name>fs.default.name</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
hdfs-site.xml配置
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
mapred-site.xml配置
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>localhost:9001</value>
</property>
</configuration>
启动集群
格式化HDFS:
cd /usr/local/hadoop-1.0.4/bin ./hadoop namenode -format
启动所有服务:
./start-all.sh
使用jps命令验证进程启动情况,应显示5个守护进程。
服务启动后可访问Web界面:50030端口查看MapReduce任务状态,50070端口查看HDFS状态。
实践示例:单词统计
完成环境配置后,运行Hadoop自带的WordCount示例程序进行验证。
创建测试目录结构:
mkdir -p test/classes test/src
复制示例源码:
cp src/examples/org/apache/hadoop/examples/WordCount.java test/src/
编译Java源程序:
javac -classpath hadoop-core-1.0.4.jar:lib/commons-cli-1.2.jar -d test/classes test/src/WordCount.java
打包为JAR文件:
jar -cvf test/WordCount.jar -C test/classes/ .
准备输入数据,在HDFS创建目录:
bin/hadoop dfs -mkdir input
创建本地测试文件:
echo "hello world hello hadoop" > test/data.txt
上传至HDFS:
bin/hadoop fs -put test/data.txt /user/username/input/
执行单词统计任务:
bin/hadoop jar test/WordCount.jar org.apache.hadoop.examples.WordCount input output
查看统计结果:
bin/hadoop fs -cat output/part-r-00000
输出应类似:
hadoop 1
hello 2
world 1