产生背景:2003年和2004年谷歌两篇论文:GFS\MAPREDUCE
HDFS:分布式文件系统
MAPREDUCE:分布式运算程序开发框架
HIVE:基于大数据技术(文件系统+运算框架)的SQL数据仓库工具
HBASE:基于HADOOP的分布式海量数据库
ZOOKEEPER:分布式协调服务基础组件
Mahout:基于mapreduce/spark/flink等分布式运算框架的机器学习算法库
Oozie:工作流调度框架
Sqoop:数据导入导出工具
Flume:日志数据采集框架
1.登录root用户
2.修改ip
3.修改主机名
4.配置ssh免密登录
5.关闭防火墙
6.按照jdk
7.解压hadoop安装包
8.配置核心文件: hadoop-env.sh,core-site.xml , mapred-site.xml , hdfs-site.xml
9.配置hadoop环境变量
10.启动节点start-all.sh
hdfs dfsadmin -report (查看集群的健康状态,等同于浏览器上50070端口。可以查看是否安全模式)
hdfs dfs -help rm ------------------------输出某个命令参数手册
hdfs dfs -ls ------------------------显示目录信息
hdfs dfs -mkdir -p /test/test1/test2 ----创建目录
hdfs dfs -moveFromLocal /local/test.txt /testhdfs/test ----从本地剪切粘贴到hdfs
hdfs dfs -moveToLocal /testhdfs/test/test.txt /local/ ----从hdfs剪切粘贴到local
hdfs dfs -appendToFile /hello.text /nihao.text ----追加数据到已经存在的一个文件末尾
hdfs dfs -cat /hello.txt ----查看文件全部内容
hdfs dfs -tail /hello.txt ----查看文件末尾
hdfs dfs -text /test/log.log ----以字符串形式打印文件内容
hdfs dfs -chmod 666 /hello.txt --修改权限
hdfs dfs -chow hadoop:hadoop001 /hello.txt --修改权限组
hdfs dfs -copyFromLocal ==hdfs dfs -put --上传文件
hdfs dfs -copyToLocal ==hdfs dfs -get --下载文件
hdfs dfs -cp /hello.txt /testcp/hello2.txt -------hdfs之间复制文件
hdfs dfs -mv /hello.txt /testcp/ ---移动文件或者修改文件名
hdfs dfs -getmerge /testhdfs/* /local/sum.txt 合并下载到本地的一个文件
hdfs dfs -rm -r /test 删除文件活文件夹
hdfs dfs -rmdir /testhdfs/test 删除空目录
hdfs dfs -df -h / 统计当前目录可用空间信息
hdfs dfs -du -h /test/ 统计文件夹的大小信息
hdfs dfs -count /testhdfs/ 统计目录下的所有文件节点数量
hdfs dfs -setrep 3 /testhdfs/test/txt 设置hdfs中文件的副本数量
NameNode、DataNode、Secondary NameNode
ps:当客户端对hdfs的文件进行修改或者新增时候,操作记录先被记载在edits日志文件中,当客户端操作成功后,响应的元数据才会更新到meta data中。
工作职责:定期合并 NameNode 上的fsimage元数据镜像和所有操作日志edits。
每隔一段时间,会由 Secondary NameNode 去复制 NameNode 上最新的一个fsimage文件和累积所有的edits文件下载到本地,然后加载到内存中merge合并。(这个过程交checkpoint)
ps:
checkpoint 的配置参数:
dfs.namenode.checkpoint.check.period=60 #检查是否满足条件触发checkpoint 为60秒
dfs.namenode.checkpoint.dir=file://${hadoop.tmp.dir}/dfs/namesecondary #checkpoint目录 Secondary NameNode
dfs.namenode.checkpoint.edits.dir=${dfs.namenode.checkpoint.dir} #edits 目录
dfs.namenode.checkpoint.max-retries=3 #最大重试次数
dfs.namenode.checkpoint.period=3600 #两次checkpoint 间隔
dfs.namenode.checkpoint.txns=1000000 #两次checkpoint之间的操作记录最大限制
Hight Availability 高可用主要用于解决NameNode单点故障问他,以热备方式为NameNode提供一个备用Namenode。一旦active的主namenode出故障了,standby状态的Namenode马上切换为active接替工作。
HA机制:
HA主要是为了解决单点故障问题,通过jounalnode共享集群状态,通过zkfc选举active的namenode,时刻监控着状态,自动备援。
jounalnode存放管理edits文件,active namenode会将修改或者增加数据的操作日志edits写入共享文件管理系统jounalnode,standby namenode监控这这个系统,一旦发现有新的数据写入,则读取这些数据,加载入自己的内存中。
以保证stadnby namenode 跟active namenode的内存状态是一致的。在紧致状态下standby namenode便可快速转换为active namenode。
转换步骤如下:
mapreduce是一个分布式运算程序框架
mapreduce核心功能是将用户编写的业务逻辑代码和自带的默认组件整合成一个完整的分布式运算程序,并发运行在一个hadoop集群上。
一个完整的mapreduce程序在分布式运行上有三个实例进程和1个重要机制
(问题1:读取数据的时候产生多少个mapper好? mapper数量太多会产生大量的小文件,过多的mapper创建和初始化及关闭虚拟机会产生大量的硬件资源。mapper太少则并发度小,job执行时间长,无法充分利用分布式硬件资源)
(问题2:mapper由什么决定? 1.输入文件的数量 2,输入文件大小 3.配置参数,可以设置minsize,maxsize,block.size,这三个配置影响了splitSize切分文件size的大小,SplitSize=Math.max(minsize,Math.min(MaxSize,blockSize)),一般情况下切分文件是按blocksize切分,hadoop2.x是128M,1.x是60M)
(问题3:解决小文件过多 减少mapper数增大合并值 ?例如5M,10M的数据很快处理完了,但是128M的处理很长,需要控制参数来调整mapper,这里需要减少mapper,需要合并小的文件,可以设置参数合并器的大小))
(问题:自定义partition。 每一个reducer 的输出都是有序的,但是合并所有的reducer不是全局有序的,所以为了全局有序,可以自定义partition,用输入的数值除以reducer的数量的商为值分割界限,即边界为商的一倍、二倍…numpartition-1倍。这样就能保持全局有序。)
(问题:自定义partition ,重写partition 返回值, return key.hashCode() & Integer.MAX_VALUE) % numReduceTasks;)
(问题:自定义partition解决数据倾斜 :对于某些数据值,由于不同的key的hash值是一样的,导致大部分键值对分配给了同一个reducer处理,其他reducer处理很少,从而拖延了job运行,这时候可以自定义相同partition保证相同key值到同一个reducer处理)
3.标记好分区后,maptask会不断将键值对输入到内存的一个环形结构中,这个环形结构是一个字节数组,叫KVbuffer,也叫环形缓冲区。环形缓冲区默认大小是100M可以通过调整mapreduce.task.io.sort.mb参数调整大小。
4.当环形缓冲区达到了80%后,会进行溢写数据,将数据从内存中溢写spill到磁盘中去。但是在溢写之前会进行一个sort排序,按照key索引进行字典排序。
(问题:通过调整参数增大spill内存大小和增大spill阈值去尽量减少溢写的次数去优化提高性能。)
5.溢出的数据文件会被用归并算法合并成更大的溢出文件,如果设定了combiner的话也可以对溢写的文件进行combiner操作,根据自定义的combiner函数对mapper的结果进行合并(默认一般是spill出的文件每三个就合并一个)
6.在spill溢写和merge合并的过程中,都要调用partition进行分组和针对key进行排序。
(问题:通过压缩减少磁盘IO和网络IO。如果中间文件非常大,可以通过设置mapreduce.map.output.compres为true进行压缩,reducer读数据后也需要解压文件。压缩一般能10倍的减少IO操作,但是这个过程会消耗CPU)
(数据被下载后,map不会马上删除,这是为了防止reduce错误。)
(reducetask下载数据的时候,有可能会因为map机器发生错误或者中间文件丢失或者网络瞬断,导致下载失败,当一定时间后下载还是失败,reducetask就会放弃此次下载,到另外的地方下载(这段时间可能map会重跑),可以设定增加mapreduce.reduce.shuffle.read.timeout来优化)
(reducer溢写后也可以设定combiner,减少写入磁盘的数据量)
因为java中的序列化会附带很多额外的信息,像校验信息、hearder和继承体系,不便再网络中传输,所以hadoop有一套自己的序列化机制。
ByteWritable、ShortWritable、IntWritable、LongWritable、FloatWritable、DoubleWritable、Text、NullWritable