大数据 hadoop

1.HADOOP背景介绍

1.1 什么是HADOOP
1.HADOOP是apache旗下的一套开源软件平台
2.HADOOP提供的功能:利用服务器集群,根据用户的自定义业务逻辑,对海量数据进行分布式处理
3.HADOOP的核心组件有
A.HDFS(分布式文件系统)
B.YARN(运算资源调度系统)
C.MAPREDUCE(分布式运算编程框架)
4.广义上来说,HADOOP通常是指一个更广泛的概念——HADOOP生态圈
1.2 HADOOP产生背景
1.HADOOP最早起源于Nutch。Nutch的设计目标是构建一个大型的全网搜索引擎,包括网页抓取、索引、查询等功能,但随着抓取网页数量的增加,遇到了严重的可扩展性问题——如何解决数十亿网页的存储和索引问题。
2.2003年、2004年谷歌发表的两篇论文为该问题提供了可行的解决方案。
——分布式文件系统(GFS),可用于处理海量网页的存储
——分布式计算框架MAPREDUCE,可用于处理海量网页的索引计算问题。
-------分布式数据的存储BIGTable

Nutch的开发人员完成了相应的开源实现HDFS和MAPREDUCE,并从Nutch中剥离成为独立项目HADOOP,到2008年1月,HADOOP成为Apache顶级项目,迎来了它的快速发展期。
1.3 HADOOP在大数据、云计算中的位置和关系
1.云计算是分布式计算、并行计算、网格计算、多核计算、网络存储、虚拟化、负载均衡等传统计算机技术和互联网技术融合发展的产物。借助IaaS(基础设施即服务)、PaaS(平台即服务)、SaaS(软件即服务)等业务模式,把强大的计算能力提供给终端用户。

2.现阶段,云计算的两大底层支撑技术为“虚拟化”和“大数据技术”

3.而HADOOP则是云计算的PaaS层的解决方案之一,并不等同于PaaS,更不等同于云计算本身。

1.4 国内外HADOOP应用案例介绍
1、HADOOP应用于数据服务基础平台建设(数据仓库)

2/HADOOP用于用户画像

3、HADOOP用于网站点击流日志数据挖掘

1.5 国内HADOOP的就业情况分析
1、HADOOP就业整体情况
A.大数据产业已纳入国家十三五规划
B.各大城市都在进行智慧城市项目建设,而智慧城市的根基就是大数据综合平台
C.互联网时代数据的种类,增长都呈现爆发式增长,各行业对数据的价值日益重视
D.相对于传统JAVAEE技术领域来说,大数据领域的人才相对稀缺
E.随着现代社会的发展,数据处理和数据挖掘的重要性只会增不会减,因此,大数据技术是一个尚在蓬勃发展且具有长远前景的领域

2、HADOOP就业职位要求
大数据是个复合专业,包括应用开发、软件平台、算法、数据挖掘等,因此,大数据技术领域的就业选择是多样的,但就HADOOP而言,通常都需要具备以下技能或知识:
A.HADOOP分布式集群的平台搭建
B.HADOOP分布式文件系统HDFS的原理理解及使用
C.HADOOP分布式运算框架MAPREDUCE的原理理解及编程
D.Hive数据仓库工具的熟练应用
E.Flume、sqoop、oozie等辅助工具的熟练使用
F.Shell/python等脚本语言的开发能力

3、HADOOP相关职位的薪资水平
大数据技术或具体到HADOOP的就业需求目前主要集中在北上广深一线城市,薪资待遇普遍高于传统JAVAEE开发人员,以北京为例:

1.6 HADOOP生态圈以及各组成部分的简介

各组件简介

重点组件:
HDFS:分布式文件系统
MAPREDUCE:分布式运算程序开发框架
HIVE:基于大数据技术(文件系统+运算框架)的SQL数据仓库工具
HBASE:基于HADOOP的分布式海量数据库
ZOOKEEPER:分布式协调服务基础组件
Mahout:基于mapreduce/spark/flink等分布式运算框架的机器学习算法库
Oozie:工作流调度框架
Sqoop:数据导入导出工具
Flume:日志数据采集框架

