Hadoop学习笔记


实验环境:
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

例子:
[root@bigdata11 ~]# hdfs dfs -count /students
   1            2                 29 /students
[root@bigdata11 ~]# 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
[root@bigdata11 ~]# 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]

[root@bigdata11 ~]# hdfs dfsadmin -safemode get
Safe mode is OFF
[root@bigdata11 ~]# hdfs dfsadmin -safemode enter
Safe mode is ON
[root@bigdata11 ~]# hdfs dfs -mkdir /dddd
mkdir: Cannot create directory /dddd. Name node is in safe mode.
[root@bigdata11 ~]# 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




































































































































猜你喜欢

转载自jin8000608172.iteye.com/blog/2422015