智传播客hadoop视频学习笔记(共2天)

时间:2023-12-12 09:17:02

第一天:
1、答疑解惑
•  就业前景
•  学习hadoop要有什么基础
•  hadoop会像塞班一样,热一阵子吗
•  hadoop学习起来容易还是困难
•  课堂上的学习方法(所有实验必须按照要求做,重原理、重实践)
•  通过本课程能学到什么

2、 课程简介
•  以真实的电信详单分析程序为主线,讲解Hadoop,Hbase,Hive在大数据处理的应用场景与过程
•  通过此课程,你能
     •  掌握Hadoop基本知识,进行HadoopHDFS和MapReduce应用开发,搭建Hadoop集群
     •  掌握Hbase基本知识,搭建Hbase集群,Hbase的基本操作
     •  掌握数据仓库基本知识,用Hive建立数据仓库,并进行多维分析

3、7天课程体系
•  Day1  单间伪分布和分布式实验环境
•  Day2  介绍HDFS体系结构及shell、java操作方式
•  Day3  介绍MapReduce系统结构及各种算法(1)
•  Day4  介绍MapReduce系统结构及各种算法(2)
•  Day5  介绍Hadoop集群、ZooKeeper操作
•  Day6  介绍HBase体系结构及基本操作
•  Day7  介绍Hive、sqoop体系结构及基本操作和最后项目

4、学习hadoop的就业前景

5、第一天  课程安排
•  Hadoop项目简介*
•  搭建Hadoop的伪分布环境***
•  使用Eclipse查看Hadoop源码*

6、LOGO

7、     Hadoop的生态图

(3)File System:HDFS,相当于windows下的资源管理器,存储文件的管理系统(5)Engine+Logic:MapReduce,对来自于HDFS的数据进行计算。
(1)浏览器
(2)Nutch
(6)Unstructured Data  :非结构化数据,Flume、Scribe,收集日志
(7)Structured Data:结构化数据,RDBM,存储在表中的数据,hiho,Sqoop。
(14)HBase:OLTP,在线处理应用,低延迟
(11)Monitor/manage:监控管理器,Hue,Eclipse
(8)High Level Interfaces:高级别接口,JAQL,数据流处理语言,Hive
(12)Support:底层支持化工具
(10)Workflow:工作流
(13)More High Level Interfaces:更高级别接口,mahout,封装了的算法,amazon
(4)作为终端的BI的东西

8、Hadoop是什么?
     适合大数据的分布式存储与计算平台
     •  作者:Doug Cutting
     •  受Google三篇论文的启发

9、版本
•  Apache
     官方版本(1.1.2)
•  Cloudera
     使用下载最多的版本,稳定,有商业支持,在Apache的基础上打上了一些patch。推荐使用。
•  Yahoo
     Yahoo内部使用的版本,发布过两次,已有的版本都放到了Apache上,后续不在继续发布,而是集中在Apache的版本上。

10、Hadoop核心项目
•  HDFS:Hadoop Distributed File System  分布式文件系统
•  MapReduce:并行计算框架

11、HDFS的架构
•  主从结构
     •  主节点,只有一个:namenode
     •  从节点,有很多个:datanode
•  namenode负责:
     •  接收用户操作请求
     •  维护文件系统的目录结构
     •  管理文件与block之间关系,block与datanode之间关系
•  datanode负责:
     •  存储文件
     •  文件被分成block存储在磁盘上
     •  为保证数据安全,文件会有多个副本

12、MapReduce的架构
•  主从结构
     •  主节点,只有一个:JobTracker
     •  从节点,有很多个:TaskTracker
•  JobTracker负责:
     •  接收客户提交的计算任务
     •  把计算任务分给TaskTracker执行
     •  监控TaskTracker的执行情况
•  TaskTracker负责:
     •  执行JobTracker分配的任务

13、Hadoop的特点
•  扩容能力(Scalable):能可靠地(reliably)存储和处理千兆字节(PB)数据。
•  成本低(Economical):可以通过普通机器组成的服务器群来分布以及处理数据。这些服务器群总计可达数千个节点。
•  高效率(Efficient):通过分布数据,Hadoop可以在数据所在的节点上并行地(parallel)处理它们,这使得处理非常的快速。
•  可靠性(Reliable):hadoop能自动地维护数据的多份副本,并且在任务失败后能自动地重新部署(redeploy)计算任务。