2 分布式系统概述
注:由于大数据技术领域的各类技术框架基本上都是分布式系统,因此,理解hadoop、storm、spark等技术框架,都需要具备基本的分布式系统概念

2.1 分布式软件系统(Distributed Software Systems)
该软件系统会划分成多个子系统或模块,各自运行在不同的机器上,子系统或模块之间通过网络通信进行协作,实现最终的整体功能
比如分布式操作系统、分布式程序设计语言及其编译(解释)系统、分布式文件系统和分布式数据库系统等。

2.2 分布式软件系统举例:solrcloud
A.一个solrcloud集群通常有多台solr服务器
B.每一个solr服务器节点负责存储整个索引库的若干个shard(数据分片)
C.每一个shard又有多台服务器存放若干个副本互为主备用
D.索引的建立和查询会在整个集群的各个节点上并发执行
E.solrcloud集群作为整体对外服务,而其内部细节可对客户端透明
总结:利用多个节点共同协作完成一项或多项具体业务功能的系统就是分布式系统。

2.3 分布式应用系统模拟开发
需求:可以实现由主节点将运算任务发往从节点,并将各从节点上的任务启动;
程序清单:
AppMaster
AppSlave/APPSlaveThread
Task
程序运行逻辑流程:

  1. 离线数据分析流程介绍
    注:本环节主要感受数据分析系统的宏观概念及处理流程,初步理解hadoop等框架在其中的应用环节,不用过于关注代码细节

一个应用广泛的数据分析系统:“web日志数据挖掘”

3.1 需求分析
3.1.1 案例名称
“网站或APP点击流日志数据挖掘系统”。

3.1.2 案例需求描述
“Web点击流日志”包含着网站运营很重要的信息,通过日志分析,我们可以知道网站的访问量,哪个网页访问人数最多,哪个网页最有价值,广告转化率、访客的来源信息,访客的终端信息等。

3.1.3 数据来源
本案例的数据主要由用户的点击行为记录
获取方式:在页面预埋一段js程序,为页面上想要监听的标签绑定事件,只要用户点击或移动到标签,即可触发ajax请求到后台servlet程序,用log4j记录下事件信息,从而在web服务器(nginx、tomcat等)上形成不断增长的日志文件。
形如:
58.215.204.118 - - [18/Sep/2013:06:51:35 +0000] “GET /wp-includes/js/jquery/jquery.js?ver=1.10.2 HTTP/1.1” 304 0 “http://blog.fens.me/nodejs-socketio-chat/” “Mozilla/5.0 (Windows NT 5.1; rv:23.0) Gecko/20100101 Firefox/23.0”

3.2 数据处理流程
3.2.1 流程图解析
本案例跟典型的BI系统极其类似,整体流程如下:

但是,由于本案例的前提是处理海量数据,因而,流程中各环节所使用的技术则跟传统BI完全不同,后续课程都会一一讲解:
1)数据采集:定制开发采集程序,或使用开源框架FLUME
2)数据预处理:定制开发mapreduce程序运行于hadoop集群
3)数据仓库技术:基于hadoop之上的Hive
4)数据导出:基于hadoop的sqoop数据导入导出工具
5)数据可视化:定制开发web程序或使用kettle等产品
6)整个过程的流程调度:hadoop生态圈中的oozie工具或其他类似开源产品

3.2.2 项目技术架构图

3.2.3 项目相关截图(感性认识,欣赏即可)
a)Mapreudce程序运行

b)在Hive中查询数据

c)将统计结果导入mysql
./sqoop export --connect jdbc:mysql://localhost:3306/weblogdb --username root --password root --table t_display_xx --export-dir /user/hive/warehouse/uv/dt=2014-08-03

3.3 项目最终效果
经过完整的数据处理流程后,会周期性输出各类统计指标的报表,在生产实践中,最终需要将这些报表数据以可视化的形式展现出来,本案例采用web程序来实现数据可视化
效果如下所示:

  1. 集群搭建
    4.1 HADOOP集群搭建
    4.1.1集群简介
    HADOOP集群具体来说包含两个集群:HDFS集群和YARN集群,两者逻辑上分离,但物理上常在一起
    HDFS集群:
    负责海量数据的存储,集群中的角色主要有 NameNode / DataNode
    YARN集群:
    负责海量数据运算时的资源调度,集群中的角色主要有 ResourceManager /NodeManager
    (那mapreduce是什么呢?它其实是一个应用程序开发包)

