大数据
随着信息的增长,互联网,物联网建设的加快,信息增长的速度飞快。但是收集、检索、统计这些信息很困难,必须使用新的技术来解决这些问题,这就是诞生了大数据。
大数据指无法在一定时间范围内用常规软件工具进行捕捉,管理和处理的数据集合,需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。
也指从各种各样类型的数据中,快速获取有价值的信息。
用途:
企业组织利用相关数据分析帮助他们降低成本、提高效率、开发新产品、做出更明智的业务决策等
把数据集合并后进行分析得出的信息和数据关系性,用来察觉商业趋势、判定研究质量、避免疾病扩散、打击犯罪或测定即时交通路况等
大规模并处理数据库,数据挖掘电网,分布式文件系统或数据库,云计算平和可扩展的存储系统等
大数据特性
Volume(大体量) | 可从数百TB到数十数百PB、甚至EB的规模 |
Variety(多样性) | 大数据包括各种格式和形态的数据 |
Velocity(时效性) | 很多大数据需要在一定的时间限度下得到及时处理 |
Veracity(准确性) | 处理的结果要保证一定的准确性 |
Value(大价值) | 包含很多深度的价值,大数据分析挖掘和利用将带来很大的商业价值 |
Hadoop平台
平台:是一种分析和处理海量数据的软件平台,是一款开源软件,可以提供分布式基础架构
特点:高可靠性,高扩展性,高效性,高容错性,低成本
来源:
2003年Google三个系统GFS,MapReduce,BigTable。
Yahoo资助的Hadoop,基于java开发。 GFS---> HDFS MapReduce---->MapReduce Bigtable----> Hbase
GFS | GFS是一个可扩展的分布式文件系统,用于大型的,分布式的,对大量数据进行访问的应用,可以运行于廉价的普通硬件上,提供容错功能 |
---|---|
MapReduce | 针对分布式并行计算的一套编程模型,由Map和Reduce组成,Map是映射,把指令分到多个worker上,Reduce是规约,把worker计算出的结果合并 |
BigTable | 存储结构化数据,建立在GFS,Scheduler,Lock Service和MapReduce之上,每个Table都是一个多维的稀疏图 |
组件:
HDFS | Hadoop分布式文件系统(核心组件) |
---|---|
MapReduce | 分布式计算框架(核心组件) |
Yarn | 集群资源管理系统(核心组件) |
Zookeeper | 分布式协作服务 |
Hbase | 分布式列存数据库 |
Hive | 基于Hadoop的数据仓库 |
Sqoop | 数据同步工具 |
Pig | 基于Hadoop的数据流系统 |
Mahout | 数据挖掘算法库 |
Flume | 日志收集工具 |
HDFS角色 Hadoop中数据存储管理的基础,是一个高度容错的系统, 用于在低成本的通用硬件上运行
Client 客户端,切分文件;访问HDFS;与NameNode交互,获取文件位置信息;与DataNode交互,读取和写入数据
NameNode Master节点,管理HDFS的名称空间(fsimage)和数据块映射信息,配置副本策略,处理所有客户端请求
SecondaryNode 定期合并fsimage和fsedits,推送给NameNode,紧急情况下,可辅助恢复NameNode,但并不是热备份
DataNode 数据存储节点,存储实际的数据。汇报存储信息给NameNode
Block 每块默认128M大小,每块可以多个副本
HDFS-Client <---------------> NameNode < ---------------> Secondary-NameNode 切分数据 保存fsimage 定期合并fsimage和fsedits(变更日志) || V DataNode DotaNode DotaNode DataNode DotaNode 存储数据 存储数据 存储数据 存储数据 存储数据 1 2 3 1 2 3 默认3份数据(2副本) 1 2 3 1 2 3 |
MapReduce结构 java实现的分布式计算框架
client <————| client <————|———————> JobTracker client <————| | V TaskTracker TaskTracker TaskTracker Map task Reduce task Map task Map task Reduce task Map task Map task Reduce task Map task |
Job Tracker | Master节点只有一个,管理所有作业/任务的监控,错误处理等,将任务分解成一系列任务,分配给Task Tracker |
---|---|
Task Tracker | Slave节点,一般是多台;运行Map Task和Reduce Task;并与Job Tracker交互,汇报任务状态 |
Map Task |
解析每条数据记录,传递给用户编写map()并执行,将输出写入本地磁盘(如果为map-only作业),直接写入HDFS |
Reducer Task | 从Map Task的执行结果中,远程读输入数据,对数据进行排序,将数据按照分组传递给用户编写的reduce函数执行 |
Yarn 通用的资源管理系统
Resourcemanager | 处理客户端请求,启动/监控ApplicationMaster,监控Nodemanager,资源分配与调度 |
---|---|
Nodemanager | 单个节点上的资源管理,处理来自ResourceManager的命令,处理来自ApplicationMaster的命令 |
ApplicationMaster | 数据切分,为应用程序申请资源,并分配给内部任务,任务监控与容错 |
Container | 对任务运行环境的抽象,封装了CPU,内存等; 多维资源以及环境变量,启动命令等任务运行相关的信息资源分配与调度 |
Client | 用户与yarn交互的客户端程序,提交应用程序,监控应用程序状态,杀死应用程序等 |
Yarn的核心思想:将Job Tracker和Task Tacker进行分离,它由下面组件构成
ResourceManager一个全局的资源管理器 NodeManager每个节点(RM)代理
ApplicationMaster表示每个应用 每一个ApplicationMaster有多个Container在NodeManager上运行
Hadoop安装和配置
官方文件位置 http://hadoop.apache.org/docs/
模式:单机模式 伪分布式(所有角色放到一台机器) 完全分布式
单机模式
环境要求:2G内存,2cpu,大于20G内存,禁用selinux,firewalld,配置/etc/hosts,主机名能ping通,192.168.1.10 mynn01
注:如果磁盘空间不足,hadoop会强制进入到保护模式
[root@localhost ~]# hostnamectl set-hostname mynn01
[root@mynn01 ~]# vim /etc/hosts
192.168.1.10 mynn01
安装hadoop:依赖java-1.8.0-openjdk-devel hadoop-2.7.6.tar.gz
[root@mynn01 ~]# yum -y install java-1.8.0-openjdk-devel
[root@mynn01 hadoop]# java -version
openjdk version "1.8.0_131"
[root@mynn01 hadoop]# jps //查看本机jvm进程
1478 Jps
[root@mynn01 ~]# tar -zxf hadoop-2.7.6.tar.gz
[root@mynn01 ~]# mv hadoop-2.7.6 /usr/local/hadoop
[root@mynn01 ~]# ls /usr/local/hadoop
bin include libexec NOTICE.txt sbin
etc lib LICENSE.txt README.txt share
[root@mynn01 hadoop]# ./bin/hadoop -version
Error: JAVA_HOME is not set and could not be found. //没有找到java的家目录
[root@mynn01 hadoop]# rpm -ql java-1.8.0-openjdk
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.131-11.b12.el7.x86_64/jre/bin/policytool
...
修改配置文件:
Hadoop-env.sh JAVA_HOME HADOOP_CONF_DIR
[root@mynn01 hadoop]# pwd
/usr/local/hadoop/etc/hadoop
[root@mynn01 hadoop]# vim hadoop-env.sh
...
31 export JAVA_HOME="/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.131-11.b12.el7.x86_64/jre"
...
33 export HADOOP_CONF_DIR="/usr/local/hadoop/etc/hadoop"
[root@mynn01 hadoop]# /usr/local/hadoop/bin/hadoop version
Hadoop 2.7.6
...
统计文档单词数
[root@mynn01 hadoop]# cd /usr/local/hadoop/
[root@mynn01 hadoop]# mkdir in
[root@mynn01 hadoop]# cp *.txt in
[root@mynn01 hadoop]# ./bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.6.jar wordcount in out
// //wordcount为参数 统计in这个文件夹,存到out这个文件里面(这个文件不能存在,要是存在会报错,是为了防止数据覆盖
[root@mynn01 hadoop]# cat out/part-r-00000 //查看统计结果
完全分布式
配置文件 hadoop-env.sh core-site.xml(核心) slaves(节点) hdfs-site.xml(HDFS配置) (yarn-site.xml mapred-site.xml)
xml文件配置格式
<property>
<name> 关键字 </name>
<value> 变量值 </value>
<description> 描述 </description>
</property>
环境:2G内存,2cpu,大于20G内存,禁用selinux,firewalld,配置/etc/hosts,主机名互相能ping通
mynn01 192.168.1.10 | NameNode SecondaryNameNode |
node1 192.168.1.11 |
DataNode |
node2 192.168.1.12 | DataNode |
node3 192.168.1.13 | DataNode |
[root@node1 ~]# vim /etc/hosts
192.168.1.10 mynn01
192.168.1.11 node1
192.168.1.12 node2
192.168.1.13 node3
[root@node1 ~]# yum -y install java-1.8.0-openjdk-devel
[root@node1 ~]# java -version
[root@node1 ~]# jps
配置无密钥链接
[root@mynn01 hadoop]# vim /etc/ssh/ssh_config
StrictHostKeyChecking no
[root@mynn01 .ssh]# cd /root/.ssh
[root@mynn01 .ssh]# ssh-keygen -b 2048 -t rsa -N ''
[root@mynn01 .ssh]# for i in 192.168.1.{10,11,12,13}
> do
> ssh-copy-id $i
> done
修改mynn01的配置文件
[root@mynn01 hadoop]# vim etc/hadoop/core-site.xml
...
<configuration>
<property>
<name>fs.defaultFS</name> //文件系统配置参数
<value>hdfs://mynn01:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name> //数据目录配置参数
<value>/var/hadoop</value>
</property>
</configuration>
[root@mynn01 hadoop]# mkdir /var/hadoop //在node1,2,3上也创建此目录
[root@mynn01 hadoop]# vim etc/hadoop/hdfs-site.xml
<configuration>
<property>
<name>dfs.namenode.http-address</name> //地址声明
<value>mynn01:50070</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name> //地址声明
<value>mynn01:50090</value>
</property>
<property>
<name>dfs.replication</name> //文件冗余份数
<value>2</value>
</property>
</configuration>
[root@mynn01 hadoop]# vim etc/hadoop/slaves //节点配置文件
node1
node2
node3
同步配置 /usr/local/hadoop 到 node1,node2,node3
[root@mynn01 hadoop]# yum -y install rsync //所有节点军需要安装rsync
[root@mynn01 hadoop]# ansible all -m shell -a 'yum -y install rsync'
[root@mynn01 hadoop]# for i in 192.168.1.{11,12,13}; do rsync -aSH --delete /usr/local/hadoop/ $i:/usr/local/hadoop/ &
> done
[1] 11950
[2] 11951
[3] 11952
[root@mynn01 hadoop]# for i in 192.168.1.{11,12,13}; do rsync -aSH --delete /usr/local/hadoop/ $i:/usr/local/hadoop/ & done
[1] 11950
[2] 11951
[3] 11952
[root@mynn01 hadoop]# wait
[1] 完成 rsync -aSH --delete /usr/local/hadoop/ $i:/usr/local/hadoop/
[2]- 完成 rsync -aSH --delete /usr/local/hadoop/ $i:/usr/local/hadoop/
[3]+ 完成 rsync -aSH --delete /usr/local/hadoop/ $i:/usr/local/hadoop/
[root@mynn01 hadoop]# ansible all -m shell -a 'ls /usr/local/hadoop'node1 | SUCCESS | rc=0 >>
...
格式化namenode节点并启动集群
[root@mynn01 hadoop]# ./bin/hdfs namenode -format //格式化 在namenode节点操作 192.168.1.10
[root@mynn01 hadoop]# ./sbin/start-dfs.sh
jps验证角色
[root@mynn01 hadoop]# jps
12326 SecondaryNameNode
12441 Jps
12139 NameNode
[root@mynn01 hadoop]# ./bin/hdfs dfsadmin -report
...
Live datanodes (3): //有三个角色就可以了
分布式计算框架MapReduce
配置mapred-site.xml在192.168.1.10上操作
[root@mynn01 hadoop]# cp etc/hadoop/mapred-site.xml.template etc/hadoop/mapred-site.xml
[root@mynn01 hadoop]# vim etc/hadoop/mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name> //资源管理
<value>yarn</value> //只支持local和yarn两种,单机local,集群yarn
</property>
</configuration>
yarn部署 资源管理
配置yarn-site.xml
<configuration>
<!-- Site specific YARN configuration properties -->
<property>
<name>yarn.resourcemanager.hostname</name> //地址
<value>mynn01</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name> //使用哪个计算框架
<value>mapreduce_shuffle</value> //计算框架的名称
</property>
</configuration>
同步配置到node节点
[root@mynn01 hadoop]# ansible all -m copy -a 'src=/usr/local/hadoop/etc/hadoop/mapred-site.xml dest=/usr/local/hadoop/etc/hadoop/'
[root@mynn01 hadoop]# ansible all -m copy -a 'src=/usr/local/hadoop/etc/hadoop/yarn-site.xml dest=/usr/local/hadoop/etc/hadoop/'
启动服务
[root@mynn01 hadoop]# ./sbin/start-yarn.sh
starting yarn daemons
starting resourcemanager, logging to /usr/local/hadoop/logs/yarn-root-resourcemanager-mynn01.out
node1: starting nodemanager, logging to /usr/local/hadoop/logs/yarn-root-nodemanager-node1.out
node3: starting nodemanager, logging to /usr/local/hadoop/logs/yarn-root-nodemanager-node3.out
node2: starting nodemanager, logging to /usr/local/hadoop/logs/yarn-root-nodemanager-node2.out
验证服务
[root@mynn01 hadoop]# ansible all -m shell -a 'jps'
node1 | SUCCESS | rc=0 >>
932 DataNode
1514 NodeManager //已启动
1661 Jps
...
[root@mynn01 hadoop]# jps
1041 NameNode
1235 SecondaryNameNode
2276 Jps
1959 ResourceManager //已启动节点
[root@mynn01 hadoop]# ./bin/yarn node --list
19/01/23 09:50:57 INFO client.RMProxy: Connecting to ResourceManager at mynn01/192.168.1.10:8032
Total Nodes:3
Node-Id Node-State Node-Http-Address Number-of-Running-Containers
node3:36185 RUNNING node3:8042 0
node1:38169 RUNNING node1:8042 0
node2:46025 RUNNING node2:8042 0
web访问Hadoop
namenode 192.168.1.10:50070
secondarynamenode 192.168.1.10:50090
resourcemanager 192.168.1.10:8088
datanode 192.168.1.11:50075
nodemanager 192.168.1.11:8042