分布式计算机1
1.1b bit 最小信息单元0或1B Byte 字节 1B等于8bit 汉字KB 千字节 1KB等于1024B 小段文字MB 兆字节 1MB等于1024KB 一首歌3-5mbGB 吉字节 1024MB 一部电影TB 太字节 1024GB 数据库25万张高清图片PB 拍字节 1024TB 公司数据中心云服务提供商EB 艾字节 1024PB 全球级别 全球天气观测数据ZB 泽字节 全球数量总数40zbYB 尧字节E-R图大数据的4v特征1.大量化 10TB2.多样化来源多格式多结构化 Excel表 关系型数据库my sql半结构化 具有一定的层次结构介于结构化和非结构化之间 xml文件JSON文件电子邮件标题正文附件非结构化 没有固定格式 文本文件图片音乐3.快速化4.价值密度低大数据技术要面对的基本问题也是最核心的问题:就是是海量数据如何可靠存储和高效计算。1.2Google的“三架马车”2003 GFS:The google file system 分布式文件系统存在问题:(1)硬盘不够大?多几块硬盘(2) 数据不够可靠怕丢?数据冗余文件分割成数据块数据块冗余度默认:32004 MapReduce2006 BigTableGFS Master节点管理所有文件系统元数据包括命名空间访问控制信息文件和块当映射信息以及当前块的位置信息GFS存储的文件被分割成固定大小的块每个块都会被复制到多个块服务器上可靠性。块的冗余度默认为3.GFS Master还管理着系统范围内的活动比如块服务器之间的数据迁移等。GFS Master与每个块服务器通信发送心跳包发送指令获取状态副本位置选择的策略要满足两大目标最大化数据可靠性和可用性。MapReduce采用分而治之的思想把对大规模数据集的操作分发给一个主节点管理下的各个子节点共同完成然后整合各个子节点的中间结果得到最终的结算结果。简而言之MapReduce 就是分散任务汇总结果。Map的输出是Reduce的输入1.3Hadoop的概述1.Hadoop是什么1Hadoop是一个由Apache基金会所开发的分布式系统基础架构2主要解决海量数据的存储和海量数据的分析计算问题。3广义上来说Hadoop通常是一个更广泛的概念--Hadoop生态圈2.Hadoop根据是Google三篇论文实现HDFS—GFSMapReduce——MapReduceHBase——BigTable3.HDFSHDFS:是Hadoop项目的核心子项目是分布式计算中数据存储管理的基础1.4 Hasoop的优势1高可靠性hadoop底层维护多个数据副本所以即使hadoop某个计算元素或存储出现故障也不会导致数据的丢失2高扩展性在集群间分配任务数据可方便的扩展数以千计的节点3高效性在MapReduce的思想下Hadoop是并行工作的以加快任务处理速度4高容错性能够自动将失败的任务重新分配适合场景大数据分析离线分析不适合场景少量数据复杂数据在线分析第二周1.4.1hadoop生态圈HDFS分布式文件系统YARN资源管理和调度器MapReduce分布式并行编程模型HBaseHadoop上当非关系型的分布式数据库HiveHadoop上的数据仓库Pig一个基于Hadoop的大规模数据分析平台提供类似SQL的查询语言Pig LatinFlume一个高可用的高可靠的分布式的海量日志采集聚合和传输系统Sqoop用于在Hadoop与传统数据库之间进行数据传递Zookeeper提供分布式协调一致性服务Spark类似于Hadoop MapReduce的通用并行框架组件功能1.HDFS架构1NameNode存储文件的元数据如文件名文件目录结构文件属性生成时间副本数文件权限以及每个文件的块列表和块所在的DataNode等2DataNode在本地文件系统存储文件块数据以及块数据的校验和3Secondary NameNode每隔一段时间对NameNode元数据备份 (不是热备实时备份2.YARN架构概述ResourceManager(RM整个集群资源内存、cpu等的老大 一个NodeManager(NM)单个节点服务器资源老大 多个ApplicationMaster单个任务运行的老大 1.负责数据的切分 2.为应用程序申请资源并且分配给内部任务 3.任务的监控与容错Container容器相当于一台独立的服务器里面封装了任务运行所需要的资源如内存、cpu、磁盘、网络等。说明1.客户端可以有多个2.集群上可以运行多个ApplicationMaster3.每个NodeManager上可以有多个Container1.5.3 MapReduce架构概述MapReduce将计算分为两个阶段:Map和reduceMap阶段并进行处理输入数据Reduce阶段对Map结果进行汇总安装环境1.用来将一个docker镜像从docker load /cg/images/hadoop_node.tar.gz压缩包加载到本地docker环境中2.docker run --name master --privileged --ulimit nofile65535:65535 --hostname master --ip 172.18.0.2 --add-hostslave1:172.18.0.3 --add-hostslave2:172.18.0.4 --add-hostslave3:172.18.0.5 -itd -v /cgsrc:/cgsrc:ro -v /headless/course/:/course hadoop_node /service_start.sh docker run --name slave1 --privileged --ulimit nofile65535:65535 --hostname slave1 --ip 172.18.0.3 --add-hostmaster:172.18.0.2 --add-hostslave2:172.18.0.4 --add-hostslave3:172.18.0.5 -itd -v /cgsrc:/cgsrc:ro hadoop_node /service_start.sh docker run --name slave2 --privileged --ulimit nofile65535:65535 --hostname slave2 --ip 172.18.0.4 --add-hostmaster:172.18.0.2 --add-hostslave1:172.18.0.3 --add-hostslave3:172.18.0.5 -itd -v /cgsrc:/cgsrc:ro hadoop_node /service_start.sh docker run --name slave3 --privileged --ulimit nofile65535:65535 --hostname slave3 --ip 172.18.0.5 --add-hostmaster:172.18.0.2 --add-hostslave1:172.18.0.3 --add-hostslave2:172.18.0.4 -itd -v /cgsrc:/cgsrc:ro hadoop_node /service_start.shname mastermaster容器的名字privileged赋予容器特权模式允许它访问主机上所有设备-ulimit nofile65535:65535 设置文件描述符的软限制和硬限制ip 172.18.0.2 --add-hostslave1:172.18.0.3 --add-hostslave2:172.18.0.4 --add-hostslave3:172.18.0.5 - hostname容器的主机名为master老大2.查看启动docker psdocker ps-a查看所有容器3.启动容器docker start master docker start slave1 docker start slave2 docker start slave34.进入容器docker exec -it --privileged mastername /bin/bash安装java环境1.创建文件夹mkdir /usr/local/java先打开其他文件再复制打开文件cd /cgsrc从资源文件夹/cgsrc中将JDK安装包复制到/usr/local/java目录下[rootmaster cgsrc]# cp /cgsrc/jdk-8u171-linux-x64.tar.gz /usr/local/java/切换到/usr/local/java目录下将安装包解压并删除用过的tar文件。tar -zxvf jdk-8u171-linux-x64.tar.gz删除文件配置环境第三周配置分布式模式分布式文件存储hdfs :namenode1个 DataNode多个secondaryNameNode尽量不跟namenode放在同一个服务器上YarnResourceManager1个 NodeManager多个ResourceManager很消耗内存尽量不要和NameNodesecondaryNameNode配置在同一台机器上hadoop1hadoop2hadoop3hadoop4NameNodeDataNodeDataNodeDataNodeSecond....NodeManagerNodeManagerResourceManagerNodeManagerNodeManagerping ip地址ICMP协议测试两台电脑之间的连通性OSI第三层协议SSHSecure shell安全外壳协议一台计算机----》》一台计算机 一台计算机登录另外一台计算机一般需要密码公钥锁私钥钥匙b同学寄一个箱子给a同学但是箱子比较私密中途不想任何人打开1.a造一把锁公钥和一把钥匙私钥。2.他把锁给b同学锁在谁那谁就是服务器把锁给服务器钥匙a同学藏好了3.b同学拿到了这把锁把箱子锁到了用公钥加密4.中途没有人可以打开5.只有有钥匙的人才能打开a同学有私钥客户端1.生成公钥和私钥的命令ssh-keygen -t rsaknow_hosts记录ssh访问过的计算机的公钥id-rsa生成的私钥id-rsa.pub生成的公钥authorized-keys存放授权过的无密码登录服务器的公钥2.将公钥文件追加到另一个文件authorizd_keys中cat ./id_rsa.pub ./authorized_keys3.scp ~/.ssh/id_rsa.pub rootslave1:/root scp ~/.ssh/id_rsa.pub rootslave2:/root scp ~/.ssh/id_rsa.pub rootslave3:/root把自己本机master把~/.ssh/id_rsa.pub路径下的文件复制rootsalve1:/root(slave1这台机器上用的登录的账户root在slave1这台机器/root这个路径下安全拷贝1.从hadoop102服务器上将本服务器的文件推给hadoop103scp -r jdk.8.0_212/ lotushadoop103:/opt/module2.在hadoop103服务器上操作将hadoop102的文件拿过来scp -r lotushadoop102:/opt/module/jdk.1.8.0_212/ ./同理hadoop也可以这么操作scp -r lotushadoop102:/opt/module/hadoop-3.1.3/ ./3.在103服务器是将102的文件拷贝到104scp -r lotushadoop102:/opt/module/* lotushadoop104:/opt/module/rsync远程同步工具cat ~/id_rsa.pub ~/.ssh/authoried_keys将~/.id_rsa.pub文件的内容追加到~/.ssh/authorized_keys这个文件的末尾在slave1里面ssh master不需要密码1.slave1需要生成私钥和公钥ssh-keygen -t rsa2.slave1公钥给masterscp ~/.ssh/id_rsa.pub rootslave1:/root3给了master公钥放到slave1的~/.ssh/authorized_keys里面cat ./id_rsa.pub ./authorized_keys~/.ssh/authorized_keys4.slave1里面使用ssh master没有密码安装hadoop环境1.将hadoop安装包复制到/usr/localcp /cgsrc/hadoop-3.4.0.tar.gz /usr/local2.-zxvf-z使用gzip解压x 解压文件v显示解压过程f指定文件名tar -zxvf hadoop-3.4.0.tar.gz3.重命名mv 原本的名字 新的名字如图4.配置环境变量让环境变量生效source ~/.bashrc5.查看是否安装好hadoophadoop version1.bin 存放操作命令具体包含如下图hdfsmapredyarn2.etc所有配置文件3.include头文件4.lib本地库native库压缩的动态链接库5.libexec拓展库6.sbin集群相关的命令7.share学习的资料文档配置集群环境hadoop下面的etc配置文件需要配置的文件有workercore-site.xmlhdfs-site.xmlmapred-site.xmlyarn-site.xmlhadoop-env.sh1.workers里面写了谁可以DataNode数据节点masterslave1slave2slave32.configuration !--默认文件系统的内部URI地址-- property namefs.defaultFS/name valuehdfs://master:9000/value /property !--haoop的临时工作目录默认一个月就会删掉-- property namehadoop.tmp.dir/name valuefile:/usr/local/hadoop/tmp/value /property /configuration3.configuration !--secondary访问地址 -- property namedfs.namenode.secondary.http-address/name valuemaster:50090/value /property !--hdfs设置数据存储份数 -- property namedfs.replication/name value3/value /property !--namenode实际存储地址 -- property namedfs.namenode.name.dir/name valuefile:/usr/local/hadoop/tmp/dfs/name/value /property !--datanode的实际存储地址 -- property namedfs.datanode.data.dir/name valuefile:/usr/local/hadoop/tmp/dfs/data/value /property /configuration4.configuration !-- mapreduce程序运行在yarn上 -- property namemapreduce.framework.name/name valueyarn/value /property !-- 任务运行的历史的服务端地址内部通讯端口 -- property namemapreduce.jobhistory.address/name valuemaster:10020/value /property !-- 任务运行的历史的服务器web端地址-- property namemapreduce.jobhistory.webapp.address/name valuemaster:19888/value /property /configuration5.configuration !--Resource Manage的主机名-- property nameyarn.resourcemanager.hostname/name valuemaster/value /property property !--NodeManager提供的辅助服务运行MapReduce必配-- nameyarn.nodemanager.aux-services/name valuemapreduce_shuffle/value /property !--NodeManager监控本地磁盘的健康磁盘空间使用率上限为98.5%-- property nameyarn.nodemanager.disk-health-checker.max-disk-utilization-per-disk-percentage/name value98.5/value /property /configuration6.配置hadoop-env.shexport JAVA_HOME/usr/local/java/jdk1.8.0_171 export HADOOP_CONF_DIR/usr/local/hadoop/etc/hadoop配置slave节点-z 用gzip解压-x 解压-c是创建新的压缩包tar -zcf 压缩文件的路径和名字 原本将被压缩的文件tar -zcf ~/hadoop.master.tar.gz ./hadoopscp 不同主机间安全传输文件scp ./hadoop.master.tar.gz rootslave1:/root scp ./hadoop.master.tar.gz rootslave2:/root scp ./hadoop.master.tar.gz rootslave3:/rootstart-dfs.sh启动hdfsstart-dfs.shmaster上有namenodesecondarynamenodedatanode取决于workersslave123都有且只有datanode启动yarnstart-yarn.sh172.18.0.29870 8088测试集群环境实验报告测试hdfs上传文件1.在一台机器上创建一个lotus.txt2.创建一个hdfs的文件夹3.将本地文件上传到hdfs系统hadoop fs -put 本地文件地址和名字 上传到hdfs的地址4.查看文件上传成功查看hdfs系统里面的文件内容hadoop fs -cat 文件地址和文件名引入逻辑地址 hdfs系统 /lInput/lizhiying.txt物理地址:hdfs-site.xml里面记录了实际的物理地址datanode的实际存放地址/usr/local/hadoop/tmpQQ邮箱登录到QQ邮箱网站未读邮件相应的文件 逻辑地址物理地址开发需知道注意hdfs里面默认存三份 salve1slave2slave3master分配机制只存储了3台怎么去看存在哪几台机器上了在availability下面有的机器上例如上图master去执行步骤最后的地址/usr/local/hadoop/tmp/dfs/data/current/BP-859686102-172.18.0.2-1774320614917 VERSION/current/finalized/subdir0/subdir0通过实际的物理地址查看文件测试上传大文件1.在hdfs系统创建一个文件夹存放大文件2.本地大文件上传到hdfs系统3.需要知道大文件上传后怎么存放所有文件都是按照块存储大文件可能会分为多个块存储例如上图两个块hdfs系统里面的bigFiles/jdk/jdk-8u171-linux-x64.tar.gz 逻辑地址物理地址 真正存放的路径 /usr/local/hadoop/tmp/dfs/data将两个块文件合并cat blk_1073741826 tmp.tar.gzcat blk_1073741827 tmp.tar.gz测试wordcount1.2.hadoop jar hadoop-mapreduce-examples-3.4.0.jar wordcount /lInput/lizhiying.txt /lOutput2hadoop jar jar包的位置 jar里面那个方法 hdfs输入路径 输出路径逻辑地址一定是之前不存在的多了一个lOutput2这个文件夹3.如下图可以看到统计了单词出现的频率第二章环境搭建重点1.常用端口号hadoop3.xhdfs namenode内部通常端口8020/9000/9820hdfs namenode对用户的查询端口9870yarn查看任务运行情况的8088历史服务器19888hadoop2.xhdfs namenode 内部通常端口8020/9000hdfs namenode 对用户的查询端口50070yarn查看任务运行情况的8088历史服务器198882.常用的配置文件3.x core-site.xml hdfs-site.xml yarn-site.xml mapred-sirte.xml workers /hadoop/etc/hadoop2.x core-site.xml hdfs-site.xml yarn-site.xml mapred-site.xml salvesHDFS1.1 HDFS产生的背景随着数据量越来越大在一个操作系统存不下所有的数据那么及分配到更多的操作系统管理的磁盘中但不方便管理和维护迫切需要一种系统来管理多台机器上的文件这就是分布式文件管理系统。HDFS只是分布式文件管理系统中的一种1.2HDFS的定义HDFSHadoop Distributed File System他是一个文件系统用来存储文件通过目录树来定位文件其次他是分布式的由很多服务器联合起来实现其功能集群中的服务器有各自的角色。HDFS的使用场景适合一次写入多次读出的场景且不支持文件的修改。适合用来做数据分析并不适合用来做网盘应用。1.3HDFS的优缺点优点1高容错性数据自动保存多个副本它通过增加副本的形式提高容错率。某个副本丢失以后它可以自动恢复。2适合处理大数据数据规模能够处理数据规模达到GB,TB,甚至PB级别的数据文件规模能够处理百万规模以上的文件数量数量相当之大3可构建在廉价机器上通过多副本机制提高可靠性缺点1不适合低延时数据访问比如毫秒级的存储数据是做不到的2无法高效的对大量小文件进行存储存储大量小文件的话他会占用NameNode大量的内存来存储文件目录和块信息这样是不可取的因为NameNode的内存总是有限的理解:书包含目录和具体内容小文件存储的寻址时间会超过读取时间他违反了HDFS的设计目标。3不支持写入文件随机修改一个文件只能有一个写不允许多个线程同时写仅支持数据append追加不支持文件的随机修改Apache Hadoop1.4架构NameNodenn就是Maste老板他就是一个主管管理者。1.管理HDFS的名称空间2.配置副本策略3.管理数据块Block映射信息4.处理客户端的读写请求。DataNode就是Slave.NameNode下达命令DataNode执行实际操作。存储实际的数据块执行数据块的读/写操作存两百兆200M的文件block 128M第一块128M ,第二块72MClient就是客户端。1.文件切分。文件上传HDFS的时候Client将文件切分成为一个一个的Block然后进行上传2.跟NameNode交互获取文件的位置信息。3.与DataNode交互读取或者写入数据存到Fsiamge11.Client提供一些命令来管理HDFS比如NameNode格式化2.Cient可以通过一些命令来访问HDFS比如对HDFS增删改查操作Fsimage1Edits1Editsfsimage2 同步到namenodeSecondary NameNode并非NameNode的设备当NameNode挂掉的时候他不能马上替换NameNode并提供服务。辅助NameNode分担其工作量比如定期合并Fsimage和Edits并推送给NameNode在紧急情况下可辅助恢复NameNode内存 硬盘Fsimage硬盘文件系统镜像为了防止断电数据丢失Edits1.5 HDFS文件块Block大小面试重点HDFS中文件在物理上是分块存储Block块的大小可以通过配合参数dfs.blocksize)来规定默认大小在Hadoop2.x版本中128M老版本是64Mblock1 block2 block3 block4 block5 ...... block66如果寻址时间约为10ms即查找到目标block的时间约为10ms。寻址时间为传输时间的1%时则为最佳状态。因此传输时间10ms / 1% 1000ms 1s目前磁盘的输出速率普遍为100MB/s 块大小100M/s * 1s 100M 128M(接近的2的几次方)普通机械硬盘 80M/s~90M/s 块大小100M/s * 1s 100M 80M~90M 64M,128M 固态硬盘 200M/s~300M/s 块大小200M/s * 1s 200M 200M~300M 256M思考为什么块的大小不能设置太小也不能设置太大1HDFS的块设置太小会增加寻址时间程序一直在找块的开始位置。2如果块设置的太大从磁盘传输数据的时间会明显大于定位这个块开始新的位置所需要的时间寻址时间。导致程序在处理这些块数据时会非常慢。总结HDFS块的大小设置主要取决于磁盘传输速率。若出现两个DataNode重启hdfs1.6 HDFS的Shell操作1.基本语法作用是一样的bin/hadoop fs 具体的命令bin/hdfs dfs 具体的命令2.常用的操作命令启动Hadoop集群sbin/start-dfs.sh 启动hdfssbin/start-yarn.sh 启动yarn1-help输出命令参数2-ls : 显示目录信息hdfs fs -ls / :3-mkdir: 在HDFS上创建目录4moveFromLocal从本地剪切粘贴到HDFS本地就没有了touch创建一个文件5.-appendToFile追加一个文件到已经存在的文件末尾文件的作业 1上单 2中单 3发育 4打野 5游走 1.有一个本地文件touch 文件名 创建一个空文件vi 文件名 编辑这个文件cat 文件名 查看这个文件2.把本地文件追加到已经存在的HDFS系统里面的文件的末尾hadoop fs -appendToFile 本地文件和地址 HDFS 已经存在的路径以及文件名6-cat 文件名 查看文件7-chgrp -chmod-chownLinux文件系统中用法一样修改文件所属权限ch代表改变changegrp代表groupmod代表modeown代表所有者和组-chgrp【R】组名 文件或目录名改变文件所属的组别chown改变文件夹所有者的命令hadoop fs -chown 文件所有者组别名字 hdfs的文件或者文件夹chmod [用户类别][操作符][权限]文件目录1.用户类别u所有者userg所属者组groupo其他用户othersa所有用户all默认值2.操作符添加权限-移除权限直接设置权限覆盖原有权限3.权限r读w写x执行原本的权限语句新的权限rw-chmod ux script.shrwxrw-chmod g-w data.txtr--rwxchmod or file.txtr--二数字模式chmod[数字组合]文件/目录1.权限对应数字r4w2x1-无权限02.数字组合规则将三类用户所有者组其他用户的权限得到三位数字第一位所有者权限第二位组权限第三位其他用户权限例1rwxr-xr--所有者rwx 4217组: r-x 4015其他用户r-- 4004例2rw-r--r--所有者rw- 6组 r-- 4其他用户:r-- 4004hadoop fs -chmod 666 文件名将这个文件的三类用户都给了读写的权利8-copyFromLocal从本地文件系统中拷贝文件到HDFS路径去hadoop fs -copyFromLocal 本地文件 HDFS的路径要放的路径下9-copyToLocal:从HDFS拷贝到本地10-cp:从HDFS的一个路径拷贝到HDFS的另一个路径11-mv 在HDFS目录中移动文件12-get等同于copyToLocal就是从HDFS下载文件到本地13-put等同于copyFromLocalhadoop fs -put 本地文件上传到HDFS的系统位置查看是否上传到hadoop14-tail显示一个文件的末尾15-rm删除文件或者文件夹删文件hadoop fs -rm HDFS文件路径名字删文件夹:hadoop fs -rm -r 文件夹路径及名字16-du 统计文件夹的大小信息17-setrep设置HDFS文件的副本数量如果想要在web端可以直接修改文件副本数需要将文件的other给到写的权限(18)创建一个空文件hadoop fs -touchz 空文件名字