本集群搭建案例,以5节点为例进行搭建,角色分配如下:
hdp-node-01 NameNode SecondaryNameNode
hdp-node-02 ResourceManager
hdp-node-03 DataNode NodeManager
hdp-node-04 DataNode NodeManager
hdp-node-05 DataNode NodeManager
部署图如下:

master hadoop 主机。
scecondary NameNode 为master 提供服务,读取:DateNode 中文件的信息。提交给master

4.1.2服务器准备
本案例使用虚拟机服务器来搭建HADOOP集群,所用软件及版本:
Vmware 11.0
Centos 6.5 64bit

4.1.3网络环境准备
1.安装centos系统,并修改IP地址:192.168.137.22

配置完成后,重启服务:service network restart。
查看IP地址:ifconfig

2.关闭防火墙:
service iptables stop :关闭防火墙服务
chkconfig iptables off :关闭防火墙配置文件。
3.开启sshd 服务
service sshd start
4.修改主机名
临时修改:hostname hdp-node-01
永久修改:vi /etc/sysconfig/network

5.修改主机映射:
vi /etc/hosts

6.添加用户,分配sudoer权限
useradd huaqiang
passwd 123456

添加sudoers 文件可读权限。
chmod 640 sudoers
编辑sudoers文件。首行添加:
huaqiang ALL=(root)NOPASSWD:ALL

配置完成后:使用root权限。可使用sudo 即可。
7.安装JDK
将JDK 上传到/home/huaqiang/app目录
添加可执行权限。
#chmod 764 jdk…
解压缩JDK
#tar -zxf jdk-7u67-linux-x64.tar.gz -C ./
配置环境变量:
#sudo vi /etc/profile
文件末尾添加代码:

#SET JAVA_HOME
export JAVA_HOME=/home/huaqiang/app/jdk1.7.0_67
export PATH= P A T H : PATH: PATH:JAVA_HOME/bin:
刷新资源文件
#source /etc/profile
测试是否安装成功
java javac java -version

克隆其他两台主机。
克隆之后首先修改克隆机的mac地址。
00:50:56:2F:AF:62
修改网卡配置。

开启02,03 主机,并按照以上步骤,修改IP.主机名,以及映射。
设置SSH免密码登录
计算机A每次SSH远程连接计算机B时,都需要输入密码。当有些软件需要频繁使用SSH连接其他计算机时,这个时候需要人工填写计算机B的密码,这个会造成大量无用操作,不利于程序的使用。
在为了避免这类问题的发生,而且也要兼顾安全问题(设置SSH免密码登陆后,SSH这台计算就不需要密码即可登陆,存在安全隐患),使用公钥和私钥方式解决SSH免密码登陆问题,而且只在一边做,另一边不做,这样也达到了安全的问题。一般是那台机器需要SSH远程其他机器,就在这台机器上设置SSH免登陆操作。
"公私钥"认证方式简单的解释:首先在客户端上创建一对公私钥 (公钥文件:~/.ssh/id_rsa.pub; 私钥文件:/.ssh/id_rsa)。然后把公钥放到服务器上(/.ssh/authorized_keys), 自己保留好私钥.在使用ssh登录时,ssh程序会发送私钥去和服务器上的公钥做匹配.如果匹配成功就可以登录了。
ssh 无密码登录要使用公钥与私钥。linux下可以用ssh-keygen生成公钥/私钥对.
//在master机下生成公钥/私钥对。

ssh-keygen -t rsa

//拷贝pubkey公钥,并修改其名称为:authorized_keys
cp id_rsa.pub ./authorized_keys
//将master机子上的key给其他机子上发送一份

scp ~/.ssh/authorized_keys slave1:/home/huaqiang/.ssh/

scp ~/.ssh/authorized_keys slave2:/home/huaqiang/.ssh/

