目录
一. 大数据技术生态体系
二、hadoop入门
1. hadoop目录结构
- bin: Hadoop的命令
- sbin: Hadoop的脚本
- etc: Hadoop的配置文件
- share: Hadoop的jar包
2. hadoop集群启动
2.1 单点启停
- 2.1.1 如果集群是新集群,第一次启动需要格式化namenode
在namenode的节点执行:hdfs namenode -format
- 2.1.2 启动namenode(停止将start改为stop)
在namenode的节点执行:hdfs --daemon start namenode
- 2.1.3 启动datanode(停止将start改为stop)
在所有的节点执行:hdfs --daemon start datanode
- 2.1.4 启动2nn(停止将start改为stop)
在2nn的节点执行:hdfs --daemon start secondarynamenode
- 2.1.5 启动resourcemanager(停止将start改为stop)
在rm的节点执行:yarn --daemon start resourcemanager
- 2.1.6 启动nodemanager(停止将start改为stop)
在所有的节点执行:yarn --daemon start nodemanager
- 2.1.7 验证:
通过js命令查看所有的继承是否存在或者通过web端访问:
dfs:http://hadoop102:9870
yarn:http://hadoop103:8088
history:http://hadoop102:19888 - 2.1.8 重复格式化namenode需要注意的问题:
重复格式化namenode,会导致namenode中的VERSION的clusterID发生变化,而datanode的VERSION的clusterID依然是旧的,导致datanode找不到namenoded,当启动datanode不久会自动下线。所以重复格式化namenode前,要删除每个节点的data目录,再进行格式化.
2.2 群启群停
\qquad
前提:配置ssh免密登录,配置workers文件(hadoop2.x中是slaves文件)
\qquad
在NN的节点:start-dfs.sh / stop-dfs.sh
\qquad
在rm的节点:start-yarn.sh / stop-yarn.sh
3. hadoop命令
3.1 hdfs命令
- 3.1.1 在HDFS中创建目录
hadoop fs -mkdir /input
- 3.1.2 上传文件到HDFS
hadoop fs -put 上传的文件路径 /input
- 3.1.2 查看Datanode存储的数据
cd /opt/module/hadoop-3.1.3/data/data/current/BP-1785378398-192.168.64.102-1679851386019/current/finalized/subdir0/subdir0 && ll
3.2 yarn命令
- 3.1.1 在yarn 上执行wordcount程序
- 在HDFS创建一个目录
-
hadoop fs -mkdir /wcinput
- 上传数据到/wcinput
-
hadoop fs -put 上传的数据 /wcinput
- 执行wordcount
-
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /wcinput /wcoutput
4. hadoop端口
\qquad
NameNode内部通信端口:8020
\qquad
NameNode web端口:9870
\qquad
2NN web端端口:9868
\qquad
ResourceManager web端口:8088
\qquad
历史服务器web端端口:19888
5. hadoop HDFS命令
https://upward.blog.csdn.net/article/details/129708606?spm=1001.2014.3001.5502
6. MapReduce优化手段
- MapReduce程序运行瓶颈
- 计算机性能
- CPU、内存、磁盘健康、网络
- I/O操作优化
- 数据倾斜
- MapReduce设置不合理
- Map运行行时间太长,导致Reduce等待过久
- 小文件过多
- 大量的不可分块的超大文件
- Spill次数过多
- Merge次数过多等
- 优化方法
MapReduce优化方法主要从六个方面考虑:数据输入、Map阶段、Reduce阶段、 IO传输、数据倾斜问题和常用的调优参数。
- map阶段
(1)减少溢写(Spill )次数:通过调整mapreduce.task.io.sort.mb及mapreduce.task.sort.spill.percent 数值,增大触发Spill内存上限,减少Spill次数,从而减少磁盘IO。
(2)减少合并(Merge)次数:通过调整mapreduce.task.io.sort.factor参数,增大Merge的文件数目,减少Merge次数,从而缩短MR处理时间。
(3)在Map之后,不影响业务逻辑前提下,先进行Combine处理,减少I/O. - reduce阶段
(1)合理设置MapReduce:两个都不能设置太少,也不能设置太多,太少会导致Task 等待,延长处理时间太多,会导致Map和Reduce任务间竞争资源,造成处理超时等错误。
(2)设置Map、Reduce共存:调整mapreduce.job.reduce.slowstart.completedmaps参数,使Map运行到一定程度后Reduce开始运行,减少Reduce等待时间。
(3)规避使用Reduce:因为reduce用于连接数据集的时候将会产生大量的网络消耗。
(4)合理设置Reduce的Buffer:默认情况下,数据达到一个阈值的时候,Buffer的数据就会写入磁盘,然后Reduce从磁盘中获得所有的数据。也就是说,Buffer和Reduce没有直接关联的,中间多次写磁盘>读磁盘的过程,既然有这个弊端,那么就可以通过参数来配置,使得Bufer中的一部分数据可以直接输送到Reduce,从而减少I/O开销: mapreduce.reduce.input.buffer.percent,默认为0.0。当值大于0的时候,会保留指定比例的内存读Buffer中的数据直接拿给Reduce用。这样一来,设置Buffer需要内存,读取数据需要内存,Reducei算也要内存,所以要根据作业的运行情兄进行调整。 - I/O传输
(1)采用数据压缩的方式,减少网络108的时间。安装Snappy和LZO压缩编码器。
(2)使用SequenceFile二进制文件。 - 减少数据倾斜
(1)抽样和范围分区
可以通过对原数据进行抽样得到的结果集来预设分区边界值。
(2)自定义分区
基于输出键的背景知识进行自定义分区。例如,如果Map输出键的单词来源于一本书。且其中某几个专业词汇较多。那么就可以自定义分区将这这些专业词汇发送给固定的一部分Reduce实例。而将其他的都发送给剩余的Reduce实例。
(3)Combine
使用Combine以大量地减少数据倾斜。在可能的情况下,Combine的目的就是聚合并精简数据。
(4)采用Map Join,尽量避免Reduce Join。 - 小文件优化
(1)小文件优化的方向
1. 在数据采集的时候,就将小文件或小批数据合成大文件再上传HDFS。
2. 在业务处理之前,在HDFS上使用 Mapreduce 程序对小文件进行合并。
3. 在 MapReduce 处理时,可采用 CombineTextInputFormat 提高效率。
4. 开启uber模式,实现jvm重用。
(2)Hadoop Archive
是一个高效的将小文件放入HDFS块中的文件存档工具,能够将多个小文件打包成一个HAR文件,从而达到减少NameNode 的内存使用
(3)SequenceFile
SequenceFile 由一系列的二进制kv构成,如果key为文件名,value为文件内容,可将大批小文件合并成一个大文件
(4)CombineTextInputFormat
CombineTextInputFormat 用于将多个小文件在切片过程中生成一个单独的切片或者少量的切片。
(5)开启uber 式,实现jvm重用。
默认情况下,每个Task 务都需要启动一个jvm运行,如果Task f务计算的数据量很小,我们可以让同一个Job 多个Task运行在一个jvm中,不必为每个Task 开启一个jvm
- map阶段
三、hive操作
1. 创建库,创建表,导入表数据
create database mydb;
use mydb;
create table if not exists student(
id int, name string
)
row format delimited fields terminated by '\t';
load data local inpath '/opt/module/hive-3.1.2/data/student.txt' into table student;