14、Hadoop集群的物理分布

跨虚拟机通信:WebServe。

15、单节点物理结构

16、Hadoop部署方式
•  本地模式
•  伪分布模式
•  集群模式

17、安装前准备软件
•  Vitual Vox
•  rhel-server-6.3-i386-dvd.iso
•  jdk-6上-linux-xxx.bin
•  hadoop-1.1.2.tar.gz

18、伪分布模式安装步骤
•  关闭防火墙
•  修改ip
•  修改hostname
•  设置ssh自动登录
•  安装jdk
•  安装hadoop

*****网络连接方式
1、宿主机(windows)与客户机(安装在虚拟机中的linux)网络连接
     1.1  host-only  宿主机与客户机单独组网。
          好处:网络隔离
          坏处:虚拟机与其他服务器之间不能通信    
     需要将VMnet1适配器打开
     1.2 bridge    客户机与宿主机在同一个局域网中。
          好处:都在同一个局域网,可以互相访问
          坏处:不安全

19、常用linux命令

20、hadoop的伪分布安装步骤
     【使用root用户登陆】
     20.1  设置静态ip
     •  在centos桌面右上角的图标上,右键修改。
     •  重启网卡,执行命令service network restart
     •  验证:执行命令ipconfig
     20.2  修改主机名
     •  修改当前会话中的主机名,执行命令hostname  hadoop
     •  修改配置文件中的主机名,执行命令 vi /etc/sysconfig/network
     •  重启机器 reboot -h now
     20.3  把主机名和ip绑定起来
     •  执行命令vi /etc/hosts,增加一行内容,如下:
            192.168.22.100  hadoop-yang
     •  验证:ping hadoop-yang
     20.4  关闭防火墙
     •  执行命令  service iptables stop
     •  验证: service iptables status
     20.5  关闭防火墙的自动运行
     •  查看所有进程  chkconfig –list
     •  执行命令 chkconfig  iptables off
     •  验证:chkconfig –-list | grep iptables
     20.6  SSH(secure shell)的免密码登陆
     •  执行命令ssh-keygen -t rsa 产生密钥,位于~/.ssh文件夹中
     •  执行命令 cp ~/.ssh/id_rsa.pub authorized_keys
     •  验证  ssh localhost
     20.7  安装jdk
     •  执行命令rm -rf /usr/local/*  删除所有内容
     •  使用工具winscp把jdk文件从windows复制到/usr/local目录下
     •  执行命令 chomd u+x jdk-6u24-linux-i586.bin 授予执行权限
     •  执行命令 ./jdk-6u24-linux-i586.bin解压缩
     •  执行命令 mv jdk1.6.0_24 jdk 重命名
     •  执行命令vi /etc/profile 设置环境变量,增加了2行内容
          export JAVA_HOME=/usr/local/jdk
          export PATH=.:$JAVA_HOME/bin:$PATH
         执行source /etc/profile
     •  验证:java -version
     20.8  安装hadoop
     •  执行命令 tar –zxvf hadoop-1.1.2.tar.gz 进行解压缩
     •  执行命令mv hadoop-1.1.2 hadoop 重命名
     •  执行命令 vi /etc/profile 设置环境变量,增加了1行内容
          export HADOOP_HOME=/usr/local/hadoop 
          修改了1行内容
          export PATH=.:$HADOOP_HOME/bin:$JAVA_HOME/bin:$PATH
          保存退出
          执行命令source /etc/profle让该设置立即生效
     •  修改hadoop的配置文件,位于$HADOOP_HOME/conf目录下
     修改4个配置文件,分别是hadoop-env.sh、core-site.xml、hadfs-site.xml、mapred-site.xml。具体内容看PPT P23
          【hadoop-env.sh的修改内容如下】
               export JAVA_HOME=/usr/local/jdk

【core-site.xml的修改内容如下】
          <configuration>
                  <property>
                  <name>fs.default.name</name>
                  <value>hdfs://localhost:9000</value>
                  <description>change your own hostname</description>
                  </property>
                  <property>
                  <name>hadoop.tmp.dir</name>
                  <value>/usr/local/hadoop/tmp</value>
                  </property> 
          </configuration>

【hdfs-site.xml的修改内容】
          <configuration>
                   <property>
                       <name>dfs.replication</name>
                       <value>1</value>
                   </property>
                   <property>
                       <name>dfs.permissions</name>
                      <value>false</value>
                   </property>
          </configuration>

【mapred-site.xml的修改内容】
          <configuration>
                  <property>
                            <name>mapred.job.tracker</name>
                       <value>hadoop0:9001</value>
                  <description>change your own hostname</description>
                   </property>
          </configuration>

•  执行命令hadoop namenode –format 对hadoop进行格式化
     •  执行命令start-all.sh进行启动
     •  验证:(1)执行命令jps,发现5个java进程,分别是NameNode、DataNode、SecondaryNameNode、JobTracker、TaskTracker。
     •   通过浏览器http://lcoalhost:50070 和 http://localhost:50030
     可以修改windows的C:\Windows\System32\drivers\etc\hosts文件******
     20.9  NameNode进程没有启动成功?
     •  没有格式化
     •  配置文件只copy,不修改
     •  hostname与ip没有绑定
     •  SSH的免密码登陆没有配置成功    
     20.10  多次格式化hadoop也是错误的?
     •  方法:删除/usr/local/hadoop/tmp文件夹,重新格式化,因为可能版本不一致。

第二天
1、课程安排
•  分布式文件系统与HDFS
•  HDFS体系结构与基本概念***
•  HDFS的shell操作***
•  java接口及常用api***
加深拓展
•  RPC调用**
•  HDFS的分布式存储架构的源码分析**

2、Distributed File System
•  数据量越来越多,在一个操作系统管辖的范围存不下了,那么就分配到更多的操作系统管理的磁盘中,但是不方便管理和维护,因此迫切需要一种系统来管理多台机器上的文件,这就是分布式文件管理系统。
•  是一种允许文件通过网络在多台主机上分享的文件系统,可让多机器上的多用户分享文件和存储空间。
•  通透性。让实际上是通过网络来访问文件的动作,由程序与用户看来,就像是访问本地的磁盘一般。
•  容错。即使系统中有些节点脱机,整体来说系统仍然可以持续运作而不会有数据损失。
•  分布式文件管理系统很多,hdfs只是其中一种。适用于一次写入多次查询的情况,不支持并发写情况小文件不合适。

3、HDFS的shell操作:
3.1对hdfs的操作方式:hadoop fs xxx
  hadoop fs -ls  /     查看hdfs的根目录下的内容的
  hadoop fs -lsr /     递归查看hdfs的根目录下的内容的
  hadoop fs -mkdir /d1     在hdfs上创建文件夹d1
  hadoop fs -put <linux source> <hdfs destination> 把数据从linux上传到hdfs的特定路径中         
  hadoop fs -get <hdfs source> <linux destination> 把数据从hdfs下载到linux的特定路径下
  hadoop fs -text <hdfs文件>     查看hdfs中的文件
  hadoop fs -rm          删除hdfs中文件
  hadoop fs -rmr          删除hdfs中的文件夹
  hadoop fs -ls hdfs://hadoop0:9000/
3.2、HDFS的datanode在存储数据时,如果原始文件大小 > 64MB,按照64MB大小切分;如果 < 64MB,只有一个block,占用磁盘空间是源文件实际大小。

4、Namenode
•  是整个文件系统的管理节点。它维护着整个文件系统的文件目录树,文件/目录的元信息和每个文件对应的数据块列表。接收用户的操作请求。
•  文件包括:
     •  fsimage:元数据镜像文件。存储某一时段NameNode内存元数据信息。
   •   edits:操作日志文件。
   •  fstime:保存最近一次checkpoint的时间。
•  以上这些文件是保存在linux的文件系统中。

5、SecondaryNameNode
•  HA的一个解决方案。但不支持热备。配置即可。
•  执行过程:从NameNode上下载元数据信息(fsimage,edits),然后把二者合并,生成信息的fsimage,在本地保存,并将其推送到NameNode,同时重置NameNode的edits。
•  默认在安装在NameNode节点上,但这样…不安全!

6、Datanode
•  提供真实文件数据的存储服务。
     •  文件块(block):最基本的存储单位。对于文件内容而言,一个文件的长度大小是size,那么从文件的0偏移开始,按照固定的大小,顺序对文件进行划分并编号,划分好的每一个块称一个Block。HDFS默认Block大小是64MB,以一个256MB文件,共有256/4=4个Block。
     •  不同于普通文件的系统的是,HDFS中,如果一个文件小于一个数据块的大小,并不占用整个数据块存储空间。
     •  Replication。多复本。默认是三个。

7、使用浏览器查看HDFS目录结构
http://localhost:50070   只能看不能写

8、使用java操作HDFS
Alt + Shift + M : 创建方法
Alt + Shift + L : 创建局部变量

例子1:
package hdfs;

import java.io.InputStream;
import java.net.URL;
import org.apache.hadoop.fs.FsUrlStreamHandlerFactory;
import org.apache.hadoop.io.IOUtils;

public class App1{
    public static final String HDFS_PATH = "hdfs://localhost:9000/hello";

public static void main(String[] args) throws Exception{
         URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());
         final URL url = new URL(HDFS_PATH);
         final InputStream in = url.openStream();
         Object system;
          /*  @param in 输入流
         *   @param out  输出流
         *   @param buffSize  缓冲区大小
         *   @param close  是否关闭流
         */
         IOUtils.copyBytes(in,System.out ,1024,true);
     }
}