使用ssh进行登录验证
ssh slave1
ssh slave2

4.1.6 HADOOP安装部署
上传HADOOP安装包
规划安装目录 /home/hadoop/apps/hadoop-2.6.1
解压安装包
修改配置文件 $HADOOP_HOME/etc/hadoop/

fs.defaultFS hdfs://master:8020 io.file.buffer.size 4096

修改hdfs-site.xml

dfs.replication
2


dfs.block.size
134217728


dfs.namenode.name.dir
/home/hadoopdata/dfs/name

dfs.datanode.data.dir /home/hadoopdata/dfs/data fs.checkpoint.dir /home/hadoopdata/checkpoint/dfs/cname fs.checkpoint.edits.dir /home/hadoopdata/checkpoint/dfs/cname dfs.http.address master:50070 dfs.secondary.http.address slave1:50090 dfs.webhdfs.enabled true dfs.permissions false

修改mapred-site.xml文件

mapreduce.framework.name
yarn
true


mapreduce.jobhistory.address
master:10020


mapreduce.jobhistory.webapp.address
master:19888

修改yarn-site.xml

yarn.resourcemanager.hostname
master


yarn.nodemanager.aux-services
mapreduce_shuffle


yarn.resourcemanager.address
master:8032


yarn.resourcemanager.scheduler.address
master:8030


yarn.resourcemanager.resource-tracker.address
master:8031


yarn.resourcemanager.admin.address
master:8033


yarn.resourcemanager.webapp.address
master:8088

修改slaves文件

注意:每个机器名占一行。
master
slave1
slave2

拷贝Hadoop 到 datanode02 datanode03 主机上。
scp -r ./hadoop-2.7.1 hadoop-datanode-02:/home/huaqiang/app/
scp -r ./hadoop-2.7.1 hadoop-datanode-03:/home/huaqiang/app/

4.1.7 启动集群
初始化HDFS
bin/hadoop namenode -format

启动HDFS
sbin/start-dfs.sh

启动YARN
sbin/start-yarn.sh
4.1.8 测试
1、上传文件到HDFS
从本地上传一个文本文件到hdfs的/wordcount/input目录下
[HADOOP@hdp-node-01 ~]$ HADOOP fs -mkdir -p /wordcount/input
[HADOOP@hdp-node-01 ~]$ HADOOP fs -put /home/HADOOP/somewords.txt /wordcount/input

2、运行一个mapreduce程序
在HADOOP安装目录下,运行一个示例mr程序
cd $HADOOP_HOME/share/hadoop/mapreduce/
hadoop jar mapredcue-example-2.6.1.jar wordcount /wordcount/input /wordcount/output

开启服务:
Wei:UI 查看启动:
http://master.com:50070/ hdfs 启动
http://master.com:8088/cluster yarn 启动
启动history服务才能看到webUI节点
$mr-jobhistory-daemon.sh start historyserver
http://master.com:19888/jobhistory mr 启动

5 集群使用初步
5.1 HDFS使用
1、查看集群状态
命令: hdfs dfsadmin –report

可以看出,集群共有3个datanode可用
也可打开web控制台查看HDFS集群信息,在浏览器打开http://hdp-node-01:50070/

2、上传文件到HDFS
查看HDFS中的目录信息
命令: hadoop fs –ls /

上传文件
命令: hadoop fs -put ./ scala-2.10.6.tgz to /

从HDFS下载文件
命令: hadoop fs -get /yarn-site.xml

5.2 MAPREDUCE使用
mapreduce是hadoop中的分布式运算编程框架,只要按照其编程规范,只需要编写少量的业务逻辑代码即可实现一个强大的海量数据并发处理程序
5.2.1 Demo开发——wordcount
1、需求
从大量(比如T级别)文本文件中,统计出每一个单词出现的总次数

2、mapreduce实现思路
Map阶段:
a)从HDFS的源数据文件中逐行读取数据
b)将每一行数据切分出单词
c)为每一个单词构造一个键值对(单词,1)
d)将键值对发送给reduce

