第一天:
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
• 客户端能够的对象中的方法必须位于对象的接口中。