例子2:
package hdfs;
import java.net.URI;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;

/*使用一个类FileSystem*/
public class App2{
public static void main (String[] args) throws Exception{
public static final String HDFS_PATH = “hadfs://localhost:9000”
public static final String DIR_PATH =”/d1000”;
public static final String FILE_PATH = “/d1000/f1000”
final FileSystem fileSystem = FileSystem.get(new URI(HDFS_PATH),new Configuration());
//创建文件夹
fileSystem.mkdirs(new Path(DIR_PATH));

//上传文件
final FSDataOutputStream out = fileSystem.create(new Path(FILE_PATH));
final FileInputStream in = new FileInputStream(“c:/log.txt”);
IOUtils.copyBytes(in,out,1024,true);

//下载文件
final FSDataInputStream in = fileSystem.open(new Path(FILE_PATH));
IOUtils.copyBytes(in,System.out,1024,true);

//删除文件(夹)
fileSystem.delete(new Path(FILE_PATH),true);

}
}

9、RPC(remote procedure call)
     •  不同java进程间的对象方法的调用。
     •  一方称作服务端(server),一方称为客户端(client)。server端提供对象,供客户端调用的,被调用的对象的方法的执行发生在server端。
     •  RPC是hadoop框架运行的基础。
例子3:服务器端:
package rpc;
import org.apache.hadoop.ipc.VersionedProtocol;
public interface MyBizable extends VersionedProtocol{
    public static final Long VERSION = 2453245L;
    public abstract String hello(String name);
}