Reduce阶段:
a)接收map阶段输出的单词键值对
b)将相同单词的键值对汇聚成一组
c)对每一组,遍历组中的所有“值”,累加求和,即得到每一个单词的总次数
d)将(单词,总次数)输出到HDFS的文件中

4、具体编码实现
(1)定义一个mapper类
//首先要定义四个泛型的类型
//keyin: LongWritable valuein: Text
//keyout: Text valueout:IntWritable

public class WordCountMapper extends Mapper{
//map方法的生命周期: 框架每传一行数据就被调用一次
//key : 这一行的起始点在文件中的偏移量
//value: 这一行的内容
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
//拿到一行数据转换为string
String line = value.toString();
//将这一行切分出各个单词
String[] words = line.split(" ");
//遍历数组,输出<单词,1>
for(String word:words){
context.write(new Text(word), new IntWritable(1));
}
}
}

(2)定义一个reducer类
//生命周期:框架每传递进来一个kv 组,reduce方法被调用一次
@Override
protected void reduce(Text key, Iterable values, Context context) throws IOException, InterruptedException {
//定义一个计数器
int count = 0;
//遍历这一组kv的所有v,累加到count中
for(IntWritable value:values){
count += value.get();
}
context.write(key, new IntWritable(count));
}
}

(3)定义一个主类,用来描述job并提交job
public class WordCountRunner {
//把业务逻辑相关的信息(哪个是mapper,哪个是reducer,要处理的数据在哪里,输出的结果放哪里。。。。。。)描述成一个job对象
//把这个描述好的job提交给集群去运行
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
Job wcjob = Job.getInstance(conf);
//指定我这个job所在的jar包
// wcjob.setJar("/home/hadoop/wordcount.jar");
wcjob.setJarByClass(WordCountRunner.class);

	wcjob.setMapperClass(WordCountMapper.class);
	wcjob.setReducerClass(WordCountReducer.class);
	//设置我们的业务逻辑Mapper类的输出key和value的数据类型
	wcjob.setMapOutputKeyClass(Text.class);
	wcjob.setMapOutputValueClass(IntWritable.class);
	//设置我们的业务逻辑Reducer类的输出key和value的数据类型
	wcjob.setOutputKeyClass(Text.class);
	wcjob.setOutputValueClass(IntWritable.class);
	
	//指定要处理的数据所在的位置
	FileInputFormat.setInputPaths(wcjob, "hdfs://hdp-server01:9000/wordcount/data/big.txt");
	//指定处理完成之后的结果所保存的位置
	FileOutputFormat.setOutputPath(wcjob, new Path("hdfs://hdp-server01:9000/wordcount/output/"));
	
	//向yarn集群提交这个job
	boolean res = wcjob.waitForCompletion(true);
	System.exit(res?0:1);
}

5.2.2 程序打包运行
1.将程序打包
2.准备输入数据
vi /home/hadoop/test.txt
Hello tom
Hello jim
Hello ketty
Hello world
Ketty tom
在hdfs上创建输入数据文件夹:
hadoop fs mkdir -p /wordcount/input
将words.txt上传到hdfs上
hadoop fs –put /home/hadoop/words.txt /wordcount/input

3.将程序jar包上传到集群的任意一台服务器上

4.使用命令启动执行wordcount程序jar包
$ hadoop jar wordcount.jar cn.itcast.bigdata.mrsimple.WordCountDriver /wordcount/input /wordcount/out

5.查看执行结果
$ hadoop fs –cat /wordcount/out/part-r-00000

hadoop基本配置。
1三台主机。
192.168.137.44 master MAC地址不同
192.168.137.45 server01 MAC地址不同
192.168.137.46 server02 MAC地址不同
00:50:56:3D:A1:FA
00:50:56:30:C9:FD
1.1主机配置:
1.1.1IP地址
#vi /etc/sysconfig/network-scripts/ifcfg-eth0

重启网卡:
#service network restart
查看网卡
#ifconfig

1.1.2主机名称
#vi /etc/sysconfig/network
修改主机名为:master

1.1.3hosts 映射
#vi /etc/hosts

主机名映射验证:
 #ping master
1.1.4创建用户
#useradd 用户名

#passwd 用户名

输入两次密码

