Lucene 框架是 Doug Cutting 开创的开源软件,用 java 书写代码,实现与 Google 类似的全文搜索功能,它提供了全文检索引擎的架构,包括完整的查询引擎和索引引擎 。
2001年年底 Lucene 成为 apache 基金会的一个子项目。
对于海量数据的场景,Lucene 面对与 Google 同样的困难:存储数据困难,检索速度慢。
学习和模仿 Google 解决这些问题的办法 :微型版 Nutch。
可以说 Google 是 hadoop 的思想之源(Google 在大数据方面的三篇论文)。
GFS —>HDFS
Map-Reduce —>MR
BigTable —>Hbase
2003-2004 年,Google 公开了部分 GFS 和 Mapreduce 思想的细节,以此为基础 Doug Cutting 等人用了 2 年业余时间实现了 DFS 和 Mapreduce机制,使 Nutch 性能飙升 。
2005 年Hadoop 作为 Lucene 的子项目 Nutch 的一部分正式引入 Apache 基金会。
2006 年 3 月份,Map-Reduce 和 Nutch Distributed File System (NDFS) 分别被纳入称为 Hadoop 的项目中。
Hadoop 就此诞生并迅速发展,标志这云计算时代来临。
Apache、Cloudera、Hortonworks
Apache 版本最原始(最基础)的版本,对于入门学习最好。
Cloudera在大型互联网企业中用的较多。
① 2008 年成立的 Cloudera 是最早将 Hadoop 商用的公司,为合作伙伴提供 Hadoop 的商用解决方案,主要是包括支持、咨询服务、培训。
② 2009 年 Hadoop 的创始人 Doug Cutting 也加盟 Cloudera 公司。Cloudera 产品主要为 CDH,Cloudera Manager,Cloudera Support。
③ CDH 是Cloudera 的 Hadoop 发行版,完全开源,比 Apache Hadoop 在兼容性,安全性,稳定性上有所增强。
④ Cloudera Manager 是集群的软件分发及管理监控平台,可以在几个小时内部署好一个 Hadoop 集群,并对集群的节点及服务进行实时监控。Cloudera Support 即是对 Hadoop 的技术支持。
⑤ Cloudera 的标价为每年每个节点 4000 美元。Cloudera 开发并贡献了可实时处理大数据的 Impala 项目。
Hortonworks 文档较好。
① 2011 年成立的 Hortonworks 是雅虎与硅谷风投公司 Benchmark Capital 合资组建。
② 公司成立之初就吸纳了大约 25 名至 30 名专门研究Hadoop的雅虎工程师,上述工程师均在 2005 年开始协助雅虎开发 Hadoop,贡献了 Hadoop 80% 的代码。
③ 雅虎工程副总裁、雅虎 Hadoop 开发团队负责人 Eric Baldeschwieler 出任 Hortonworks 的首席执行官。
④ Hortonworks 的主打产品是 Hortonworks Data Platform(HDP),也同样是 100% 开源的产品,HDP 除常见的项目外还包括了 Ambari,一款开源的安装和管理系统。
⑤ HCatalog,一个元数据管理系统,HCatalog 现已集成到 Facebook 开源的 Hive 中。Hortonworks 的 Stinger 开创性的极大的优化了 Hive 项目。Hortonworks 为入门提供了一个非常好的,易于使用的沙盒。
⑥ Hortonworks 开发了很多增强特性并提交至核心主干,这使得 Apache Hadoop 能够在包括 Window Server 和 Windows Azure 在内的 microsoft Windows 平台上本地运行。定价以集群为基础,每10 个节点每年为 12500 美元。
Hadoop 1.x 和 hadoop 2.x 的区别
在 Hadoop 1.x 时代,Hadoop 中的 MapReduce 同时处理业务逻辑运算和资源调度,耦合性较大。
在 Hadoop 2.x 时代,增加了 Yarn。Yarn 只负责资源的调度,MapReduce 只负责运算。
HDFS 框架概述
① NameNode(nn): 存储文件的元数据,如文件名,文件目录结构,文件属性(生成时间、副本数、文件权限),以及每个文件的块所在的 DataNode 等。
② DataNode(dn): 在本地文件系统存储文件块数据,以及块数据校验和。
③ Secondary DataNode(2nn): 用来监控 HDFS 状态的辅助后台程序,每隔一段时间获取 HDFS 元数据的快照。
Yarn 结构概述
① ResourceManager(RM):
(1)处理客户端请求。
(2)监控 NodeManager。
(3)启动或监控 ApplicationMaster。
(4)资源的分配与调度。
② NodeManager(NM):
(1)管理单个节点上的资源。
(2)处理来自 ResourceManager 的命令。
(3)处理来自 ApplicationMaster 的命令。
(4)资源的分配与调度。
③ ApplicationMaster(AM):
(1)负责数据的切分。
(2)为应用程序申请资源并分配给内部的任务。
(3)任务的监控与容错。
④ Container:
Container 是 Yarn 中的资源抽象,它封装了某个节点上的多维度资源,如内存、CPU、磁盘、网络等。
MapReduce 架构概述
MapReduce 将计算过程分为两个阶段:Map 阶段和 Reduce 阶段。
① Map 阶段并行处理输入的数据。
② Reduce 阶段对 Map 结果进行汇总。
克隆虚拟机
修改克隆虚拟机的静态IP
① vim /etc/sysconfig/network-scripts/ifcfg-网卡名称
终端上输入 ifconfig 或 ip addr,找出网卡名称
② 将 BOOTPROTO=dhcp 改成 BOOTPROTO=static、ONBOOT=no 改成 ONBOOT=yes
③ 并在文件尾部添加以下内容
IPADDR=192.168.217.129
NETMASK=255.255.255.0
GATEWAY=192.168.217.2
DNFS1=192.168.217.2
④ 重启网关服务
systemctl restart network
hostnamectl set-hostname lyh
关闭防火墙
① 关闭防火墙
systemctl stop firewalld
② 禁止防火墙开机启动
systemctl disable firewalld
③ 关闭 Selinux
vim /etc/sysconfig/selinux
将 SELINUX=enforcing 改成 SELINUX=disabled
mkdir /usr/local/java
tar -zxvf jdk-8u151-linux-x64.tar.gz -C /usr/local/java/
vim /etc/profile
添加以下内容:
# JAVAHOME
export JAVA_HOME=/usr/local/java/jdk1.8.0_151
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$PATH:$JAVA_HOME/bin
source /etc/profile
输入 java、javac、java -version 命令检验 jdk 是否安装成功
注意:如果之前安装过 jdk 或 系统自带 jdk,我们需要卸载这些 jdk
① 查询已安装的 jdk 列表
rpm -qa | grep jdk
② 删除已经安装的 jdk
yum -y remove XXX(上面查询到的 jdk 名称)
注意:如果终端出现以下错误:/var/run/yum.pid 已被锁定,PID 为 1610 的另一个程序正在运行。
则输入以下命令:
rm -f /var/run/yum.pid
之后再执行以上删除 jdk 的命令
③ 重新让配置文件生效
source /etc/profile
④ 输入 java、javac、java -version 命令检验 jdk 是否安装成功
Hadoop 官网
mkdir /hadoop
tar -zxvf hadoop-2.7.7.tar.gz -C /hadoop/
配置 hadoop 环境变量
① 在 /etc/profile 文件的尾部添加以下内容:
#HADOOP
export HADOOP_HOME=/hadoop/hadoop-2.7.7
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
② 使配置文件生效
source /etc/profile
hadoop version
Hadoop 的运行模式包括:本地模式、伪分布式模式、完全分布式模式。
mkdir input
cp etc/hadoop/*.xml input
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar grep input/ output 'dfs[a-z.]+'
mkdir wcinput
vim wc.input
在文件中输入以下内容:
hadoop yarn
hadoop mapreduce
spark
spark
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar wordcount wcinput/ wcoutput
配置集群,修改 Hadoop 的配置文件(/hadoop/hadoop-2.7.7/etc/hadoop 目录下)
① core-site.xml
<configuration>
<property>
<name>fs.defaultFSname>
<value>hdfs://lyh:9000value>
property>
<property>
<name>hadoop.tmp.dirname>
<value>/hadoop/hadoop-2.7.7/data/tmpvalue>
property>
configuration>
② hadoop-env.sh
修改 JAVA_HOME 路径:
# The java implementation to use.
export JAVA_HOME=/usr/local/java/jdk1.8.0_151
③ hdfs-site.xml
<configuration>
<property>
<name>dfs.replicationname>
<value>1value>
property>
configuration>
启动集群
① 格式化 NameNode(第一次启动时格式化,以后就不要总格式化)
hdfs namenode -format
② 启动 NameNode
hadoop-daemon.sh start namenode
③ 启动 DataNode
hadoop-daemon.sh start datanode
hdfs dfs -mkdir -p /user/lyh/input
② 将测试文件内容上传到文件系统上
hdfs dfs -put wcinput/wc.input /user/lyh/input/
③ 在 hadoop-2.7.7 目录下,运行 MapReduce 程序
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar wordcount /user/lyh/input/ /user/lyh/output
④ 查看输出结果
命令行查看:
hdfs dfs -cat /user/atguigu/output/*
配置集群,修改 Hadoop 的配置文件(/hadoop/hadoop-2.7.7/etc/hadoop 目录下)
① yarn-site.xml
<configuration>
<property>
<name>yarn.nodemanager.aux-servicesname>
<value>mapreduce_shufflevalue>
property>
<property>
<name>yarn.resourcemanager.hostnamename>
<value>lyhvalue>
property>
configuration>
② yarn-env.sh
修改 JAVA_HOME 路径:
export JAVA_HOME=/usr/local/java/jdk1.8.0_151
③ mapred-env.sh
修改 JAVA_HOME 路径:
export JAVA_HOME=/usr/local/java/jdk1.8.0_151
④ 将 mapred-site.xml.template 重新命名为 mapred-site.xml
mv mapred-site.xml.template mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.namename>
<value>yarnvalue>
property>
configuration>
启动集群
① 启动前必须保证 NameNode 和 DataNode 已经启动
② 启动 ResourceManager
yarn-daemon.sh start resourcemanager
③ 启动NodeManager
yarn-daemon.sh start nodemanager
hdfs dfs -rm -R /user/lyh/output
② 在 hadoop-2.7.7 目录下,运行 MapReduce 程序
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar wordcount /user/lyh/input /user/lyh/output
③ 查看运行结果
命令行查看:
hdfs dfs -cat /user/lyh/output/*
为了查看程序的历史运行情况,需要配置一下历史服务器。
配置 mapred-site.xml
在该文件里面增加以下配置:
<property>
<name>mapreduce.jobhistory.addressname>
<value>lyh:10020value>
property>
<property>
<name>mapreduce.jobhistory.webapp.addressname>
<value>lyh:19888value>
property>
mr-jobhistory-daemon.sh start historyserver
日志聚集概念:应用运行完成以后,将程序运行日志信息上传到 HDFS 系统上。
日志聚集功能好处:可以方便的查看到程序运行详情,方便开发调试。
注意:开启日志聚集功能,需要重新启动 NodeManager 、ResourceManager 和 HistoryManager。
yarn-daemon.sh stop resourcemanager
yarn-daemon.sh stop nodemanager
mr-jobhistory-daemon.sh stop historyserver
配置 yarn-site.xml
在该文件里面增加以下配置:
<property>
<name>yarn.log-aggregation-enablename>
<value>truevalue>
property>
<property>
<name>yarn.log-aggregation.retain-secondsname>
<value>604800value>
property>
yarn-daemon.sh start resourcemanager
yarn-daemon.sh start nodemanager
mr-jobhistory-daemon.sh start historyserver
hdfs dfs -rm -R /user/lyh/output
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar wordcount /user/lyh/input /user/lyh/output
主机名称 | IP 地址 |
---|---|
master | 192.168.217.130 |
slave1 | 192.168.217.131 |
slave2 | 192.168.217.132 |
vim /etc/hosts
192.168.217.130 master
192.168.217.131 slave1
192.168.217.132 slave2
scp(secure copy)安全拷贝
① scp 定义:
scp 可以实现服务器与服务器之间的数据拷贝。
② 基本语法:
scp -r 要拷贝的文件路径/名称 目的用户@主机:目的路径/名称
rsync(remote synchronize)远程同步工具
① rsync 定义:
rsync 主要用于备份和镜像。具有速度快、避免复制相同内容和支持符号链接的优点。
rsync 和 scp 区别:用 rsync 做文件的复制要比 scp 的速度快,rsync 只对差异文件做更新。scp 是把所有文件都复制过去。
② 基本语法:
rsync -rvl 要拷贝的文件路径/名称 目的用户@主机:目的路径/名称
说明:-v:显示复制过程 、-l:拷贝符号链接
xsync 集群分发脚本
需求:循环复制文件到所有节点的相同目录下
① 在 /usr/local/bin 目录下创建 xsync 文件
vim xsync
在文件中输入以下内容:
#!/bin/bash
#1 获取输入参数个数,如果没有参数,直接退出
pcount=$#
if((pcount==0)); then
echo no args;
exit;
fi
#2 获取文件名称
p1=$1
fname=`basename $p1`
echo fname=$fname
#3 获取上级目录到绝对路径
pdir=`cd -P $(dirname $p1); pwd`
echo pdir=$pdir
#4 获取当前用户名称
user=`whoami`
#5 循环
for i in master slave1 slave2
do
echo "****************** $i *********************"
rsync -rvl $pdir/$fname $user@$i:$pdir
done
② 修改脚本 xsync 具有执行权限
chmod 777 xsync
③ 调用脚本形式:xsync 文件名称
master | slave1 | slave2 | |
---|---|---|---|
HDFS | NameNode DataNode |
DataNode | SecondaryNameNode DataNode |
YARN | NodeManager | ResourceManager NodeManager |
NodeManager |
配置集群
⑴ 配置核心文件
配置 core-site.xml
<configuration>
<property>
<name>fs.defaultFSname>
<value>hdfs://master:9000value>
property>
<property>
<name>hadoop.tmp.dirname>
<value>/hadoop/hadoop-2.7.7/data/tmpvalue>
property>
configuration>
⑵ HDFS 配置文件
① 配置 hadoop-env.sh
修改 JAVA_HOME 路径:
# The java implementation to use.
export JAVA_HOME=/usr/local/java/jdk1.8.0_151
② 配置 hdfs-site.xml
<configuration>
<property>
<name>dfs.replicationname>
<value>3value>
property>
<property>
<name>dfs.namenode.secondary.http-addressname>
<value>slave2:50090value>
property>
configuration>
⑶ YARN 配置文件
① 配置 yarn-env.sh
修改 JAVA_HOME 路径:
export JAVA_HOME=/usr/local/java/jdk1.8.0_151
② 配置 yarn-site.xml
<configuration>
<property>
<name>yarn.nodemanager.aux-servicesname>
<value>mapreduce_shufflevalue>
property>
<property>
<name>yarn.resourcemanager.hostnamename>
<value>slave1value>
property>
<property>
<name>yarn.log-aggregation-enablename>
<value>truevalue>
property>
<property>
<name>yarn.log-aggregation.retain-secondsname>
<value>604800value>
property>
configuration>
⑷ MapReduce 配置文件
① 配置 mapred-env.sh
修改 JAVA_HOME 路径:
export JAVA_HOME=/usr/local/java/jdk1.8.0_151
② 配置 mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.namename>
<value>yarnvalue>
property>
<property>
<name>mapreduce.jobhistory.addressname>
<value>master:10020value>
property>
<property>
<name>mapreduce.jobhistory.webapp.addressname>
<value>master:19888value>
property>
configuration>
xsync /hadoop/
hadoop namenode -format
hadoop-daemon.sh start namenode
hadoop-daemon.sh start datanode
ssh-keygen -t rsa
然后敲(三个回车),就会在 .ssh 目录下生成两个文件 id_rsa(私钥)、id_rsa.pub(公钥)
ssh-copy-id master
ssh-copy-id slave1
ssh-copy-id slave2
配置 slaves(/hadoop/hadoop-2.7.7/etc/hadoop/slaves)
① 在该文件中增加如下内容:
master
slave1
slave2
注意:该文件中添加的内容结尾不允许有空格,文件中不允许有空行。
② 同步所有节点配置文件
xsync slaves
启动集群
① 如果集群是第一次启动,需要格式化 NameNode (注意格式化之前,一定要先停止上次启动的所有 namenode 和 datanode 进程,然后再删除 data 和 log 数据)
hdfs namenode -format
② 启动 HDFS
start-dfs.sh
③ 启动 YARN(slave1 上)
注意:NameNode 和 ResourceManger 如果不是同一台机器,不能在 NameNode 上启动 YARN,应该在 ResouceManager 所在的机器上启动 YARN。
start-yarn.sh
编写查看集群所有节点 jps 脚本 alljps
① 在 /usr/local/bin 目录下创建文件 alljps
vim alljps
在文件中输入以下内容:
#!/bin/bash
for i in master slave1 slave2
do
echo "****************** $i *********************"
ssh $i "source /etc/profile && jps"
done
② 修改脚本 alljps 具有执行权限
chmod 777 alljps
时间同步的方式:找一个机器,作为时间服务器,所有的机器与这台集群时间进行定时的同步,比如,每隔十分钟,同步一次时间。
时间服务器配置(必须 root 用户)
① 安装 ntp
yum install ntp
② 修改 ntp 配置文件
vim /etc/ntp.conf
修改内容如下:
⑴ 授权 192.168.1.0-192.168.1.255 网段上的所有机器可以从这台机器上查询和同步时间
#restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap
restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap
⑵ 集群在局域网中,不使用其他互联网上的时间
#server 0.centos.pool.ntp.org iburst
#server 1.centos.pool.ntp.org iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst
⑶ 当该节点丢失网络连接,依然可以采用本地时间作为时间服务器为集群中的其他节点提供时间同步
server 127.127.1.0
fudge 127.127.1.0 stratum 10
③ 修改/etc/sysconfig/ntpd 文件
vim /etc/sysconfig/ntpd
添加内容如下(让硬件时间与系统时间一起同步)
SYNC_HWCLOCK=yes
④ 重新启动 ntpd 服务
systemctl restart ntpd.service
⑤ 设置 ntpd 服务开机启动
systemctl enable ntpd.service
其他机器配置(必须root用户)
在其他机器配置10分钟与时间服务器同步一次
crontab -e
编写定时任务如下:
*/10 * * * * /usr/sbin/ntpdate master
CentOS 联网
配置 CentOS 能连接外网。Linux 虚拟机 ping www.baidu.com 是畅通的。
jar 包准备(hadoop 源码、JDK8、maven、ant 、protobuf)
① hadoop-2.7.7-src.tar.gz
② jdk-8u151-linux-x64.tar.gz
③ apache-ant-1.9.9-bin.tar.gz(build 工具,打包用的)
④ apache-maven-3.0.5-bin.tar.gz
⑤ protobuf-2.5.0.tar.gz(序列化的框架)
安装 jdk
具体详见 2.2。
安装 Maven
① 解压 Maven
tar -zxvf apache-maven-3.0.5-bin.tar.gz -C /opt/module/
② 配置环境变量
vim /etc/profile
添加以下内容:
#MAVEN_HOME
export MAVEN_HOME=/opt/module/apache-maven-3.0.5
export PATH=$PATH:$MAVEN_HOME/bin
使配置文件生效:
source /etc/profile
② 进入解压后的 Maven 目录,编辑配置文件(更改 Maven 镜像)
<mirror>
<id>nexus-aliyunid>
<mirrorOf>centralmirrorOf>
<name>Nexus aliyunname>
<url>http://maven.aliyun.com/nexus/content/groups/publicurl>
mirror>
③ 查看 Maven 是否安装成功
mvn -version
安装 ant
① 解压 ant
tar -zxvf apache-ant-1.9.9-bin.tar.gz -C /opt/module/
② 配置环境变量
vim /etc/profile
添加以下内容:
#ANT_HOME
export ANT_HOME=/opt/module/apache-ant-1.9.9
export PATH=$PATH:$ANT_HOME/bin
使配置文件生效:
source /etc/profile
③ 查看 ant 是否安装成功
ant -version
yum install glibc-headers
yum install gcc-c++
yum install make
yum install cmake
安装 protobuf
① 解压 protobuf
tar -zxvf protobuf-2.5.0.tar.gz -C /opt/module/
② 配置环境变量
vim /etc/profile
添加以下内容:
#LD_LIBRARY_PATH
export LD_LIBRARY_PATH=/opt/module/protobuf-2.5.0
export PATH=$PATH:$LD_LIBRARY_PATH
使配置文件生效:
source /etc/profile
③ 进入到解压后 protobuf 主目录,/opt/module/protobuf-2.5.0,然后相继执行命令
./configure
make
make check
make install
ldconfig
③ 查看 protobuf 是否安装成功
protoc --version
yum install openssl-devel
yum install ncurses-devel
tar -zxvf hadoop-2.7.7-src.tar.gz -C /opt/
mvn package -Pdist,native -DskipTests -Dtar
等待时间 2 小时左右。