实验环境:
1、Linux操作系统
2、Hadoop的介质
3、Spark的介质
学习路线和课程简介:
1、基础:Java语言:Java基础(Java SE):变量 类型 循环 if
面向对象:类、封装、集成、多态
I/O:输入流、输出流
反射、泛型
JDBC: 操作关系型数据库
Linux基础
大数据:数据的处理 (1)离线计算 (2)实时计算
2、Hadoop
(1)数据储存:HDFS
(2)数据计算:MapReduce(Java程序) ---> 离线计算
(3)其他组件(生态圈):HBase、Hive、Pig、Flume、Sqoop*****
3、Storm:实时计算框架(Java语言)
(1)NoSQL:Redis内存数据库
(2)Storm中的内容
4、Spark:数据计算
(1)Scala编程语言:看成是Java的升级
(2)Spark Core:整个Spark的核心 ---> 相当于MapReduce
(3)Spark SQL
(4)Spark Streaming:实时计算框架
5、项目实战
第一章、Linux基础
一、Linux的实验环境
(*)版本:RedHat 7.4 64位 自带netcat服务器(测试:Spark Streaming)
(*)VM:12
(*)类型:Redhat Linx 7 64位
(*)网卡:仅主机模式
(*)一共5台虚拟机:安装JDK、配置主机名、关闭防火墙
192.168.157.11 bigdata11
192.168.157.12 bigdata12
192.168.157.13 bigdata13
192.168.157.14 bigdata14
192.168.157.15 bigdata15
二、配置Linux和Linux的目录结构
1、对Linux了解
2、关闭防火墙
查看防火墙的状态:systemctl status firewalld.service
关闭防火墙: systemctl stop firewalld.service
禁用防火墙(永久)systemctl disable firewalld.service
3、设置主机名 (配置文件) /etc/hosts
vi /etc/hosts
192.168.157.11 bigdata11
三、vi编辑器:相当于linux的记事本
三种模式:
1、编辑模式:等待命令的输入
按i--> 进入:插入模式
按:(冒号)进入命令模式
2、插入模式: 按esc键回到编辑模式
3、命令模式
(*) w: 保存
(*) q: 退出
(*) wq: 保存退出
(*) 打开行号:set number
关闭行号: set nonumber
(*) 换行: set wrap
set nowrap
四、文件目录操作命令(重点掌握:后面操作HDFS的时候,很方便)
(*)ls 显示文件和目录列表
-l 列出文件的详细信息
-a 列出当前目录所有文件,包含隐藏文件
隐藏文件:.bash_profile 设置环境变量:JAVA_HOME、HADOOP_HOME
隐藏目录:.ssh ----> 配置Hadoop和Spark的免密码登录
查询Hadoop的中文件:hdfs dfs -ls /
(*)当前目录:pwd
/root ---> root用户的HOME目录(快捷方式: ~)
(*)mkdir 创建目录
-p 父目录不存在情况下先生成父目录
约定:mkdir /root/tools ---> 所有的安装包
mkdir /root/training ---> 安装目录
在Hadoop中创建目录:hdfs dfs -mkdir /aaa
(*)cd 切换目录
(*)touch 生成一个空文件
echo 生成一个带内容文件 ----> 更常用的用法:查看环境变量
echo $JAVA_HOME
(*)cat、tac 显示文本文件内容
cat是从第一行开始写;tac是从最后一行开始写
举例: cat a.txt
查看Hadoop中文件的内容: hdfs dfs -cat /a.txt
(*)cp 复制文件或目录
cp a.txt data.txt
在Hadoop中拷贝数据: hdfs dfs -cp /a.txt /b.txt
(*)rm 删除文件
-r 同时删除该目录下的所有文件
-f 强制删除文件或目录
rm -rf a.txt
在Hadoop中删除文件:hdfs dfs -rmr /a.txt
(*)kill:杀死
参数: -9 强制杀死
-3
(*)tar命令:打包压缩
五、Linux的权限管理(Hadoop的HDFS权限非常像)
1、权限的类型:r 读
w 写
x 执行
2、使用ls -l或者ll命令查看权限
六、安装常用软件:安装JDK的时候,讲讲tar命令
tar -zxvf jdk-8u144-linux-x64.tar.gz -C ~/training/
设置环境变量:vi ~/.bash_profile
JAVA_HOME=/root/training/jdk1.8.0_144
export JAVA_HOME
PATH=$JAVA_HOME/bin:$PATH
export PATH
生效环境变量: source ~/.bash_profile
七、案例:Java的死锁分析 ---> 介绍一个工具(kill -3 的命令)
目的:找到死锁 性能诊断
Java提供了一个非常强大的性能诊断工具:Thread Dump(文本信息)
1、Linux:kill -3 PID(就是Java的进程号)
2、Windows: 按ctrl+break(fn+B)键
学习大数据,学什么?怎么学?
1、原理和运行机制、体系结构(非常重要)
2、动手:搭建环境、写程序
目的:1、学习内容 2、熟悉一些名词
一、各章概述(Hadoop部分)
(一)、Hadoop的起源与背景知识
1、什么是大数据?两个例子、大数据的核心问题是什么?
举例:(1)商品推荐:问题1:大量的订单如何存储? 问题2:大量的订单如何计算?
(2)天气预报:问题1:大量的天气数据如何存储? 问题2:大量的天气数据如何计算?
大数据的核心问题:(1)数据的存储:分布式文件系统(分布式存储)
(2)数据的计算:分布式计算
2、概念:数据仓库(Data warehouse)
(1)我们可以把Hadoop和Spark看成是数据仓库的一种实现方式
(2)数据仓库就是一个数据库,一般只做select
(3)重要:掌握数据仓库搭建的过程
(4)数据仓库又是一种OLAP的应用系统
3、概念:OLTP和OLAP
(1)OLTP:online transaction processing 联机事务处理
(2)OLAP:online analytic processing 联机分析处理 ------> 一般:不会修改(删除)数据
4、(最重要的内容)Google的几篇论文:3篇
(1)GFS:Google File System -----> HDFS ----> 解决:数据的存储
(2)MapReduce计算模型 -----> Hadoop MapReduce ----> 解决:数据的计算
(3)BigTable大表 -----> HBase是NoSQL数据库
(二)、实验环境
(三)、Apache Hadoop的体系结构(重要):实现Google的思想论文
1、HDFS:Hadoop Distributed File System
(*)主从结构
(*)主节点:NameNode名称节点
(*)从节点:DataNode数据节点
(*)SecondaryNameNode:第二名称节点
2、Yarn:是一个容器,运行MapReduce程序
(*)主从结构
(*)主节点:ResourceManager 资源管理器
(*)从节点:NodeManager 节点管理器
3、HBase:需要单独安装
(*)主从结构
(*)主节点:HMaster
(*)从节点:RegionServer
(四)、Hadoop 2.X的安装与配置
Hadoop有三种安装模式
1、本地模式 一台Linux
2、伪分布模式 一台Linux
3、全分布模式 三台Linux
4、掌握免密码登录的原理和配置
(五)、Hadoop应用案例分析
1、大数据背景下,企业级系统的架构的变化
2、HBase进行日志分析
3、了解:Hadoop在淘宝的应用
(六)、HDFS:Hadoop的分布式文件系统,数据存储
1、操作HDFS:(1)命令行 (2)Java API (3)网页:Web Console
2、原理:数据上传的过程
数据下载的过程
3、HDFS的底层实现:RPC和Java动态代理
RPC:remote procedure call
4、高级特性
(*)回收站
(*)快照snapshot:是一种备份
(*)配额quota:(1)名称配额 (2)空间配额
(*)安全模式:safemode
(*)权限
(七)、MapReduce:是一个计算模型,可以用Java来实现
1、Demo:经典WordCount
2、重点:MapReduce处理数据的过程
3、原理:Yarn执行MapReduce的过程
4、MapReduce的高级特性
(*)序列化
(*)排序
(*)分区
(*)合并
5、MapReduce的核心:Shuffle(洗牌)
6、编程案例:
(*)排序:order by
(*)去重:distinct
(*)多表查询
(*)倒排索引
补充:MySQL数据库
(八)、Hive:蜂巢 数据分析的引擎:翻译器 SQL ---------------> MapReduce
(九)、Pig: 猪 数据分析的引擎:翻译器 PigLatin语言 ------> MapReduce
(十)、HBase: NoSQL数据库
1、是基于Hadoop之上的NoSQL
2、体系结构:HMaster、RegionServer
3、搭建:本地模式、伪分布模式、全分布模式
4、操作:命令行、Java API、Web Console
5、过滤器:实现复杂的查询
6、HBase上的MapReduce
(十一)、Sqoop:数据采集引擎,采集关系型数据库中的数据
(十二)、Flume:数据采集引擎,采集日志
(十三)、HUE:基于Web的管理工具
(十四)、ZooKeeper: 相当于是一个”数据库“,实现HA(High Avaiblity高可用性)
(十五)、Hadoop的集群和HA
1、HDFS的联盟(Federation)
2、Hadoop的HA(High Avaiblity高可用性)
(十六)、Redis:基于内存的NoSQL数据库,提高性能
(十七)、Storm:处理流式数据(实时计算)
集成Storm和Redis
一、Google的基本思想
1、GFS
2、MapReduce:计算模型,进行大数据计算
问题的来源:PageRank(网页排名)
核心:先拆分,再合并
3、BigTable:大表,NoSQL数据库:HBase 基于HDFS之上的NoSQL数据库、列式数据库
表 ----> 目录
数据 ----> 文件
思想:通过牺牲存储的空间,来换取性能
把所有的数据存入一张表中,完全违背了关系型数据库范式的要求
二、Hadoop 2.X的安装与配置
习惯:SecureCRT
准备:1、安装Linux和JDK
2、关闭防火墙
3、配置主机名
解压:tar -zxvf hadoop-2.7.3.tar.gz -C ~/training/
设置环境变量:vi ~/.bash_profile
HADOOP_HOME=/root/training/hadoop-2.7.3
export HADOOP_HOME
PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
export PATH
source ~/.bash_profile
介绍Hadoop的目录结构
Hadoop有三种安装模式
1、本地模式 一台Linux
(*)特点:没有HDFS,只能测试MapReduce程序(本地数据:Linux的文件)
(*)配置:hadoop-env.sh
26行 export JAVA_HOME=/root/training/jdk1.8.0_144
(*)Demo:测试MapReduce程序
example: /root/training/hadoop-2.7.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar
hadoop jar hadoop-mapreduce-examples-2.7.3.jar wordcount ~/temp/data.txt ~/temp/mr/wc1
2、伪分布模式 一台Linux
(*)特点:在单机上,模拟一个分布式的环境,具备Hadoop的所有功能
(*)hdfs-site.xml
<!--数据块的冗余度,默认是3-->
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<!--是否开启HDFS的权限检查,默认:true-->
<!--
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
-->
core-site.xml
<!--NameNode的地址-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://bigdata11:9000</value>
</property>
<!--HDFS数据保存的目录,默认是Linux的tmp目录-->
<property>
<name>hadoop.tmp.dir</name>
<value>/root/training/hadoop-2.7.3/tmp</value>
</property>
mapred-site.xml
<!--MR程序运行的容器是Yarn-->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
yarn-site.xml
<!--ResourceManager的地址-->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>bigdata11</value>
</property>
<!--NodeManager运行MR任务的方式-->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
对NameNode进行格式化: hdfs namenode -format
日志:Storage directory /root/training/hadoop-2.7.3/tmp/dfs/name has been successfully formatted.
启动:start-all.sh = start-dfs.sh + start-yarn.sh
(*)Demo:测试MapReduce程序
example: /root/training/hadoop-2.7.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar
hadoop jar hadoop-mapreduce-examples-2.7.3.jar wordcount /input/data.txt /output/wc1204
3、全分布模式 三台Linux
(*)特点:真正的分布式环境,用于生产
4、掌握免密码登录的原理和配置
第二章
一、搭建Hadoop的全分布模式
1、三台机器:bigdata12 bigdata13 bigdata14
2、每台机器准备工作:安装JDK、关闭防火墙、设置主机名
systemctl stop firewalld.service
systemctl disable firewalld.service
设置主机名 vi /etc/hosts
192.168.157.12 bigdata12
192.168.157.13 bigdata13
192.168.157.14 bigdata14
3、配置免密码登录
(1)在每台机器上产生公钥和私钥
ssh-keygen -t rsa
(2)需要将每台机器的公钥复制给其他机器(下面的三句话,需要在每台机器上执行)
ssh-copy-id -i .ssh/id_rsa.pub root@bigdata12
ssh-copy-id -i .ssh/id_rsa.pub root@bigdata13
ssh-copy-id -i .ssh/id_rsa.pub root@bigdata14
4、保证每台机器的时间同步的
5、安装Hadoop的全分布环境(在主节点bigdata12上安装)
(1)解压设置环境变量
(2)修改配置文件
hadoop-env.sh
26行 export JAVA_HOME=/root/training/jdk1.8.0_144
hdfs-site.xml
<!--数据块的冗余度,默认是3-->
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<!--是否开启HDFS的权限检查,默认:true-->
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
core-site.xml
<!--NameNode的地址-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://bigdata12:9000</value>
</property>
<!--HDFS数据保存的目录,默认是Linux的tmp目录-->
<property>
<name>hadoop.tmp.dir</name>
<value>/root/training/hadoop-2.7.3/tmp</value>
</property>
mapred-site.xml
<!--MR程序运行的容器是Yarn-->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
yarn-site.xml
<!--ResourceManager的地址-->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>bigdata12</value>
</property>
<!--NodeManager运行MR任务的方式-->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
slaves: 配置的是所有的从节点
bigdata13
bigdata14
(3)格式化NameNode: hdfs namenode -format
6、将配置好的目录复制到bigdata13和bigdata14上
scp -r hadoop-2.7.3/ root@bigdata13:/root/training
scp -r hadoop-2.7.3/ root@bigdata14:/root/training
7、启动Hadoop集群(在主节点上): start-all.sh
stop-all.sh
8、验证
(*)命令行:hdfs dfsadmin -report
(*)网页:HDFS:http://192.168.157.12:50070/
Yarn:http://192.168.157.12:8088
第四章:Hadoop的体系结构(非常重要):原理、结构、运行机制
问题:Putty或者SecureCRT连不上
一、HDFS的体系结构和运行原理
1、主节点:NameNode
(*)职责:管理HDFS
接收客户端的请求:上传数据、下载数据
管理和维护日志(edits文件)和元信息(指的是:数据块的位置信息:fsimage文件)
(*)HDFS的日志:edits文件
举例: 创建目录 ---> 产生日志
hdfs dfs -mkdir /mydemo1
查找edits文件:find . -name edits*
(1) edits_inprogress_0000000000000000105是二进制文件
(2)HDFS提供一个工具:edits viewer 日志查看器,转换成一个XML文件
hdfs oev -i edits_inprogress_0000000000000000105 -o ~/a.xml
<RECORD>
<OPCODE>OP_MKDIR</OPCODE>
<DATA>
<TXID>107</TXID>
<LENGTH>0</LENGTH>
<INODEID>16416</INODEID>
<PATH>/mydemo1</PATH>
<TIMESTAMP>1512565581211</TIMESTAMP>
<PERMISSION_STATUS>
<USERNAME>root</USERNAME>
<GROUPNAME>supergroup</GROUPNAME>
<MODE>493</MODE>
</PERMISSION_STATUS>
</DATA>
</RECORD>
(*)HDFS的元信息:fsimage文件:记录数据块的位置信息、冗余信息等等
查找fsimage文件:find . -name fsimage*
也是二进制的
HDFS也提供了一个工具:image viewer ,把fsimage文件转成文本、XML的文件
(*)问题:edits文件和fsimage文件,哪个文件体现了HDFS的最新状态?
2、从节点:DataNode
(*)按数据块保存数据:1.x:64M 2.x:128M
(*)数据块在操作系统的位置:
find . -name blk*
/root/training/hadoop-2.7.3/tmp/dfs/data/current/BP-156326068-192.168.157.11-1512395988927/current/finalized/subdir0/subdir0
(*)设置数据块冗余度的基本原则
一般,冗余度跟数据节点的个数一样,最大不要超过3
(*)一定做一下实验
3、第二名称节点:SecondaryNameNode,默认就跟NameNode在一起
(*)职责:定期进行日志信息的合并,edits ---> fsimage中
(*)掌握日志合并过程(重要)
二、Yarn的体系结构和运行原理:运行MapReduce的容器
hadoop jar hadoop-mapreduce-examples-2.7.3.jar wordcount /input/data.txt /output/wc1206
1、主节点:ResourceManager
职责:(*)接收任务请求
(*)资源的分配
(*)任务分配
2、从节点:NodeManager
职责:(*)从ResourceManager获取任务和资源
(*)执行
3、调度MR任务的过程
4、资源分配方式
(1)FIFO Scheduler:先来先得
(2)Capacity Scheduler:容器管理
(3)Fair Scheduler:公平调度管理 ,前提:假设任务具有相同优先级,平均分配资源
三、HBase的体系结构和运行原理
HBase是基于HDFS之上的NoSQL数据库
1、主节点:HMaster
2、从节点:RegionServer
四、主从结构的单点故障问题及解决方案(了解)
第五章:HDFS
一、操作HDFS
1、Web Console:端口50070
2、命令行:有两种类型
(1)普通操作命令: hdfs dfs ******
命令
-mkdir:在HDFS上创建目录
hdfs dfs -mkdir /aaa
hdfs dfs -mkdir /bbb/ccc
如果父目录不存在,使用-p参数先创建父目录
-ls 查看HDFS的某个目录
-ls -R 查看HDFS的某个目录,包含子目录
简写: -lsr
-put 上传数据
-copyFromLocal 上传数据
-moveFromLocal 上传数据,相当于ctrl+x
-copyToLocal 下载数据
-get 下载数据
举例: hdfs dfs -get /input/data.txt .
-rm: 删除目录
-rmr: 删除目录,包括子目录
hdfs dfs -rmr /bbb
日志:
17/12/08 20:32:10 INFO fs.TrashPolicyDefault: Namenode trash configuration: Deletion interval = 0 minutes, Emptier interval = 0 minutes.
Deleted /bbb
-getmerge:把某个目录下的文件,合并后再下载
-cp:拷贝 hdfs dfs -cp /input/data.txt /input/data2.txt
-mv:移动 hdfs dfs -cp /input/data.txt /aaa/a.txt
-count: 举例:hdfs dfs -count /students
-du: 类似-count,信息更详细
hdfs dfs -du /students
例子:
# hdfs dfs -count /students
1 2 29 /students
# hdfs dfs -ls /students
Found 2 items
-rw-r--r-- 1 root supergroup 19 2017-12-08 20:35 /students/student01.txt
-rw-r--r-- 1 root supergroup 10 2017-12-08 20:35 /students/student02.txt
# hdfs dfs -du /students
19 /students/student01.txt
10 /students/student02.txt
-text、-cat: 查看文本的内容
hdfs dfs -cat /input/data.txt
balancer:平衡操作
hdfs balancer
(2)管理命令:hdfs dfsadmin ******
-report: 打印HDFS的报告
举例:hdfs dfsadmin -report
-safemode:安全模式
hdfs dfsadmin -safemode
Usage: hdfs dfsadmin [-safemode enter | leave | get | wait]
# hdfs dfsadmin -safemode get
Safe mode is OFF
# hdfs dfsadmin -safemode enter
Safe mode is ON
# hdfs dfs -mkdir /dddd
mkdir: Cannot create directory /dddd. Name node is in safe mode.
# hdfs dfsadmin -safemode leave
Safe mode is OFF
3、Java API
(1)创建一个目录:mkdir ----> 告诉:权限的问题
(2)上传数据、下载数据
(3)查询数据的元信息
依赖的jar包:
/root/training/hadoop-2.7.3/share/hadoop/common
/root/training/hadoop-2.7.3/share/hadoop/common/lib
/root/training/hadoop-2.7.3/share/hadoop/hdfs
/root/training/hadoop-2.7.3/share/hadoop/hdfs/lib
二、HDFS输出数据的原理(画图):比较重要
1、数据上传的原理(过程)
2、数据下载的原理(过程)
三、HDFS的高级特性
1、回收站
2、快照snapshot:备份
3、配额quota:(1)名称配额
(2)空间配额
4、HDFS安全模式: safemode
5、HDFS的权限
6、HDFS的集群:(1)联盟Federation
(2)HA
四、HDFS底层的原理:Java程序
1、Java的动态代理
2、RPC:remote procedure call 远程过程调用
第五章:HDFS
一、操作HDFS
1、Web Console:端口50070
2、命令行:有两种类型
3、Java API
二、HDFS输出数据的原理(画图):比较重要
1、数据上传的原理(过程)
2、数据下载的原理(过程)
缓存元信息的内存:1000M
文件:hadoop-env.sh
# The maximum amount of heap to use, in MB. Default is 1000.
#export HADOOP_HEAPSIZE=
#export HADOOP_NAMENODE_INIT_HEAPSIZE=""
三、HDFS的高级特性
1、回收站: recyclebin
日志
-rmr: 删除目录,包括子目录
hdfs dfs -rmr /bbb
日志:
17/12/08 20:32:10 INFO fs.TrashPolicyDefault: Namenode trash configuration: Deletion interval = 0 minutes, Emptier interval = 0 minutes.
Deleted /bbb
(*)默认,HDFS的回收站是关闭
(*)启用回收站:参数---> core-site.xml
本质:删除数据的时候,实际是一个ctrl+x操作
<property>
<name>fs.trash.interval</name>
<value>1440</value>
</property>
日志:
hdfs dfs -rmr /folder1
rmr: DEPRECATED: Please use 'rm -r' instead.
17/12/11 21:05:57 INFO fs.TrashPolicyDefault: Namenode trash configuration: Deletion interval = 1440 minutes, Emptier interval = 0 minutes.
Moved: 'hdfs://bigdata11:9000/folder1' to trash at: hdfs://bigdata11:9000/user/root/.Trash/Current
(*)恢复:实际就是cp,拷贝
hdfs dfs -cp /user/root/.Trash/Current/input/data.txt /input
清空:hdfs dfs -expunge
(*)补充:Oracle数据库也有回收站
SQL> select * from tab;
TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
BIN$WBSNMvxJpWvgUAB/AQBygg==$0 TABLE
BONUS TABLE
DEPT TABLE
EMP TABLE
RESULT TABLE
SALGRADE TABLE
6 rows selected.
SQL> -- drop table mydemo1;
SQL> show recyclebin;
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
MYDEMO1 BIN$WBSNMvxJpWvgUAB/AQBygg==$0 TABLE 2017-09-01:06:56:15
SQL> select count(*) from mydemo1;
select count(*) from mydemo1
*
ERROR at line 1:
ORA-00942: table or view does not exist
SQL> select count(*) from BIN$WBSNMvxJpWvgUAB/AQBygg==$0;
select count(*) from BIN$WBSNMvxJpWvgUAB/AQBygg==$0
*
ERROR at line 1:
ORA-00933: SQL command not properly ended
SQL> select count(*) from "BIN$WBSNMvxJpWvgUAB/AQBygg==$0";
COUNT(*)
----------
30
SQL> flashback table mydemo1 to before drop;
Flashback complete.
SQL> show recyclebin;
SQL> select count(*) from mydemo1;
COUNT(*)
----------
30
2、快照snapshot:备份 ---> 一般来说:不建议使用快照
(*)默认:HDFS的快照是禁用的
(*)第一步:管理员开启某个目录的快照功能
[-allowSnapshot <snapshotDir>]
[-disallowSnapshot <snapshotDir>]
hdfs dfsadmin -allowSnapshot /mydir1
(*)第二步:使用HDFS的操作命令,创建快照
[-createSnapshot <snapshotDir> [<snapshotName>]]
[-deleteSnapshot <snapshotDir> <snapshotName>]
[-renameSnapshot <snapshotDir> <oldName> <newName>]
hdfs dfs -createSnapshot /mydir1 mydir1_backup_01
日志:Created snapshot /mydir1/.snapshot/mydir1_backup_01
本质:将数据拷贝一份到当前目录的一个隐藏目录下
(*)继续试验
hdfs dfs -put student02.txt /mydir1
hdfs dfs -createSnapshot /mydir1 mydir1_backup_02
对比快照: hdfs snapshotDiff /mydir1 mydir1_backup_01 mydir1_backup_02
Difference between snapshot mydir1_backup_01 and snapshot mydir1_backup_02 under directory /mydir1:
M .
+ ./student02.txt
3、配额quota:(1)名称配额: 规定某个目录下,存放文件(目录)的个数
实际的个数:N-1个
[-setQuota <quota> <dirname>...<dirname>]
[-clrQuota <dirname>...<dirname>]
hdfs dfs -mkdir /quota1
设置该目录的名称配额:3
hdfs dfsadmin -setQuota 3 /quota1
当我们放第三个文件的时候
hdfs dfs -put data.txt /quota1
put: The NameSpace quota (directories and files) of directory /quota1 is exceeded: quota=3 file count=4
(2)空间配额: 规定某个目录下,文件的大小
[-setSpaceQuota <quota> [-storageType <storagetype>] <dirname>...<dirname>]
[-clrSpaceQuota [-storageType <storagetype>] <dirname>...<dirname>]
hdfs dfs -mkdir /quota2
设置该目录的空间配额是:10M
hdfs dfsadmin -setSpaceQuota 10M /quota2
正确的做法:hdfs dfsadmin -setSpaceQuota 130M /quota2
放一个小于10M的文件,会出错
Caused by: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.hdfs.protocol.DSQuotaExceededException): The DiskSpace quota of /quota2 is exceeded: quota = 10485760 B = 10 MB but diskspace consumed = 134217728 B = 128 MB
注意:尽管数据不到128M,但是占用的数据块依然是128M
切记:当设置空间配额的时候,这个值不能小于128M
4、HDFS安全模式: safemode ---> HDFS只读
命令: hdfs dfsadmin -safemode get|wait|leave|enter
作用:检查数据块的副本率,如果副本率不满足要求,就会进行水平复制
5、HDFS的权限
6、HDFS的集群:开个头
集群的两大功能:负载均衡,高可用(失败迁移)
(1)NameNode联盟(Federation) ----> HDFS
(2)HA: HDFS、Yarn、HBase、Storm、Spark ---> 都需要ZooKeeper
四、HDFS底层的原理:Java程序
1、Java的动态代理
2、RPC:remote procedure call 远程过程调用
HDFS的底层原理
1、Java的动态代理对象
再举一个例子:数据库的连接池 ----> 返回的Connection,不是真正的Connection,而是一个代理对象
实现一个接口:DataSource
准备环境:安装一个MySQL数据库
Hive的安装
在虚拟机上安装MySQL:
yum remove mysql-libs
rpm -ivh mysql-community-common-5.7.19-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-5.7.19-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-5.7.19-1.el7.x86_64.rpm
rpm -ivh mysql-community-server-5.7.19-1.el7.x86_64.rpm
rpm -ivh mysql-community-devel-5.7.19-1.el7.x86_64.rpm (可选)
启动MySQL:service mysqld start
或者:systemctl start mysqld.service
查看root用户的密码:cat /var/log/mysqld.log | grep password
登录后修改密码:alter user 'root'@'localhost' identified by 'Welcome_1';
MySQL数据库的配置:
创建一个新的数据库:create database hive;
创建一个新的用户:
create user 'hiveowner'@'%' identified by 'Welcome_1';
给该用户授权
grant all on hive.* TO 'hiveowner'@'%';
grant all on hive.* TO 'hiveowner'@'localhost' identified by 'Welcome_1';
2、RPC:RPC(Remote Procedure Call)——远程过程调用,类似Web Service
六、MapReduce程序开发
1、Demo:WordCount单词计数
/root/training/hadoop-2.7.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar
执行:
hadoop jar hadoop-mapreduce-examples-2.7.3.jar wordcount /input/data.txt /output/mr/wc1213
分析WordCount程序数据处理的过程(非常重要)
2、开发自己的WordCount程序
开发一个MapReduce:求每个部门的工资总额
3、MapReduce的一些高级特性
(1)序列化:类似Java的序列化
(2)排序:默认排序:数字 升序
字符串 字典顺序
对象的排序:按照员工的薪水排序
(3)分区:Partition,默认情况下,MapReduce只有一个分区,意思是:只有一个输出文件
(4)合并:Combiner,在Mapper端,先做一次Reducer,用于减少输出到Reducer中的数据,从而提高效率
(5)MapReduce的核心:Shuffle(洗牌)
七、MapReduce的编程案例
六、MapReduce程序开发
1、Demo:WordCount单词计数
/root/training/hadoop-2.7.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar
执行:
hadoop jar hadoop-mapreduce-examples-2.7.3.jar wordcount /input/data.txt /output/mr/wc1213
分析WordCount程序数据处理的过程(非常重要)
2、开发自己的WordCount程序
需要包含的jar:
/root/training/hadoop-2.7.3/share/hadoop/common
/root/training/hadoop-2.7.3/share/hadoop/common/lib
/root/training/hadoop-2.7.3/share/hadoop/mapreduce
/root/training/hadoop-2.7.3/share/hadoop/mapreduce/lib
再举一个例子:开发一个MapReduce:求每个部门的工资总额
数据:员工表
SQL> select deptno,sum(sal) from emp group by deptno order by deptno;
DEPTNO SUM(SAL)
---------- ----------
10 8750
20 10875
30 9400
3、MapReduce的一些高级特性
(1)序列化:类似Java的序列化
如果一个类实现了的Hadoop的序列化机制(接口:Writable),这个类的对象就可以作为输入和输出的值
举例1:使用Employee类来封装员工信息,并且作为Map和Reduce的输入和输出
一定注意:序列化的顺序和反序列化的顺序要一致
举例2:使用序列化Employee重写 求每个部门的工资总额
(2)排序:注意:按照key2进行排序
默认排序:数字 升序
字符串 字典顺序
对象的排序:按照员工的薪水排序
如果要改变默认的排序规则,需要创建一个自己的比较器
(3)分区:Partition,默认情况下,MapReduce只有一个分区,意思是:只有一个输出文件
(4)合并:Combiner,在Mapper端,先做一次Reducer,用于减少输出到Reducer中的数据,从而提高效率
(5)MapReduce的核心:Shuffle(洗牌)
七、MapReduce的编程案例
一、排序:按照key2进行排序
1、数字的排序
2、字符串的排序
3、对象的排序: 实现WritableComparable接口 (1)序列化 (2)可被排序
员工数据 Employee.java ----> 作为key2输出
复习SQL:order by 后面 + 列名、表达式、别名、序号 desc
desc 只作用于离他最近的一个列
order by a desc,b desc
(1)一个列的排序
(2)多个列的排序
二、分区:Partition: 根据Map的输出(k2 v2)进行分区
1、默认情况下,MapReduce只有一个分区(只有一个输出文件)
2、什么是分区?(重要)
3、举例:Demo: 按照员工的部门号进行分区,相同部门号的员工输出到一个分区中
日志:
17/12/18 21:47:24 INFO mapreduce.Job: map 100% reduce 0%
17/12/18 21:47:49 INFO mapreduce.Job: map 100% reduce 33%
17/12/18 21:47:55 INFO mapreduce.Job: map 100% reduce 67%
17/12/18 21:47:56 INFO mapreduce.Job: map 100% reduce 100%
三、合并:Combiner
1、MapReduce的任务中,可以没有Combiner
2、Combiner是一种特殊的Reducer,是在Mapper端先做一次Reducer,用来减少Map的输出,从而提高的效率。
3、注意事项:
(1)有些情况,不能使用Combiner -----> 求平均值
(2)引入Combiner,不引人Combiner,一定不能改变原理的逻辑。(MapReduce编程案例:实现倒排索引)
错误:
Error: java.io.IOException: wrong value class: class org.apache.hadoop.io.DoubleWritable is not class org.apache.hadoop.io.IntWritable
四、什么时候Shuffle
五、MapReduce编程案例
一、什么是Shuffle(洗牌) ----> MapReduce核心
1、序列化
2、排序
3、分区
4、合并
二、MapReduce编程案例 ------> 掌握方法:如何开发一个程序
1、数据去重:
复习:SQL:distinct去掉重复的数据
作用于后面所有的列
复习(学习):Oracle中的多表查询
根据连接条件的不同:
(1)等值连接
(2)不等值连接
(3)外链接
(4)自连接
注意:(1)多表查询和子查询,尽量使用哪个?(多表查询)
(2)一般:多表查询的表的个数<=3 如果超过5个表,性能就差
2、多表查询:等值连接
查询员工信息:部门名称、员工姓名
select d.dname,e.ename
from emp e,dept d
where e.deptno=d.deptno;
问题:如果实现三张表??
3、多表查询:自连接: 通过表的别名,将同一张表看成多张表
查询员工信息:老板姓名 员工的姓名
select b.ename,e.ename
from emp b,emp e
where b.empno=e.mgr;
注意:产生的笛卡尔积= 原表的平方 ----> 自连接操作不适合操作大表
更好的方式:在Oracle中,使用层次查询(树)来取代自连接
4、倒排索引
5、使用单元测试:MRUnit
课程小结:
一、大数据的背景知识
1、什么是大数据?IBM五个v的特性。 举例:商品推荐、天气预报
2、数据仓库:就是一个数据库
3、OLTP和OLAP
4、Google的三篇论文
(1)GFS:HDFS
(2)MapReduce:PageRank搜索排名
(3)BigTable:大表---> HBase
二、Hadoop的体系结构
1、HDFS
(1)NameNode
(2)DataNode
(3)SecondaryNameNode
2、Yarn
(1)ResourceManager
(2)NodeManager
三、Hadoop的安装配置
1、注意:关闭防火墙、配置主机名、免密码登录(不对称加密)
2、三种模式:
(1)本地模式
(2)伪分布模式
(3)全分布模式
后面:HDFS的联盟、Hadoop的HA
四、HDFS
1、基本操作:命令行、Java、WebConsole
2、原理:上传和下载数据的过程
3、高级功能:回收站、快照、配额(名称、空间)、权限、安全模式
4、底层原理:代理对象和RPC
五、MapReduce
1、Linux操作系统
2、Hadoop的介质
3、Spark的介质
学习路线和课程简介:
1、基础:Java语言:Java基础(Java SE):变量 类型 循环 if
面向对象:类、封装、集成、多态
I/O:输入流、输出流
反射、泛型
JDBC: 操作关系型数据库
Linux基础
大数据:数据的处理 (1)离线计算 (2)实时计算
2、Hadoop
(1)数据储存:HDFS
(2)数据计算:MapReduce(Java程序) ---> 离线计算
(3)其他组件(生态圈):HBase、Hive、Pig、Flume、Sqoop*****
3、Storm:实时计算框架(Java语言)
(1)NoSQL:Redis内存数据库
(2)Storm中的内容
4、Spark:数据计算
(1)Scala编程语言:看成是Java的升级
(2)Spark Core:整个Spark的核心 ---> 相当于MapReduce
(3)Spark SQL
(4)Spark Streaming:实时计算框架
5、项目实战
第一章、Linux基础
一、Linux的实验环境
(*)版本:RedHat 7.4 64位 自带netcat服务器(测试:Spark Streaming)
(*)VM:12
(*)类型:Redhat Linx 7 64位
(*)网卡:仅主机模式
(*)一共5台虚拟机:安装JDK、配置主机名、关闭防火墙
192.168.157.11 bigdata11
192.168.157.12 bigdata12
192.168.157.13 bigdata13
192.168.157.14 bigdata14
192.168.157.15 bigdata15
二、配置Linux和Linux的目录结构
1、对Linux了解
2、关闭防火墙
查看防火墙的状态:systemctl status firewalld.service
关闭防火墙: systemctl stop firewalld.service
禁用防火墙(永久)systemctl disable firewalld.service
3、设置主机名 (配置文件) /etc/hosts
vi /etc/hosts
192.168.157.11 bigdata11
三、vi编辑器:相当于linux的记事本
三种模式:
1、编辑模式:等待命令的输入
按i--> 进入:插入模式
按:(冒号)进入命令模式
2、插入模式: 按esc键回到编辑模式
3、命令模式
(*) w: 保存
(*) q: 退出
(*) wq: 保存退出
(*) 打开行号:set number
关闭行号: set nonumber
(*) 换行: set wrap
set nowrap
四、文件目录操作命令(重点掌握:后面操作HDFS的时候,很方便)
(*)ls 显示文件和目录列表
-l 列出文件的详细信息
-a 列出当前目录所有文件,包含隐藏文件
隐藏文件:.bash_profile 设置环境变量:JAVA_HOME、HADOOP_HOME
隐藏目录:.ssh ----> 配置Hadoop和Spark的免密码登录
查询Hadoop的中文件:hdfs dfs -ls /
(*)当前目录:pwd
/root ---> root用户的HOME目录(快捷方式: ~)
(*)mkdir 创建目录
-p 父目录不存在情况下先生成父目录
约定:mkdir /root/tools ---> 所有的安装包
mkdir /root/training ---> 安装目录
在Hadoop中创建目录:hdfs dfs -mkdir /aaa
(*)cd 切换目录
(*)touch 生成一个空文件
echo 生成一个带内容文件 ----> 更常用的用法:查看环境变量
echo $JAVA_HOME
(*)cat、tac 显示文本文件内容
cat是从第一行开始写;tac是从最后一行开始写
举例: cat a.txt
查看Hadoop中文件的内容: hdfs dfs -cat /a.txt
(*)cp 复制文件或目录
cp a.txt data.txt
在Hadoop中拷贝数据: hdfs dfs -cp /a.txt /b.txt
(*)rm 删除文件
-r 同时删除该目录下的所有文件
-f 强制删除文件或目录
rm -rf a.txt
在Hadoop中删除文件:hdfs dfs -rmr /a.txt
(*)kill:杀死
参数: -9 强制杀死
-3
(*)tar命令:打包压缩
五、Linux的权限管理(Hadoop的HDFS权限非常像)
1、权限的类型:r 读
w 写
x 执行
2、使用ls -l或者ll命令查看权限
六、安装常用软件:安装JDK的时候,讲讲tar命令
tar -zxvf jdk-8u144-linux-x64.tar.gz -C ~/training/
设置环境变量:vi ~/.bash_profile
JAVA_HOME=/root/training/jdk1.8.0_144
export JAVA_HOME
PATH=$JAVA_HOME/bin:$PATH
export PATH
生效环境变量: source ~/.bash_profile
七、案例:Java的死锁分析 ---> 介绍一个工具(kill -3 的命令)
目的:找到死锁 性能诊断
Java提供了一个非常强大的性能诊断工具:Thread Dump(文本信息)
1、Linux:kill -3 PID(就是Java的进程号)
2、Windows: 按ctrl+break(fn+B)键
学习大数据,学什么?怎么学?
1、原理和运行机制、体系结构(非常重要)
2、动手:搭建环境、写程序
目的:1、学习内容 2、熟悉一些名词
一、各章概述(Hadoop部分)
(一)、Hadoop的起源与背景知识
1、什么是大数据?两个例子、大数据的核心问题是什么?
举例:(1)商品推荐:问题1:大量的订单如何存储? 问题2:大量的订单如何计算?
(2)天气预报:问题1:大量的天气数据如何存储? 问题2:大量的天气数据如何计算?
大数据的核心问题:(1)数据的存储:分布式文件系统(分布式存储)
(2)数据的计算:分布式计算
2、概念:数据仓库(Data warehouse)
(1)我们可以把Hadoop和Spark看成是数据仓库的一种实现方式
(2)数据仓库就是一个数据库,一般只做select
(3)重要:掌握数据仓库搭建的过程
(4)数据仓库又是一种OLAP的应用系统
3、概念:OLTP和OLAP
(1)OLTP:online transaction processing 联机事务处理
(2)OLAP:online analytic processing 联机分析处理 ------> 一般:不会修改(删除)数据
4、(最重要的内容)Google的几篇论文:3篇
(1)GFS:Google File System -----> HDFS ----> 解决:数据的存储
(2)MapReduce计算模型 -----> Hadoop MapReduce ----> 解决:数据的计算
(3)BigTable大表 -----> HBase是NoSQL数据库
(二)、实验环境
(三)、Apache Hadoop的体系结构(重要):实现Google的思想论文
1、HDFS:Hadoop Distributed File System
(*)主从结构
(*)主节点:NameNode名称节点
(*)从节点:DataNode数据节点
(*)SecondaryNameNode:第二名称节点
2、Yarn:是一个容器,运行MapReduce程序
(*)主从结构
(*)主节点:ResourceManager 资源管理器
(*)从节点:NodeManager 节点管理器
3、HBase:需要单独安装
(*)主从结构
(*)主节点:HMaster
(*)从节点:RegionServer
(四)、Hadoop 2.X的安装与配置
Hadoop有三种安装模式
1、本地模式 一台Linux
2、伪分布模式 一台Linux
3、全分布模式 三台Linux
4、掌握免密码登录的原理和配置
(五)、Hadoop应用案例分析
1、大数据背景下,企业级系统的架构的变化
2、HBase进行日志分析
3、了解:Hadoop在淘宝的应用
(六)、HDFS:Hadoop的分布式文件系统,数据存储
1、操作HDFS:(1)命令行 (2)Java API (3)网页:Web Console
2、原理:数据上传的过程
数据下载的过程
3、HDFS的底层实现:RPC和Java动态代理
RPC:remote procedure call
4、高级特性
(*)回收站
(*)快照snapshot:是一种备份
(*)配额quota:(1)名称配额 (2)空间配额
(*)安全模式:safemode
(*)权限
(七)、MapReduce:是一个计算模型,可以用Java来实现
1、Demo:经典WordCount
2、重点:MapReduce处理数据的过程
3、原理:Yarn执行MapReduce的过程
4、MapReduce的高级特性
(*)序列化
(*)排序
(*)分区
(*)合并
5、MapReduce的核心:Shuffle(洗牌)
6、编程案例:
(*)排序:order by
(*)去重:distinct
(*)多表查询
(*)倒排索引
补充:MySQL数据库
(八)、Hive:蜂巢 数据分析的引擎:翻译器 SQL ---------------> MapReduce
(九)、Pig: 猪 数据分析的引擎:翻译器 PigLatin语言 ------> MapReduce
(十)、HBase: NoSQL数据库
1、是基于Hadoop之上的NoSQL
2、体系结构:HMaster、RegionServer
3、搭建:本地模式、伪分布模式、全分布模式
4、操作:命令行、Java API、Web Console
5、过滤器:实现复杂的查询
6、HBase上的MapReduce
(十一)、Sqoop:数据采集引擎,采集关系型数据库中的数据
(十二)、Flume:数据采集引擎,采集日志
(十三)、HUE:基于Web的管理工具
(十四)、ZooKeeper: 相当于是一个”数据库“,实现HA(High Avaiblity高可用性)
(十五)、Hadoop的集群和HA
1、HDFS的联盟(Federation)
2、Hadoop的HA(High Avaiblity高可用性)
(十六)、Redis:基于内存的NoSQL数据库,提高性能
(十七)、Storm:处理流式数据(实时计算)
集成Storm和Redis
一、Google的基本思想
1、GFS
2、MapReduce:计算模型,进行大数据计算
问题的来源:PageRank(网页排名)
核心:先拆分,再合并
3、BigTable:大表,NoSQL数据库:HBase 基于HDFS之上的NoSQL数据库、列式数据库
表 ----> 目录
数据 ----> 文件
思想:通过牺牲存储的空间,来换取性能
把所有的数据存入一张表中,完全违背了关系型数据库范式的要求
二、Hadoop 2.X的安装与配置
习惯:SecureCRT
准备:1、安装Linux和JDK
2、关闭防火墙
3、配置主机名
解压:tar -zxvf hadoop-2.7.3.tar.gz -C ~/training/
设置环境变量:vi ~/.bash_profile
HADOOP_HOME=/root/training/hadoop-2.7.3
export HADOOP_HOME
PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
export PATH
source ~/.bash_profile
介绍Hadoop的目录结构
Hadoop有三种安装模式
1、本地模式 一台Linux
(*)特点:没有HDFS,只能测试MapReduce程序(本地数据:Linux的文件)
(*)配置:hadoop-env.sh
26行 export JAVA_HOME=/root/training/jdk1.8.0_144
(*)Demo:测试MapReduce程序
example: /root/training/hadoop-2.7.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar
hadoop jar hadoop-mapreduce-examples-2.7.3.jar wordcount ~/temp/data.txt ~/temp/mr/wc1
2、伪分布模式 一台Linux
(*)特点:在单机上,模拟一个分布式的环境,具备Hadoop的所有功能
(*)hdfs-site.xml
<!--数据块的冗余度,默认是3-->
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<!--是否开启HDFS的权限检查,默认:true-->
<!--
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
-->
core-site.xml
<!--NameNode的地址-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://bigdata11:9000</value>
</property>
<!--HDFS数据保存的目录,默认是Linux的tmp目录-->
<property>
<name>hadoop.tmp.dir</name>
<value>/root/training/hadoop-2.7.3/tmp</value>
</property>
mapred-site.xml
<!--MR程序运行的容器是Yarn-->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
yarn-site.xml
<!--ResourceManager的地址-->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>bigdata11</value>
</property>
<!--NodeManager运行MR任务的方式-->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
对NameNode进行格式化: hdfs namenode -format
日志:Storage directory /root/training/hadoop-2.7.3/tmp/dfs/name has been successfully formatted.
启动:start-all.sh = start-dfs.sh + start-yarn.sh
(*)Demo:测试MapReduce程序
example: /root/training/hadoop-2.7.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar
hadoop jar hadoop-mapreduce-examples-2.7.3.jar wordcount /input/data.txt /output/wc1204
3、全分布模式 三台Linux
(*)特点:真正的分布式环境,用于生产
4、掌握免密码登录的原理和配置
第二章
一、搭建Hadoop的全分布模式
1、三台机器:bigdata12 bigdata13 bigdata14
2、每台机器准备工作:安装JDK、关闭防火墙、设置主机名
systemctl stop firewalld.service
systemctl disable firewalld.service
设置主机名 vi /etc/hosts
192.168.157.12 bigdata12
192.168.157.13 bigdata13
192.168.157.14 bigdata14
3、配置免密码登录
(1)在每台机器上产生公钥和私钥
ssh-keygen -t rsa
(2)需要将每台机器的公钥复制给其他机器(下面的三句话,需要在每台机器上执行)
ssh-copy-id -i .ssh/id_rsa.pub root@bigdata12
ssh-copy-id -i .ssh/id_rsa.pub root@bigdata13
ssh-copy-id -i .ssh/id_rsa.pub root@bigdata14
4、保证每台机器的时间同步的
5、安装Hadoop的全分布环境(在主节点bigdata12上安装)
(1)解压设置环境变量
(2)修改配置文件
hadoop-env.sh
26行 export JAVA_HOME=/root/training/jdk1.8.0_144
hdfs-site.xml
<!--数据块的冗余度,默认是3-->
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<!--是否开启HDFS的权限检查,默认:true-->
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
core-site.xml
<!--NameNode的地址-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://bigdata12:9000</value>
</property>
<!--HDFS数据保存的目录,默认是Linux的tmp目录-->
<property>
<name>hadoop.tmp.dir</name>
<value>/root/training/hadoop-2.7.3/tmp</value>
</property>
mapred-site.xml
<!--MR程序运行的容器是Yarn-->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
yarn-site.xml
<!--ResourceManager的地址-->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>bigdata12</value>
</property>
<!--NodeManager运行MR任务的方式-->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
slaves: 配置的是所有的从节点
bigdata13
bigdata14
(3)格式化NameNode: hdfs namenode -format
6、将配置好的目录复制到bigdata13和bigdata14上
scp -r hadoop-2.7.3/ root@bigdata13:/root/training
scp -r hadoop-2.7.3/ root@bigdata14:/root/training
7、启动Hadoop集群(在主节点上): start-all.sh
stop-all.sh
8、验证
(*)命令行:hdfs dfsadmin -report
(*)网页:HDFS:http://192.168.157.12:50070/
Yarn:http://192.168.157.12:8088
第四章:Hadoop的体系结构(非常重要):原理、结构、运行机制
问题:Putty或者SecureCRT连不上
一、HDFS的体系结构和运行原理
1、主节点:NameNode
(*)职责:管理HDFS
接收客户端的请求:上传数据、下载数据
管理和维护日志(edits文件)和元信息(指的是:数据块的位置信息:fsimage文件)
(*)HDFS的日志:edits文件
举例: 创建目录 ---> 产生日志
hdfs dfs -mkdir /mydemo1
查找edits文件:find . -name edits*
(1) edits_inprogress_0000000000000000105是二进制文件
(2)HDFS提供一个工具:edits viewer 日志查看器,转换成一个XML文件
hdfs oev -i edits_inprogress_0000000000000000105 -o ~/a.xml
<RECORD>
<OPCODE>OP_MKDIR</OPCODE>
<DATA>
<TXID>107</TXID>
<LENGTH>0</LENGTH>
<INODEID>16416</INODEID>
<PATH>/mydemo1</PATH>
<TIMESTAMP>1512565581211</TIMESTAMP>
<PERMISSION_STATUS>
<USERNAME>root</USERNAME>
<GROUPNAME>supergroup</GROUPNAME>
<MODE>493</MODE>
</PERMISSION_STATUS>
</DATA>
</RECORD>
(*)HDFS的元信息:fsimage文件:记录数据块的位置信息、冗余信息等等
查找fsimage文件:find . -name fsimage*
也是二进制的
HDFS也提供了一个工具:image viewer ,把fsimage文件转成文本、XML的文件
(*)问题:edits文件和fsimage文件,哪个文件体现了HDFS的最新状态?
2、从节点:DataNode
(*)按数据块保存数据:1.x:64M 2.x:128M
(*)数据块在操作系统的位置:
find . -name blk*
/root/training/hadoop-2.7.3/tmp/dfs/data/current/BP-156326068-192.168.157.11-1512395988927/current/finalized/subdir0/subdir0
(*)设置数据块冗余度的基本原则
一般,冗余度跟数据节点的个数一样,最大不要超过3
(*)一定做一下实验
3、第二名称节点:SecondaryNameNode,默认就跟NameNode在一起
(*)职责:定期进行日志信息的合并,edits ---> fsimage中
(*)掌握日志合并过程(重要)
二、Yarn的体系结构和运行原理:运行MapReduce的容器
hadoop jar hadoop-mapreduce-examples-2.7.3.jar wordcount /input/data.txt /output/wc1206
1、主节点:ResourceManager
职责:(*)接收任务请求
(*)资源的分配
(*)任务分配
2、从节点:NodeManager
职责:(*)从ResourceManager获取任务和资源
(*)执行
3、调度MR任务的过程
4、资源分配方式
(1)FIFO Scheduler:先来先得
(2)Capacity Scheduler:容器管理
(3)Fair Scheduler:公平调度管理 ,前提:假设任务具有相同优先级,平均分配资源
三、HBase的体系结构和运行原理
HBase是基于HDFS之上的NoSQL数据库
1、主节点:HMaster
2、从节点:RegionServer
四、主从结构的单点故障问题及解决方案(了解)
第五章:HDFS
一、操作HDFS
1、Web Console:端口50070
2、命令行:有两种类型
(1)普通操作命令: hdfs dfs ******
命令
-mkdir:在HDFS上创建目录
hdfs dfs -mkdir /aaa
hdfs dfs -mkdir /bbb/ccc
如果父目录不存在,使用-p参数先创建父目录
-ls 查看HDFS的某个目录
-ls -R 查看HDFS的某个目录,包含子目录
简写: -lsr
-put 上传数据
-copyFromLocal 上传数据
-moveFromLocal 上传数据,相当于ctrl+x
-copyToLocal 下载数据
-get 下载数据
举例: hdfs dfs -get /input/data.txt .
-rm: 删除目录
-rmr: 删除目录,包括子目录
hdfs dfs -rmr /bbb
日志:
17/12/08 20:32:10 INFO fs.TrashPolicyDefault: Namenode trash configuration: Deletion interval = 0 minutes, Emptier interval = 0 minutes.
Deleted /bbb
-getmerge:把某个目录下的文件,合并后再下载
-cp:拷贝 hdfs dfs -cp /input/data.txt /input/data2.txt
-mv:移动 hdfs dfs -cp /input/data.txt /aaa/a.txt
-count: 举例:hdfs dfs -count /students
-du: 类似-count,信息更详细
hdfs dfs -du /students
例子:
# hdfs dfs -count /students
1 2 29 /students
# hdfs dfs -ls /students
Found 2 items
-rw-r--r-- 1 root supergroup 19 2017-12-08 20:35 /students/student01.txt
-rw-r--r-- 1 root supergroup 10 2017-12-08 20:35 /students/student02.txt
# hdfs dfs -du /students
19 /students/student01.txt
10 /students/student02.txt
-text、-cat: 查看文本的内容
hdfs dfs -cat /input/data.txt
balancer:平衡操作
hdfs balancer
(2)管理命令:hdfs dfsadmin ******
-report: 打印HDFS的报告
举例:hdfs dfsadmin -report
-safemode:安全模式
hdfs dfsadmin -safemode
Usage: hdfs dfsadmin [-safemode enter | leave | get | wait]
# hdfs dfsadmin -safemode get
Safe mode is OFF
# hdfs dfsadmin -safemode enter
Safe mode is ON
# hdfs dfs -mkdir /dddd
mkdir: Cannot create directory /dddd. Name node is in safe mode.
# hdfs dfsadmin -safemode leave
Safe mode is OFF
3、Java API
(1)创建一个目录:mkdir ----> 告诉:权限的问题
(2)上传数据、下载数据
(3)查询数据的元信息
依赖的jar包:
/root/training/hadoop-2.7.3/share/hadoop/common
/root/training/hadoop-2.7.3/share/hadoop/common/lib
/root/training/hadoop-2.7.3/share/hadoop/hdfs
/root/training/hadoop-2.7.3/share/hadoop/hdfs/lib
二、HDFS输出数据的原理(画图):比较重要
1、数据上传的原理(过程)
2、数据下载的原理(过程)
三、HDFS的高级特性
1、回收站
2、快照snapshot:备份
3、配额quota:(1)名称配额
(2)空间配额
4、HDFS安全模式: safemode
5、HDFS的权限
6、HDFS的集群:(1)联盟Federation
(2)HA
四、HDFS底层的原理:Java程序
1、Java的动态代理
2、RPC:remote procedure call 远程过程调用
第五章:HDFS
一、操作HDFS
1、Web Console:端口50070
2、命令行:有两种类型
3、Java API
二、HDFS输出数据的原理(画图):比较重要
1、数据上传的原理(过程)
2、数据下载的原理(过程)
缓存元信息的内存:1000M
文件:hadoop-env.sh
# The maximum amount of heap to use, in MB. Default is 1000.
#export HADOOP_HEAPSIZE=
#export HADOOP_NAMENODE_INIT_HEAPSIZE=""
三、HDFS的高级特性
1、回收站: recyclebin
日志
-rmr: 删除目录,包括子目录
hdfs dfs -rmr /bbb
日志:
17/12/08 20:32:10 INFO fs.TrashPolicyDefault: Namenode trash configuration: Deletion interval = 0 minutes, Emptier interval = 0 minutes.
Deleted /bbb
(*)默认,HDFS的回收站是关闭
(*)启用回收站:参数---> core-site.xml
本质:删除数据的时候,实际是一个ctrl+x操作
<property>
<name>fs.trash.interval</name>
<value>1440</value>
</property>
日志:
hdfs dfs -rmr /folder1
rmr: DEPRECATED: Please use 'rm -r' instead.
17/12/11 21:05:57 INFO fs.TrashPolicyDefault: Namenode trash configuration: Deletion interval = 1440 minutes, Emptier interval = 0 minutes.
Moved: 'hdfs://bigdata11:9000/folder1' to trash at: hdfs://bigdata11:9000/user/root/.Trash/Current
(*)恢复:实际就是cp,拷贝
hdfs dfs -cp /user/root/.Trash/Current/input/data.txt /input
清空:hdfs dfs -expunge
(*)补充:Oracle数据库也有回收站
SQL> select * from tab;
TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
BIN$WBSNMvxJpWvgUAB/AQBygg==$0 TABLE
BONUS TABLE
DEPT TABLE
EMP TABLE
RESULT TABLE
SALGRADE TABLE
6 rows selected.
SQL> -- drop table mydemo1;
SQL> show recyclebin;
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
MYDEMO1 BIN$WBSNMvxJpWvgUAB/AQBygg==$0 TABLE 2017-09-01:06:56:15
SQL> select count(*) from mydemo1;
select count(*) from mydemo1
*
ERROR at line 1:
ORA-00942: table or view does not exist
SQL> select count(*) from BIN$WBSNMvxJpWvgUAB/AQBygg==$0;
select count(*) from BIN$WBSNMvxJpWvgUAB/AQBygg==$0
*
ERROR at line 1:
ORA-00933: SQL command not properly ended
SQL> select count(*) from "BIN$WBSNMvxJpWvgUAB/AQBygg==$0";
COUNT(*)
----------
30
SQL> flashback table mydemo1 to before drop;
Flashback complete.
SQL> show recyclebin;
SQL> select count(*) from mydemo1;
COUNT(*)
----------
30
2、快照snapshot:备份 ---> 一般来说:不建议使用快照
(*)默认:HDFS的快照是禁用的
(*)第一步:管理员开启某个目录的快照功能
[-allowSnapshot <snapshotDir>]
[-disallowSnapshot <snapshotDir>]
hdfs dfsadmin -allowSnapshot /mydir1
(*)第二步:使用HDFS的操作命令,创建快照
[-createSnapshot <snapshotDir> [<snapshotName>]]
[-deleteSnapshot <snapshotDir> <snapshotName>]
[-renameSnapshot <snapshotDir> <oldName> <newName>]
hdfs dfs -createSnapshot /mydir1 mydir1_backup_01
日志:Created snapshot /mydir1/.snapshot/mydir1_backup_01
本质:将数据拷贝一份到当前目录的一个隐藏目录下
(*)继续试验
hdfs dfs -put student02.txt /mydir1
hdfs dfs -createSnapshot /mydir1 mydir1_backup_02
对比快照: hdfs snapshotDiff /mydir1 mydir1_backup_01 mydir1_backup_02
Difference between snapshot mydir1_backup_01 and snapshot mydir1_backup_02 under directory /mydir1:
M .
+ ./student02.txt
3、配额quota:(1)名称配额: 规定某个目录下,存放文件(目录)的个数
实际的个数:N-1个
[-setQuota <quota> <dirname>...<dirname>]
[-clrQuota <dirname>...<dirname>]
hdfs dfs -mkdir /quota1
设置该目录的名称配额:3
hdfs dfsadmin -setQuota 3 /quota1
当我们放第三个文件的时候
hdfs dfs -put data.txt /quota1
put: The NameSpace quota (directories and files) of directory /quota1 is exceeded: quota=3 file count=4
(2)空间配额: 规定某个目录下,文件的大小
[-setSpaceQuota <quota> [-storageType <storagetype>] <dirname>...<dirname>]
[-clrSpaceQuota [-storageType <storagetype>] <dirname>...<dirname>]
hdfs dfs -mkdir /quota2
设置该目录的空间配额是:10M
hdfs dfsadmin -setSpaceQuota 10M /quota2
正确的做法:hdfs dfsadmin -setSpaceQuota 130M /quota2
放一个小于10M的文件,会出错
Caused by: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.hdfs.protocol.DSQuotaExceededException): The DiskSpace quota of /quota2 is exceeded: quota = 10485760 B = 10 MB but diskspace consumed = 134217728 B = 128 MB
注意:尽管数据不到128M,但是占用的数据块依然是128M
切记:当设置空间配额的时候,这个值不能小于128M
4、HDFS安全模式: safemode ---> HDFS只读
命令: hdfs dfsadmin -safemode get|wait|leave|enter
作用:检查数据块的副本率,如果副本率不满足要求,就会进行水平复制
5、HDFS的权限
6、HDFS的集群:开个头
集群的两大功能:负载均衡,高可用(失败迁移)
(1)NameNode联盟(Federation) ----> HDFS
(2)HA: HDFS、Yarn、HBase、Storm、Spark ---> 都需要ZooKeeper
四、HDFS底层的原理:Java程序
1、Java的动态代理
2、RPC:remote procedure call 远程过程调用
HDFS的底层原理
1、Java的动态代理对象
再举一个例子:数据库的连接池 ----> 返回的Connection,不是真正的Connection,而是一个代理对象
实现一个接口:DataSource
准备环境:安装一个MySQL数据库
Hive的安装
在虚拟机上安装MySQL:
yum remove mysql-libs
rpm -ivh mysql-community-common-5.7.19-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-5.7.19-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-5.7.19-1.el7.x86_64.rpm
rpm -ivh mysql-community-server-5.7.19-1.el7.x86_64.rpm
rpm -ivh mysql-community-devel-5.7.19-1.el7.x86_64.rpm (可选)
启动MySQL:service mysqld start
或者:systemctl start mysqld.service
查看root用户的密码:cat /var/log/mysqld.log | grep password
登录后修改密码:alter user 'root'@'localhost' identified by 'Welcome_1';
MySQL数据库的配置:
创建一个新的数据库:create database hive;
创建一个新的用户:
create user 'hiveowner'@'%' identified by 'Welcome_1';
给该用户授权
grant all on hive.* TO 'hiveowner'@'%';
grant all on hive.* TO 'hiveowner'@'localhost' identified by 'Welcome_1';
2、RPC:RPC(Remote Procedure Call)——远程过程调用,类似Web Service
六、MapReduce程序开发
1、Demo:WordCount单词计数
/root/training/hadoop-2.7.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar
执行:
hadoop jar hadoop-mapreduce-examples-2.7.3.jar wordcount /input/data.txt /output/mr/wc1213
分析WordCount程序数据处理的过程(非常重要)
2、开发自己的WordCount程序
开发一个MapReduce:求每个部门的工资总额
3、MapReduce的一些高级特性
(1)序列化:类似Java的序列化
(2)排序:默认排序:数字 升序
字符串 字典顺序
对象的排序:按照员工的薪水排序
(3)分区:Partition,默认情况下,MapReduce只有一个分区,意思是:只有一个输出文件
(4)合并:Combiner,在Mapper端,先做一次Reducer,用于减少输出到Reducer中的数据,从而提高效率
(5)MapReduce的核心:Shuffle(洗牌)
七、MapReduce的编程案例
六、MapReduce程序开发
1、Demo:WordCount单词计数
/root/training/hadoop-2.7.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar
执行:
hadoop jar hadoop-mapreduce-examples-2.7.3.jar wordcount /input/data.txt /output/mr/wc1213
分析WordCount程序数据处理的过程(非常重要)
2、开发自己的WordCount程序
需要包含的jar:
/root/training/hadoop-2.7.3/share/hadoop/common
/root/training/hadoop-2.7.3/share/hadoop/common/lib
/root/training/hadoop-2.7.3/share/hadoop/mapreduce
/root/training/hadoop-2.7.3/share/hadoop/mapreduce/lib
再举一个例子:开发一个MapReduce:求每个部门的工资总额
数据:员工表
SQL> select deptno,sum(sal) from emp group by deptno order by deptno;
DEPTNO SUM(SAL)
---------- ----------
10 8750
20 10875
30 9400
3、MapReduce的一些高级特性
(1)序列化:类似Java的序列化
如果一个类实现了的Hadoop的序列化机制(接口:Writable),这个类的对象就可以作为输入和输出的值
举例1:使用Employee类来封装员工信息,并且作为Map和Reduce的输入和输出
一定注意:序列化的顺序和反序列化的顺序要一致
举例2:使用序列化Employee重写 求每个部门的工资总额
(2)排序:注意:按照key2进行排序
默认排序:数字 升序
字符串 字典顺序
对象的排序:按照员工的薪水排序
如果要改变默认的排序规则,需要创建一个自己的比较器
(3)分区:Partition,默认情况下,MapReduce只有一个分区,意思是:只有一个输出文件
(4)合并:Combiner,在Mapper端,先做一次Reducer,用于减少输出到Reducer中的数据,从而提高效率
(5)MapReduce的核心:Shuffle(洗牌)
七、MapReduce的编程案例
一、排序:按照key2进行排序
1、数字的排序
2、字符串的排序
3、对象的排序: 实现WritableComparable接口 (1)序列化 (2)可被排序
员工数据 Employee.java ----> 作为key2输出
复习SQL:order by 后面 + 列名、表达式、别名、序号 desc
desc 只作用于离他最近的一个列
order by a desc,b desc
(1)一个列的排序
(2)多个列的排序
二、分区:Partition: 根据Map的输出(k2 v2)进行分区
1、默认情况下,MapReduce只有一个分区(只有一个输出文件)
2、什么是分区?(重要)
3、举例:Demo: 按照员工的部门号进行分区,相同部门号的员工输出到一个分区中
日志:
17/12/18 21:47:24 INFO mapreduce.Job: map 100% reduce 0%
17/12/18 21:47:49 INFO mapreduce.Job: map 100% reduce 33%
17/12/18 21:47:55 INFO mapreduce.Job: map 100% reduce 67%
17/12/18 21:47:56 INFO mapreduce.Job: map 100% reduce 100%
三、合并:Combiner
1、MapReduce的任务中,可以没有Combiner
2、Combiner是一种特殊的Reducer,是在Mapper端先做一次Reducer,用来减少Map的输出,从而提高的效率。
3、注意事项:
(1)有些情况,不能使用Combiner -----> 求平均值
(2)引入Combiner,不引人Combiner,一定不能改变原理的逻辑。(MapReduce编程案例:实现倒排索引)
错误:
Error: java.io.IOException: wrong value class: class org.apache.hadoop.io.DoubleWritable is not class org.apache.hadoop.io.IntWritable
四、什么时候Shuffle
五、MapReduce编程案例
一、什么是Shuffle(洗牌) ----> MapReduce核心
1、序列化
2、排序
3、分区
4、合并
二、MapReduce编程案例 ------> 掌握方法:如何开发一个程序
1、数据去重:
复习:SQL:distinct去掉重复的数据
作用于后面所有的列
复习(学习):Oracle中的多表查询
根据连接条件的不同:
(1)等值连接
(2)不等值连接
(3)外链接
(4)自连接
注意:(1)多表查询和子查询,尽量使用哪个?(多表查询)
(2)一般:多表查询的表的个数<=3 如果超过5个表,性能就差
2、多表查询:等值连接
查询员工信息:部门名称、员工姓名
select d.dname,e.ename
from emp e,dept d
where e.deptno=d.deptno;
问题:如果实现三张表??
3、多表查询:自连接: 通过表的别名,将同一张表看成多张表
查询员工信息:老板姓名 员工的姓名
select b.ename,e.ename
from emp b,emp e
where b.empno=e.mgr;
注意:产生的笛卡尔积= 原表的平方 ----> 自连接操作不适合操作大表
更好的方式:在Oracle中,使用层次查询(树)来取代自连接
4、倒排索引
5、使用单元测试:MRUnit
课程小结:
一、大数据的背景知识
1、什么是大数据?IBM五个v的特性。 举例:商品推荐、天气预报
2、数据仓库:就是一个数据库
3、OLTP和OLAP
4、Google的三篇论文
(1)GFS:HDFS
(2)MapReduce:PageRank搜索排名
(3)BigTable:大表---> HBase
二、Hadoop的体系结构
1、HDFS
(1)NameNode
(2)DataNode
(3)SecondaryNameNode
2、Yarn
(1)ResourceManager
(2)NodeManager
三、Hadoop的安装配置
1、注意:关闭防火墙、配置主机名、免密码登录(不对称加密)
2、三种模式:
(1)本地模式
(2)伪分布模式
(3)全分布模式
后面:HDFS的联盟、Hadoop的HA
四、HDFS
1、基本操作:命令行、Java、WebConsole
2、原理:上传和下载数据的过程
3、高级功能:回收站、快照、配额(名称、空间)、权限、安全模式
4、底层原理:代理对象和RPC
五、MapReduce