1.1.5给用户免密码root权限
#修改/etc/sudoers文件权限
#chmod 640 sudoers

修改文件/etc/sudoers

vi /etc/sudoers

在首行添加
huaqiang ALL=(root)NOPASSWD:ALL

1.1.6关闭防火墙:
关闭防火墙服务
#service iptables stop

关闭防火墙配置文件
#chkconfig iptables off

开启SSHD 服务
#service sshd start

开启sshd 配置。
#chkconfig sshd on

1.1.7使用xshell 进行远程终端登录。
使用xshell 进行登录:
必须使用普通用户。
1.1.8安装JDK
将jdk安装包拷贝到/home/huaqiang/app目录下。
修改jdk…压缩包的可执行权限
#chmod 764 jdk…

解压安装包到当前目录
#tar -zxvf jdk-7u67-linux-x64.tar.gz -C ./

配置环境变量
#sudo vi /etc/profile
在末尾添加
export JAVA_HOME=/home/huaqiang/app/jdk1.7.0_67
export PATH= P A T H : PATH: PATH:JAVA_HOME/bin:

刷新配置文件
#source /etc/profile

1.2克隆其他主机
1.2.1克隆主要MAC地址修改

1.2.2删除默认网卡

1.2.3修改IP地址,主机名,
根据上面的配置进行修改即可。

1.2.4设置SSH免密码登录
#ssh-keygen -t rsa 用以生成公钥私钥的秘钥对–》 4次回车。
可在当前用户下的.ssh 中查看两个秘钥:
复制公钥的名字。
切记:给自己也发一份公钥。
#ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
发送秘钥到其他两台主机的普通用户的.ssh 目录下。
你也可以将.ssh 目录发过去。

1.3安装hadoop
修改hadoop 权限
#chmod 764 haoop…
解压hadoop
#tar -zxvf ./hadoop… -C ./
配置环境变量
#SET JAVA_HONE
export JAVA_HOME=/home/huaqiang/app/jdk1.7.0_67
export HADOOP_HOME=/home/huaqiang/app/hadoop-2.7.1
export PATH= P A T H : PATH: PATH:JAVA_HOME/bin: H A D O O P H O M E / b i n : HADOOP_HOME/bin: HADOOPHOME/bin:HADOOP_HOME/sbin:

1.3.1修改hadoop配置文件
1.3.2 修改hadoop-env.sh
修改jdk路径:export JAVA_HOME=/opt/modules/jdk1.7.0_67
1.3.3修改 core-site.xml

fs.defaultFS hdfs://master:8020 io.file.buffer.size 4096

1.3.4修改hdfs-site.xml

dfs.replication
2


dfs.block.size
134217728


dfs.namenode.name.dir
/home/hadoopdata/dfs/name

dfs.datanode.data.dir /home/hadoopdata/dfs/data fs.checkpoint.dir /home/hadoopdata/checkpoint/dfs/cname fs.checkpoint.edits.dir /home/hadoopdata/checkpoint/dfs/cname dfs.http.address master:50070 dfs.secondary.http.address server1:50090 dfs.webhdfs.enabled true dfs.permissions false

1.3.5修改mapred-site.xml文件

mapreduce.framework.name
yarn
true


mapreduce.jobhistory.address
master:10020


mapreduce.jobhistory.webapp.address
master:19888

1.3.6修改yarn-site.xml

yarn.resourcemanager.hostname
master


yarn.nodemanager.aux-services
mapreduce_shuffle


yarn.resourcemanager.address
master:8032


yarn.resourcemanager.scheduler.address
master:8030


yarn.resourcemanager.resource-tracker.address
master:8031


yarn.resourcemanager.admin.address
master:8033


yarn.resourcemanager.webapp.address
master:8088

1.3.7修改slaves文件

注意:每个机器名占一行。
master
slave1
slave2

创建namenode 元数据保存目录
mkdir /home/huaqiang/hadoopdata 目录。

1.3.8格式化hadoop
hadoop namenode -format
1.3.9启动hadoop
start-all.sh

#hdfs dfs -put a.txt /

web访问端口:
http://192.168.137.100:50070

你可能感兴趣的:(大数据,hadoop)