本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,博主为石山园,博客地址为 http://www.cnblogs.com/shishanyuan 。该系列课程是应邀实验楼整理编写的,这里需要赞一下实验楼提供了学习的新方式,可以边看博客边上机实验,课程地址为 https://www.shiyanlou.com/courses/237
【注】该系列所使用到安装包、测试文件和代码可以在百度网盘下载,具体地址为 http://pan.baidu.com/s/10PnDs ,下载该 PDF文件
Apache Hadoop 软件库是一个框架,允许在集群服务器上使用简单的编程模型对大数据集进行分布式处理。 Hadoop 被设计成能够从单台服务器扩展到数以千计的服务器,每台服务器都有本地的计算和存储资源。 Hadoop 的高可用性并不依赖硬件,其代码库自身就能在应用层侦测并处理硬件故障,因此能基于服务器集群提供高可用性的服务。
经过多年的发展形成了 Hadoop1.X 生态系统,其结构如下图所示:
l HDFS--Hadoop 生态圈的基本组成部分是 Hadoop 分布式文件系统( HDFS )。 HDFS 是一种数据分布式保存机制,数据被保存在计算机集群上, HDFS 为 HBase 等工具提供了基础。
l MapReduce--Hadoop 的主要执行框架是 MapReduce ,它是一个分布式、并行处理的编程模型, MapReduce 把任务分为 map( 映射 ) 阶段和 reduce( 化简 ) 。由于 MapReduce 工作原理的特性, Hadoop 能以并行的方式访问数据,从而实现快速访问数据。
l Hbase--HBase 是一个建立在 HDFS 之上,面向列的 NoSQL 数据库,用于快速读 / 写大量数据。 HBase 使用 Zookeeper 进行管理,确保所有组件都正常运行。
l Zookeeper-- 用于 Hadoop 的分布式协调服务。 Hadoop 的许多组件依赖于 Zookeeper ,它运行在计算机集群上面,用于管理 Hadoop 操作。
l Pig-- 它是 MapReduce 编程的复杂性的抽象。 Pig 平台包括运行环境和用于分析 Hadoop 数据集的脚本语言 (Pig Latin) 。其编译器将 Pig Latin 翻译成 MapReduce 程序序列。
l Hive--Hive 类似于 SQL 高级语言,用于运行存储在 Hadoop 上的查询语句, Hive 让不熟悉 MapReduce 开发人员也能编写数据查询语句,然后这些语句被翻译为 Hadoop 上面的 MapReduce 任务。像 Pig 一样, Hive 作为一个抽象层工具,吸引了很多熟悉 SQL 而不是 Java 编程的数据分析师。
l Sqoop 是一个连接工具,用于在关系数据库、数据仓库和 Hadoop 之间转移数据。 Sqoop 利用数据库技术描述架构,进行数据的导入 / 导出;利用 MapReduce 实现并行化运行和容错技术。
l Flume 提供了分布式、可靠、高效的服务,用于收集、汇总大数据,并将单台计算机的大量数据转移到 HDFS 。它基于一个简单而灵活的架构,并提供了数据流的流。它利用简单的可扩展的数据模型,将企业中多台计算机上的数据转移到 Hadoop
Apache Hadoop 版本分为两代,我们将第一代 Hadoop 称为 Hadoop 1.0 ,第二代 Hadoop 称为 Hadoop 2.0 。第一代 Hadoop 包含三个大版本,分别是 0.20.x , 0.21.x 和 0.22.x ,其中, 0.20.x 最后演化成 1.0.x ,变成了稳定版,而 0.21.x 和 0.22.x 包含 NameNode HA 等新的重大特性。第二代 Hadoop 包含两个版本,分别是 0.23.x 和 2.x ,它们完全不同于 Hadoop 1.0 ,是一套全新的架构,均包含 HDFS Federation 和 YARN 两个系统,相比于 0.23.x , 2.x 增加了 NameNode HA 和 Wire-compatibility 两个重大特性。
Hadoop 安装有如下三种方式
l 单机模式:安装简单,几乎不用作任何配置,但仅限于调试用途;
l 伪分布模式:在单节点上同时启动 NameNode 、 DataNode 、 JobTracker 、 TaskTracker 、 Secondary Namenode 等 5 个进程,模拟分布式运行的各个节点;
l 完全分布式模式:正常的 Hadoop 集群,由多个各司其职的节点构成
由于实验环境的限制,本节课程将讲解伪分布模式安装,并在随后的课程中以该环境为基础进行其他组件部署实验。以下为伪分布式环境下在 CentOS6 中配置 Hadoop-1.1.2 ,该配置可以作为其他 Linux 系统和其他版本的 Hadoop 部署参考。
所有节点均是 CentOS 系统,防火墙和 SElinux 禁用,所有节点上均创建了一个 shiyanlou 用户,并在系统根目录下创建 /app 目录,用于存放 Hadoop 等组件运行包。因为该目录用于安装 hadoop 等组件程序,用户对 shiyanlou 必须赋予 rwx 权限(一般做法是 root 用户在根目录下创建 /app 目录,并修改该目录拥有者为 shiyanlou(chown – R shiyanlou:shiyanlou /app )。
Hadoop 搭建环境:
l 虚拟机操作系统: CentOS6.6 64 位,单核, 1G 内存
l JDK : 1.7.0_55 64 位
l Hadoop : 1.1.2
实验环境的虚拟机已经完成的安装环境的配置,其他环境部署时可以参考该章节进行环境搭建。
该部分对服务器的配置需要在服务器本地进行配置,配置完毕后需要重启服务器确认配置是否生效,特别是远程访问服务器需要设置固定 IP 地址。
2.2.1.1 设置 IP 地址
1. 点击 System-->Preferences-->Network Connections ,如下图所示:
2. 修改或重建网络连接,设置该连接为手工方式,设置如下网络信息:
IP 地址 : 192.168.42.11
子网掩码: 255.255.255.0
网关: 192.168.42.1
DNS : 221.12.1.227 ( 需要根据所在地设置 DNS 服务器 )
Domain: 221.12.33.227
注意 :网关、 DNS 等根据所在网络实际情况进行设置,并设置连接方式为 "Available to all users" ,否则通过远程连接时会在服务器重启后无法连接服务器
3. 在命令行中,使用 ifconfig 命令查看设置 IP 地址信息,如果修改 IP 不生效,需要重启机器再进行设置(如果该机器在设置后需要通过远程访问,建议重启机器,确认机器 IP 是否生效)
2.2.1.2 设置机器名
使用 sudo vi /etc/sysconfig/network 打开配置文件,根据实际情况设置该服务器的机器名,新机器名在重启后生效
2.2.1.3 设置 Host 映射文件
1. 设置 IP 地址与机器名的映射,设置信息如下:
sudo vi /etc/hosts
l 192.168.42.8 b393a04554e1 hadoop
2. 使用如下命令对网络设置进行重启
sudo /etc/init.d/network restart
3. 使用 ping 命令验证设置是否成功
2.2.2.1 关闭防火墙
在 Hadoop 安装过程中需要关闭防火墙和 SElinux ,否则会出现异常
1. 使用 sudo service iptables status 查看防火墙状态,如下所示表示 iptables 已经开启
2. 以 root 用户使用如下命令关闭 iptables
chkconfig iptables off
2.2.2.2 关闭 SElinux
1. 使用 sudo getenforce 命令查看是否关闭,如果显示 Enforcing 表示没有关闭
2. 修改 /etc/selinux/config 文件
将 SELINUX=enforcing 改为 SELINUX=disabled ,执行该命令后重启机器
2.2.2.3 JDK 安装及配置
1. 下载 JDK1.7 64bit 安装包
打开 JDK1.7 64bit 安装包下载链接为:
http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html
打开界面之后,先选中 Accept License Agreement ,然后下载 jdk-7u55-linux-x64.tar.gz ,如下图所示:
2. 创建 /app 目录,把该目录的所有者修改为 shiyanlou
sudo mkdir /app
sudo chown -R shiyanlou:shiyanlou /app
3. 创建 /app/lib 目录, 使用命令如下:
mkdir /app/lib
4. 把下载的安装包解压并迁移到 /app/lib 目录下
cd /home/shiyanlou/install-pack
tar -zxf jdk-7u55-linux-x64.tar.gz
mv jdk1.7.0_55/ /app/lib
ll /app/lib
5. 使用 sudo vi /etc/profile 命令打开配置文件,设置 JDK 路径
export JAVA_HOME=/app/lib/jdk1.7.0_55
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
6. 编译并验证
source /etc/profile
java -version
2.2.2.4 更新 OpenSSL
CentOS 自带的 OpenSSL 存在 bug ,如果不更新 OpenSSL 在 Ambari 部署过程会出现无法通过 SSH 连接节点,使用如下命令进行更新:
yum update openssl
2.2.2.5 SSH 无密码验证配置
1. 使用 sudo vi /etc/ssh/sshd_config 打开 sshd_config 配置文件,开放三个配置,如下图所示:
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
2. 配置后重启服务
sudo service sshd restart
3. 使用 shiyanlou 用户登录使用如下命令生成私钥和公钥;
ssh-keygen -t rsa
4. 进入 /home/shiyanlou/.ssh 目录把公钥命名为 authorized_keys ,使用命令如下:
cp id_rsa.pub authorized_keys
5. 使用如下设置 authorized_keys 读写权限
chmod 400 authorized_keys
6. 测试 ssh 免密码登录是否生效
在 Apache 的归档目录中下载 hadoop-1.1.2-bin.tar.gz 安装包,也可以在 /home/shiyanlou/install-pack 目录中找到该安装包,解压该安装包并把该安装包复制到 /app 目录中
cd /home/shiyanlou/install-pack
tar -xzf hadoop-1.1.2-bin.tar.gz
mv hadoop-1.1.2 /app
cd /app/hadoop-1.1.2
mkdir tmp
mkdir hdfs
mkdir hdfs/name
mkdir hdfs/data
ls
把 hdfs/data 设置为 755 ,否则 DataNode 会启动失败
1. 进入 hadoop-1.1.2/conf 目录,打开配置文件 hadoop-env.sh
cd /app/hadoop-1.1.2/conf
vi hadoop-env.sh
2. 加入配置内容,设置了 hadoop 中 jdk 和 hadoop/bin 路径
export JAVA_HOME=/app/lib/jdk1.7.0_55
export PATH=$PATH:/app/hadoop-1.1.2/bin
3. 编译配置文件 hadoop-env.sh 并确认生效
source hadoop-env.sh
hadoop version
1. 使用如下命令打开 core-site.xml 配置文件
cd /app/hadoop-1.1.2/conf
sudo vi core-site.xml
2. 在配置文件中,按照如下内容进行配置
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://hadoop:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/app/hadoop-1.1.2/tmp</value>
</property>
</configuration>
1. 使用如下命令打开 hdfs-site.xml 配置文件
cd /app/hadoop-1.1.2/conf
sudo vi hdfs-site.xml
2. 在配置文件中,按照如下内容进行配置
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.name.dir</name>
<value>/app/hadoop-1.1.2/hdfs/name</value>
</property>
<property>
<name>dfs.data.dir</name>
<value>/app/hadoop-1.1.2/hdfs/data</value>
</property>
</configuration>
1. 使用如下命令打开 mapred-site.xml 配置文件
cd /app/hadoop-1.1.2/conf
sudo vi mapred-site.xml
2. 在配置文件中,按照如下内容进行配置
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>hadoop:9001</value>
</property>
</configuration>
1. 设子主节点
cd /app/hadoop-1.1.2/conf
vi masters
设置 hadoop 机器为 master 节点
2. 设置从节点
cd /app/hadoop-1.1.2/conf
vi slaves
设置 hadoop 机器为 slaves 节点,即本身即是 master 也是 slaves 节点
在 hadoop 机器上使用如下命令进行格式化 namenode
cd /app/hadoop-1.1.2/bin
./hadoop namenode -format
cd /app/hadoop-1.1.2/bin
./start-all.sh
使用 jps 命令查看 hadoop 相关进程是否启动
这时我们发现少了一个 DataNode 进程,到 $HADOOP_HOME/logs 目下,使用 cat hadoop-shiyanlou-datanode-5****.log ( *** 表示所在机器名)查看日志文件,可以看到在日志中提示: Invalid directory in dfs.data.dir:Incorrect permission for /app/hadoop-1.1.2/hdfs/data, expected:rwxr-xr-x, while actual: rwxrwxr-x
sudo chmod 755 /app/hadoop-1.1.2/hdfs/data
重新启动 hadoop 集群,可以看到 DataNode 进程