一、部分理论知识,架构图 hadoop是用java写的
1.resource manager:处理客户端请求;监控nodemanager;启动或监控application master;资源分配或调度
2.node manager:管理单个节点上资源;处理来自resource manager命令;处理来自application master命令
3.application master:负责数据切分;为单个job任务申请资源;任务的监控和容错
4.container:封装管理内存、cpu、磁盘、网络等资源
5.mapreduce:map处理输入数据;reduce对map结果汇总
6.yarn:负责分配和管理所有资源;主要由resourceManager,nodeManager,ApplicationMaster,Container等组件;hadoop默认采用容量调度器模式,可使用yarn.resourcemanager.scheduler.class来更改调度模式(1.先进先出队列调度;2.容量确定队列调度;2.公平队列调度)
7.sqoop:负责把数据库数据导入导出到hadoop
8.flume:分布式读机器上海量日志文件,不规则的日志文件(文本文件)聚合传输到hadoop,提供高可用。流式架构,简单灵活
9.kafka:将文件ppt,word,视频等文件导导hadoop
10.zookeeper:集群平台配置和调度,存储,管理数据
11.namenode:管理hdfs名称空间;配置副本策略;管理数据块映射信息;处理客户端读写请求;
扩展:加载编辑日志和镜像文件到内存,有元数据变化时先更新编辑日志再加载到内存
12.datanode:存储实际数据块;执行数据块的读写操作;
13.secondary namenode:并非namenode的热备份;辅助namenode,分担其工作量;定期合并fsimage和edits并推送给namenode;紧急情况可以恢复namenode;
扩展:定时请求是否需要(或edits日志满了)执行chenckPoint;namenode滚动写edits;拷贝fsimage和edits到自己主机然后和成新的fsimage;再拷贝新fsimage.chkpoint到namenode主机;namenode再重命名fsimage;
14.dfs.blocksize = 128 ,是定义hadoop块大小,此值是按照磁盘传输速率来定义,当前磁盘传输速率为100m/s,即为128M块大小,如果是固态硬盘可加到256M
15.Serializable:可序列化是把内存中对象转换为字节序列,存储到磁盘或者网络传输。 hadoop序列化高效快速,紧凑,节省空间,可扩展,支持多语言
16.maptask任务数 = 文件1大小 / 块大小 + 文件2大小 / 块大小 + 文件N大小 / 块大小 ;块大小=128M;数据切片 = 文件1大小 / 块大小
17.reduceTask任务数 = 分区个数只输出文件个数
18.spark:基于内存的快速、通用、可扩展的大数据分析计算引擎
19.SparkSQL 发展过程:Hive -> Shark(Hive on spark) -> SparkSQL
1.Hive 支持写SQL 查询分布式数据,底层Hive负责SQL解析优化,转成MapReduce任务处理数据。
2.Shark 是早期Spark与Hive整合出来的,支持Sprak中写SQL查询分布式数据技术,Shark依赖了hive的解析优化SQL,底层转成Spark任务处理数据。
3.SparkSQL是基于Shark演变过来,SparkSQL脱离了Hive的限制,与Hive做到了解耦。
4.Shark兼容Hive语言,SparkSQL兼容Hive与Shark语法。
5.SparkSQL可以针对原生的RDD进行查询,查询得到的结果又可以转换成RDD去使用。
20.hive:基于hadoop的数据仓库工具,可以将结构化数据文件映射为一张表,并提供类sql查询功能。
21.JournalNode:两个NameNode为了数据同步,会通过一组称作JournalNodes的独立进程进行相互通信。当active状态的NameNode的命名空间有任何修改时,会告知大部分的JournalNodes进程。standby状态的NameNode有能力读取JNs中的变更信息,并且一直监控edit log的变化,把变化应用于自己的命名空间。standby可以确保在集群出错时,命名空间状态已经完全同步了。
二、hadoop集群安装
1.三台机器配置(关闭防火墙,修改静态ip,修改主机名称)
2.安装jdk及配置环境变量
3.安装hadoop及配置环境变量
4.配置集群及单节点启动
5.配置ssh
6.取官网下载CDH版本的hadoop,里面与其它对应版本组件可以完全兼容 http://archive.cloudera.com/cdh5/cdh/5/
三、hdfs基本命令
hadoop fs:使用面最广,可以操作任何文件系统。
hadoop dfs与hdfs dfs:只能操作HDFS文件系统相关(包括与Local FS间的操作),前者已经Deprecated,一般使用后者。
hadoop fs -mkdir /user/root/input2
hadoop fs -ls -R / #查看hadoop级联目录
hadoop fs -moveFromLocal 本地文件 /user/root/input2 #剪切文件到hadoop
hadoop fs -appendToFile 本地文件 /user/root/input/wc.input #追加文件
hadoop fs -cat /user/root/input/wc.input
hadoop fs -cat /data/hive/warehouse/rpt/track_cjhj_ad_d/dt=2018-12-05/* #查询hadoop文件目录及文件内容
hadoop fs -copyFromLocal 本地文件 /user/root/input2 #复制文件到hadoop
hadoop fs -copyFromLocal /home/etl/wm.log /user/wm.log
hadoop fs -copyToLocal /user/root/input2 本地文件 #从hadoop复制文件到本地
hadoop fs -cp /user/root/input2/wc.input /user/root/input/ #从hadoop一个目录拷贝到另外一个目录
hadoop fs -mv /user/root/input2/wc.input /user/root/input/ #从hadoop一个目录剪切到另外一个目录
hadoop fs -get /user/root/input2/wc.input 本地文件 #从hadoop复制文件到本地
hadoop fs -getmerge /user/root/output/*log 本地文件 #将hadoop文件合并成一个文件下载到本地
hadoop fs -put /本地文件 /user/root/input/wc.input #上传到hadoop集群
hadoop fs -tail /user/root/input/wc.input
hadoop fs -rm -R /user/root/input
hadoop fs -rmdir /user/root/input2 #删除空文件夹
hadoop fs -du -h -s /use/root/
hadoop fs -setrep 2 /user/root/input/wc.input #设置某个文件副本数量
hdfs dfs -mkdir /user/root/input #在linux命令前加hdfs dfs 就是在hadoop中处理
hdfs dfs -mkdir /user/root/output #在linux命令前加hdfs dfs 就是在hadoop中处理
hdfs dfs -put /本地文件 /user/root/input/wc.input #上传到hadoop集群
hdfs oiv -p xml -i fsimage_0000000000000000738 -o fsimage_738.xml #将fsimage文件提取出来查看 -p转换为xml格式 -i输入文件 -o输出文件
hdfs oev -p xml -i edits_0000000000000000735-0000000000000000736 -o edits_736.xml #将edits文件提取出来查看 -p转换为xml格式 -i输入文件 -o输出文件
hdfs dfsadmin -allowSnapshot /user/root/input/ #开启此目录快照功能
hdfs dfsadmin -disallowSnapshot /user/root/input/ #禁用此目录快照功能
hdfs dfs -createSnapshot /user/root/input old_snapshot_name #创建此目录的一个快照
hdfs dfs -renameSnapshot /user/root/input/ old_snapshot_name new_snapshot_name #将以前的快照名old_snapshot_name改为new_snapshot_name
hdfs lsSnapshottableDir
hdfs snapshotDiff /user/root/input/ . ..snapshot/old_snapshot_name #比较快照和当前目录差别
hdfs dfs -deleteSnapshot <path> <new_snapshot_name> #删除快照
hadoop distcp dir1 dir2 可用来代替cp,但又有所不同;1.dir2 不存在,则新建dir2,dir1下文件全部复制到dir2;2.dir2 存在,则目录dir1被复制到dir2下,形成dir2/dir1结构,这样的差异原因是为了避免直接覆盖原有目录文件。可以使用-overwrite,保持同样的目录结构同时覆盖原有文件。3.也可以使用-update,比如hadoop distcp dir1 dir2仅更新dir2下相对dir1下发生变化的文件。注意不使用-overwrite和-update时,同名的文件就算发生了变化,也不会替换。
hadoop distcp -update -delete hdfs://namenode1:port1/dir1 hdfs://namenode2:port2/dir2 #常用跨集群备份操作如下:这里-delete删除没在源路径出现的文件或文件夹,-p文件状态属性如权限、副本、块大小等。
hadoop fs -distcp file1 file2 #并行复制,比cp快
hadoop fs -distcp dir1 dir2 #并行复制,比cp快,复制目录
hadoop distcp -update dir1 dir2 #update仅更新有变化的
hadoop distcp -update -delete -p hdfs://namenode1/foo hdfs://namenode2/foo #delete删除目标目录中没有在源路径中出现的文件或目录
hadoop archive -archiveName gs.har -p /user/root/input/ /user/root/output
-archiveName 指定归档文件名;
-p 指定要进行归档目录的父目录,支持同时归档多个子目录;
hadoop fs -ls -R har:///user/root/output/gs.har #可以查看归档的文件明细信息,按照har文件格式查
hadoop fs -expunge #将回收站内容打包,等待到期后清理
hadoop jar /root/hadoop-2.10.1/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.10.1.jar wordcount /user/root/input/wc.input /user/root/output
rsync -rvl $pdir/$fname $user@$hostname:$pdir/$fname #r:递归;v:显示复制过程;l:拷贝符号链接;只同步有差异的文件,比scp快好
hdfs fsck /user/hadoop-twq/ -files -blocks #可以查看一个指定文件的所有的Block详细信息,需要和-files一起使用:
hdfs fsck / -delete #因为损坏的block并不是很重要,所以直接删除掉了
四、节点距离计算;d:data数据中心;r:rack机架;n:node节点 ;两个节点到达最近祖先的距离和
DISTANCE(d1/r1/n1,/d1/r1/n1)=0 ; 每往上一层+1,找到相同的
DISTANCE(d2/r2/n2,/d1/r1/n1)=6 ;
副本节点存储的选择:本地机架上任意节点,本地机架上另外一节点,其它机架上任意节点
副本节点读取的选择:本地机架某一节点,其它机架上某一节点,并行读
五、运维namenode
1.namenode主节点下 /root/hadoop/namenode/current/ 下面的 fsimage 和 edits文件丢失
2.拷贝secondarynamenode节点上面/root/hadoop/tmp/dfs/namesecondary/current/ 下面所有文件到fsimage 和 edits目录
3.重启主结点namenode进程 hadoop-daemon.sh start namenode
1.namenode主节点下 /root/hadoop/namenode/current/ 下面的 fsimage 和 edits文件丢失
2.拷贝secondarynamenode节点上面/root/hadoop/tmp/dfs/namesecondary/current/ 下面所有文件到同级目录/root/hadoop/tmp/dfs/namesecondary/current/
3.删除拷贝过来的in_use.lock文件
4.执行命令 hdfs namenode -importCheckpoint 等待一会
5.再执行 hadoop-daemon.sh start namenode
六、hadoop安全模式
hdfs dfsadmin -safemode get #查看当前集群模式的状态
hdfs dfsadmin -safemode enter #进入安全模式,安全模式下不能操作集群
hdfs dfsadmin -safemode leave #离开安全模式,之后可正常操作集群
hdfs dfsadmin -safemode wait #等待离开安全模式后可以执行后续操作,一般写shell脚本中,程序控制
七、增加新节点
克隆以前某台机器到新几点(克隆192.168.100.103到192.168.100.104,配置IP,修改主机名称,增加hosts名称)
配置192.168.100.104 的ssh免秘钥认证:分别发给四台机器;
登录1/2/3号机器分别设置 给104的免秘钥认证;
slaves 中添加 hadoop4 号机器(要添加的节点名称)
uuidgen ens33 #linux生成新的uuid
八、Hadoop 压缩格式 gzip/snappy/lzo/bzip2 比较;详细见csdn收藏
io.compression.codecs # 在core-site.xml中设置此参数。控制map输入阶段开启压缩模式
set hive.exec.compress.intermediate=true; #在hive模式下开启map输出阶段压缩
mapreduce.map.output.compress #mapred-site.xml设置是否开启map输出的压缩模式,默认关闭
mapreduce.map.output.compress.codec #mapred-site.xml设置开启map输出的压缩模式的压缩类型,默认为 org.apache.hadoop.io.compress.DefaultCodec
set hive.exec.compress.output=true; #在hive模式下开启reduce输出阶段压缩
mapreduce.output.fileoutputformat.compress #mapred-site.xml设置是否开启reduce输出的压缩模式,默认关闭
mapreduce.output.fileoutputformat.compress.codec #mapred-site.xml设置开启reduce输出的压缩类型,默认为org.apache.hadoop.io.compress.DefaultCodec
mapreduce.output.fileoutputformat.compress.type #mapred-site.xml设置开启reduce输出的压缩按照哪种类型,默认record行,block块,none不指定。 按理block压缩效率高
查看当前hadoop已支持哪些压缩格式;hadoop2.6.0本地库包含组件压缩编码解码器(bzip2, lz4, snappy, zlib)
[root@master ~]# hadoop checknative
21/01/12 13:29:19 INFO bzip2.Bzip2Factory: Successfully loaded & initialized native-bzip2 library system-native
21/01/12 13:29:19 INFO zlib.ZlibFactory: Successfully loaded & initialized native-zlib library
21/01/12 13:29:19 WARN zstd.ZStandardCompressor: Error loading zstandard native libraries: java.lang.InternalError: Cannot load libzstd.so.1 (libzstd.so.1: 无法打开共享对象文件: 没有那个文件或目录)!
Native library checking:
hadoop: true /root/hadoop-2.10.1/lib/native/libhadoop.so.1.0.0
zlib: true /lib64/libz.so.1
snappy: true /lib64/libsnappy.so.1
zstd : false
lz4: true revision:10301
bzip2: true /lib64/libbz2.so.1
openssl: false Cannot load libcrypto.so (libcrypto.so: 无法打开共享对象文件: 没有那个文件或目录)!
九、hadoop存储格式;常用的文件格式有:TextFile、SequenceFile、Avro、Parquet、RC & ORC 一般配合上面压缩格式使用
每个分片文件128M,太大影响每个机器运行时间,太小影响yarn调度时间,创建文件也可以指定分片
TEXTFILE:默认格式,存储方式为行式存储,在检索时磁盘开销大 数据解析开销大,而对压缩的text文件 hive无法进行合并和拆分.常采用csv、json等固定长度的纯文本格式
便于与其他应用程序、脚本进行数据交换
易读性好、便于理解
数据存储量非常庞大
查询效率不高
不支持块压缩
SEQUENCEFILE:二进制文件,以<key,value>的形式序列化到文件中,存储方式为行式存储,可以对文件进行分割和压缩,一般使用block压缩,使用Hadoop 的标准的Writable 接口实现序列化和反序列化,和hadoop api中的mapfile是相互兼容的。
特点:常用于MapReduce作业之间传输数据
二进制文件直接将<key , value>序列化到文件中
可用于Hadoop中小文件的打包存档
支持记录压缩、块压缩
二进制文件,可读性低
Avro:Apache Avro是一个序列化系统,出自Hadoop之父Doug Cutting
以json格式存储数据定义(对表的描述、字段、字段类型等),以二进制格式存储数据
比较通用的数据格式
具有丰富的数据结构
快速可压缩的二进制数据格式
自带远程调用RPC
可读性低
Parquet:支持嵌套的数据模型,类似于Protocol Buffers,每一个数据模型的schema包含多个字段,每一个字段有三个属性:重复次数、数据类型和字段名。
Parquet格式是Spark SQL默认的数据源
按列进行存储,按需读取列,压缩编码可以降低磁盘存储空间(比如有5个"d",它能够将数据转化成类似于这种结构:“d5”)
RCFILE:存储方式为数据按行分块,每块按照列存储的行列混合模式,具有压缩快,列存取快的特点。在使用时,读记录尽量涉及到的block最少,这样读取需要的列只需要读取每个row group 的头部定义,具有明显速度优势。读取全量数据的操作 性能可能比sequencefile没有明显的优势。
由Facebook开源
存储行集合,并在集合中以列格式存储行数据
引入轻量级索引,允许跳过不相关的行块
可分割,允许并行处理行集合
支持块压缩
ORC:原生是不支持嵌套数据格式的,而是通过对复杂数据类型特殊处理的方式实现嵌套格式的支持。
RC的优化版本
常用于Hive
压缩率极高
疑问:
1.时间服务器以某一台机器为准,万一那台机器正好出问题了呢?
2.集群管理工具用哪个,主要是数据分发和执行每台机器命令
十、部分调度工具介绍
oozie和Azkaban (个人不建议使用这两个)
Oozie:训象人(调度mapreduce)。一个基于工作流引擎的开源框架,Oozie需要部署到java servlet中运行,主要用于定时调度,多任务之间按照执行的逻辑顺序调度。
Azkaban是由Linkedin开源的一个批量工作流任务调度器。用于在一个工作流内以一个特定的顺序运行一组工作和流程。Azkaban定义了一种KV文件格式来建立任务之间的依赖关系,并提供一个易于使用的web用户界面维护和跟踪你的工作流。