Hadoop环境搭建
Index of /cdh5/cdh/5
hadoop-2.6.0-cdh5.7.0.tar.gz
hive-1.1.0-cdh5.7.0.tar.gz
spark-2.1.1-bin-hadoop2.7.tgz
软件存放路径
hadoop/hadoop
/home/hadoop
software: 存放所有下载的软件包
app:存放所有软件的安装目录
data:存放测试数据
source:存放软件源码,spark
1)下载hadoop
2)安装jdk,配置到系统环境变量里面(~/.bash_profile)
export JAVA_HOME=/home/hadoop/app/jdk1.7.0_51
export PATH=$JAVA_HOME/bin:$PATH
export MAVEN_HOME=/home/hadoop/app/apache-maven-3.3.9
export PATH=$MAVEN_HOME/bin:$PATH
export HADOOP_HOME=/home/hadoop/app/hadoop-2.6.0-cdh5.7.0
export PATH=$HADOOP_HOME/bin:$PATH
export HIVE_HOME=/home/hadoop/app/hive-1.1.0-cdh5.7.0
export PATH=$HIVE_HOME/bin:$PATH
export SCALA_HOME=/home/hadoop/app/scala-2.11.8
export PATH=$SCALA_HOME/bin:$PATH
export SPARK_HOME=/home/hadoop/app/spark-2.1.0-bin-2.6.0-cdh5.7.0
export PATH=$SPARK_HOME/bin:$PATH
3)设置机器参数
hostname : hadoop001
- 修改机器名:vi /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=hadoop001
- 设置ip和hostname的映射关系:/etc/hosts
192.168.68.116 hadoop001
127.0.0.1 localhost
- 设置ssh免密码登陆(本步骤可以省略,但是后面重启hadoop进程的时候需要手工输入密码才行)
ssh-keygen -t rsa
cp ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys
4)hadoop配置文件修改
/home/hadoop/app/hadoop-2.6.0-cdh5.7.0/etc/hadoop
- hadoop-env.sh
export JAVA_HOME=/home/hadoop/app/jdk1.7.0_51 - core-site.xml
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop001:8020</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/app/tmp</value>
</property>
- etc/hadoop/hdfs-site.xml:
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
5)格式化HDFS
注意:这一步操作,只是在第一次时执行,没为此如果到格式化的话,那么HDFS上的额数据就会被清空
bin/hdfs namenode -format
bin目录下是客户端的一些命令
6)启动HDFS
sbin/start-dfs.sh
sbin目录下面是集群相关的命令
cd /home/hadoop/tmp/dfs/ 将name/current下的VERSION中的clusterID复制到data/current下的VERSION中,覆盖掉原来的clusterID 出现该问题的原因:在第一次格式化dfs后,启动并使用了hadoop,后来又重新执行了格式化命令(hdfs namenode -format),这时namenode的clusterID会重新生成,而datanode的clusterID 保持不变。
验证是否启动成功:
jps
- DataNode
- SecondaryNamenode
- Namenode
浏览器
http://192.168.68.116:50070
7)停止HDFS
sbin/stop-dfs.sh
Hadoop
Hadoop生态系统
是一个分布式系统基础架构
包括
- Distributed File System (DFS)
- YARN
- MapReduce
为什么很多公司选择Hadoop作为大数据平台的解决方案
1)开源
2)社区活跃,参与者多
3)涉及到分布式存储和计算的方方面面:
- Flume进行数据采集
- spark/mapreduce/hive进行数据处理
- HDFS/Hbase 进行数据存储
4)已经得到企业界的验证
HDFS
- Hadoop实现的一个分布式文件系统 (Hadoop Distributed File System)
- 基于Google的FGS论文,发表于2003年,是GFS的克隆版
HDFS的设计目标:
- 非常巨大的分布式文件系统
- 运行在普通的廉价硬件上
- 易扩展、为用户提供性能不错的文件存储服务,简单的增加机器扩展存储量
HDFS架构:
1)1 个Master(NameNode简称NN) 带 N个Slaves(DataNode简称DN)
HDFS/YARM/Hbase 都采用这种架构
2)一个文件会被拆分成多个Block,按照blocksize的规则拆分
如果blocksize:128M
文件130M ==> 会被拆分成两个block:128M 和 2M
并且两个Block不会存放在一个DataNode上,会被分散的存在多个DataNode上,防止机器挂掉,丢失数据
3)NameNode和DataNode
通常可以放在一些廉价的机器上,通常是Linux系统。一个典型的架构是,一台机器上运行一个NameNode,其他的机器,每一个部署一个DataNode。也可以一台机器运行多个DataNodes,但是生产环境不这么干。
NameNode
1)负责客户端请求的响应
2)负责元数据的管理,当一个发起一个读的请求的时候,首先要去NN上查文件在什么地方(文件的名称,副本系数,Blocks存放的DNs)
3)操作文件,打开一个文件,关闭文件,重命名文件或目录,还决定了Block到底存在那个DataNode上。DataNode
1)存储用户的文件对应的数据块(Block),真正的数据的存储
2)响应文件系统客户端发过来的读写请求,还有Block创建,删除,副本的管理
3)要定期向NameNode发送心跳信息,汇报本身及其所有的block的信息,健康状况
资源调度框架YARN
YARN的架构
1个RM(ResourceManager) + N个 NN(NodeManager)
ResourceManager的职责
整个集群中active状态的RM只有一个,负责这个集群中资源的管理和调度
1)处理客户端提交的请求,比如启动一个作业,杀死一个作业
2)接收一个一个作业后,RM会启动一个Application Master(一个作业对应一个AM)
3)监控NodeManager状态
4)系统的而资源分配和调度NodeManager:整个集群中有N个,负责N个节点的资源和使用以及task的运行情况
1)定期向RM汇报本节点的资源使用情况和各个Container的运行状态
2)接收应处理RM的container启停的各种命令
3)单个节点的资源鬼案例和任务管理Application Master:每个作业对应一个,负责应用程序的管理
1)数据切分
2)为应用程序向RM申请资源(container),并分配给内部任务
3)于NN同喜以启停task,task是运行在container中的
4)task的监控和容错
-Container:对一个任务运行情况的描述:CPU,memory,环境变量等
YARN执行流程
1)用户向YARN提交作业
2)RM为该作业分配第一个Container(AM)
3)RM于对应的NM通信,要求NM在这个Container上启动应用程序的AM
4)AM首先向RM注册,然后AM将为各个人物申请资源,并监控运行情况
5)AM采用轮训的方式通过RPC协议向RM申请和领取资源
6)AM申请到资源以后,便和相应的NM通信,要求NM启动任务
7)NM启动我们作业对应的task
YARN环境搭建
1) etc/hadoop/mapred-site.xml:
cp etc/hadoop/mapred-site.xml.template etc/hadoop/mapred-site.xml
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
2) etc/hadoop/yarn-site.xml:
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
3) 启动
sbin/start-yarn.sh
验证启动是否成功:
jps
- NodeManager
- ResourceManager
浏览器
4) 停止
sbin/stop-yarn.sh
5)提交MR作业到yarn上运行:WordCount
官方提供的代码在这个地方
/home/hadoop/app/hadoop-2.6.0-cdh5.7.0/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0-cdh5.7.0.jar
hadoop jar /home/hadoop/app/hadoop-2.6.0-cdh5.7.0/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0-cdh5.7.0.jar wordcount /input/wc/hello.txt /output/wc/
再次运行的时候会报错,因为文件已经存在了,删掉就可以了
hadoop -rm -r /output/wc
Hive
2007 年开始
背景:
- MapReduce 编程的不便性
- HDFS上的文件缺少Schema,(不能通过SQL查询HDFS上的数据)
描述
- 由facebook开源,最初用于解决海量结构化日志数据统计问题
- 构建在hadoop之上的数据仓库
- hive定义了一种类SQL的查询语言:HQL(类似SQL但不完全相同)
- 通常用于进行离线数据处理(以前底层采用MapReduce,现在的底层支持多种不同的执行引擎spark,tez)
hive on MapReduce
hive on tez
hive on spark - 支持多种不同的压缩格式,存储格式以及自定义函数。
压缩:GZIP,LZO,Snappy,BZIP2…
存储:TextFile,SequenceFile,RCFile,ORC,Parquet
为什么使用Hive
- 简单,容易上手(提供了HQL)
- 为超大数据集设计的计算/存储扩展能力(MR计算,HDFS存储)
- 统一的元数据管理(可与Presto/Impala/SparkSQL等共享数据),在hive中创建了一个表,可以在sparkSQL中使用,反之亦然
Hive体系架构
元数据存放在MySQL中(表名,字段,类型等),生产环境还要做主备
Hive的生产环境架构
Hive环境搭建
http://archive.cloudera.com/cdh5/cdh/5/hive-1.1.0-cdh5.7.0.tar.gz
tar -zxvf hive-1.1.0-cdh5.7.0.tar.gz -C ~/app/
1)配置环境变量
export HADOOP_HOME=/home/hadoop/app/hadoop-2.6.0-cdh5.7.0
export PATH=$HADOOP_HOME/bin:$PATH
2)事先安装一个MySQL
建一个文件hive-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost:3306/sparksql?createDatabaseIfNotExist=true</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>root</value>
</property>
</configuration>
3)hive-env.sh中添加
HADOOP_HOME=/home/hadoop/app/hadoop-2.6.0-cdh5.7.0
4)复制MySQL驱动到/hive/lib中
5)启动hive
$HIVE_HOME/bin/hive
Hive基本使用
- 创建表
CREATE TABLE hive_wordcount(context string);
- 加载数据到hive表
LOAD DATA LOCAL INPATH ‘filepath’ INTO TABLE tablename
load data local inpath '/home/hadoop/data/hello.txt' into table hive_wordcount;
select word,count(1) from hive_wordcount lateral view explode(split(context,'\t')) wc as word group by word;
lateral view explode() :是把每行记录按照指定分隔符进行拆解
hive SQL提交执行以后会生成MR作业,并在yarn上运行