package rpc;

import java.io.IOException;
import org.apache.hadoop.ipc.VersionedProtocol;

public class MyBiz implements VersionedProtocol,MyBizablen{
     public String hello(String name){
        System.out.println(“我被调用了!”);
        return “hello”+name;
}
     public long getProtocolVersion(String protocol,long clientVersion) throws IOException{
     return MyBizable.VERSION;
}
}

package rpc;
import org.apache.hadoop.ipc.RPC;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC.Server;

public class MyServer{
     public static final String SERVER_ADDRESS = “localhost”;
     public static final int SERVER_PORT = MyBizable.VERSION;

public static void main(String[] args) throws Exception{
      /*
      * 构造一个RPC Server。
      * instance  实例中的方法会被客户端调用
      * binAddress 绑定的这个地址用于监听连接的到来
      * port 绑定的这个端口用于监听连接的到来
      *
        RPC.getServer(new MyBiz(), SERVER_ADDRESS,SERVER_PORT,new Configuration());
        server.start();

}
}

例子4:客户端:
package rpc;

import org.apache.hadoop.ipc.RPC;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC.VersionedProtocol;

public class MyClient{
public static void main(String[] args) throws Exception{
    /*构造一个客户端的代理对象。*/
   final MyBiz proxy =  (MyBizable)RPC.waitForProxy(MyBizable.class,234534343L,new InetSocketAddress(MyServer.SERVER_ADDRESS,MyServer.SERVER_PORT),new Configuration());
final String result = proxy.hello(“world”);
system.out.println(“客户端调用结果:”+result);

RPC.stopProxy(proxy);
}

}

9.1、通过rpc小例子获得的认识?
•  服务端提供的对象必须是一个接口,接口extends VersioinedProtocal
•  客户端能够的对象中的方法必须位于对象的接口中。