喻轩Blog - 大数据
type: channel
link: https://blog.yuxuan.io/categories/bigdata
items: HBase API应用和优化
items: HBase原理深入
items: 初识HBase
items: Hadoop 3.x新特性概述
items: Apache Hadoop核心源码剖析
items: Yarn资源调度
items: MapReduce编程框架
items: HDFS分布式文件系统
items: Apache Hadoop完全分布式集群搭建
items: Apache Hadoop的重要组成

HBase API应用和优化
type: item
date: 2020-09-21T16:47:40+08:00
description: HBase API应用和优化创建Maven工程，添加依赖<dependencies> <dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-client</artifactId> <version>1.3.1</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <dependency> <groupId>org.testng</groupId> <artifactId>testng</artifactId> <version>6.14.3</version> <scope>test</scope> </dependency> </dependencies>测试类编写通用代码public class HbaseClientDemo { Configuration conf=null; Connection conn=null; HBaseAdmin admin =null; @Before public void init () throws IOException { conf = HBaseConfiguration.create(); conf.set("hbase.zookeeper.quorum","linux121,linux122"); conf.set("hbase.zookeeper.property.clientPort","2181"); conn = ConnectionFactory.createConnection(conf); } @After public void destroy(){ if(admin!=null){ try { admin.close(); } catch (IOException e) { e.printStackTrace(); } } if(conn !=null){ try { conn.close(); } catch (IOException e) { e.printStackTrace(); } } } }创建表：@Test public void createTable() throws IOException { admin = (HBaseAdmin) conn.getAdmin(); //创建表描述器 HTableDescriptor teacher = new HTableDescriptor(TableName.valueOf("teacher")); //设置列族描述器 teacher.addFamily(new HColumnDescriptor("info")); //执行创建操作 admin.createTable(teacher); System.out.println("teacher表创建成功！！"); }插入数据：//插入一条数据 @Test public void putData() throws IOException { //获取一个表对象 Table t = conn.getTable(TableName.valueOf("teacher")); //设定rowkey Put put = new Put(Bytes.toBytes("110")); //列族，列，value put.addColumn(Bytes.toBytes("info"), Bytes.toBytes("addr"), Bytes.toBytes("beijing")); //执行插入 t.put(put); // t.put();//可以传入list批量插入数据 //关闭table对象 t.close(); System.out.println("插入成功！！"); }删除数据：//删除一条数据 @Test public void deleteData() throws IOException { //需要获取一个table对象 final Table worker = conn.getTable(TableName.valueOf("worker")); //准备delete对象 final Delete delete = new Delete(Bytes.toBytes("110")); //执行删除 worker.delete(delete); //关闭table对象 worker.close(); System.out.…

HBase原理深入
type: item
date: 2020-09-21T16:16:06+08:00
description: HBase读数据流程HBase读操作1）首先从zk找到meta表的region位置，然后读取meta表中的数据，meta表中存储了用户表的region信息2）根据要查询的namespace、表名和rowkey信息。找到写入数据对应的region信息3）找到这个region对应的regionServer，然后发送请求4）查找对应的region5）先从memstore查找数据，如果没有，再从BlockCache上读取HBase上Regionserver的内存分为两个部分一部分作为Memstore，主要用来写；另外一部分作为BlockCache，主要用于读数据；6）如果BlockCache中也没有找到，再到StoreFile上进行读取从storeFile中读取到数据之后，不是直接把结果数据返回给客户端，而是把数据先写入到BlockCache中，目的是为了加快后续的查询；然后在返回结果给客户端。HBase写数据流程HBase写操作1）首先从zk找到meta表的region位置，然后读取meta表中的数据，meta表中存储了用户表的region信息2）根据namespace、表名和rowkey信息。找到写入数据对应的region信息3）找到这个region对应的regionServer，然后发送请求4）把数据分别写到HLog（write ahead log）和memstore各一份5）memstore达到阈值后把数据刷到磁盘，生成storeFile文件6）删除HLog中的历史数据HBase的flush(刷写)及compact(合并)机制Flush机制（1）当memstore的大小超过这个值的时候，会flush到磁盘，默认为128M<property> <name>hbase.hregion.memstore.flush.size</name> <value>134217728</value> </property>（2）当memstore中的数据时间超过1小时，会flush到磁盘<property> <name>hbase.regionserver.optionalcacheflushinterval</name> <value>3600000</value> </property>（3）HregionServer的全局memstore的大小，超过该大小会触发flush到磁盘的操作,默认是堆大小的40%<property> <name>hbase.regionserver.global.memstore.size</name> <value>0.4</value> </property>（4）手动flushflush tableName阻塞机制以上介绍的是Store中memstore数据刷写磁盘的标准，但是Hbase中是周期性的检查是否满足以上标准满足则进行刷写，但是如果在下次检查到来之前，数据疯狂写入Memstore中，会出现什么问题？会触发阻塞机制，此时无法写入数据到Memstore，数据无法写入Hbase集群。memstore中数据达到512MB计算公式：hbase.hregion.memstore.flush.size * hbase.hregion.memstore..block.multiplierhbase.hregion.memstore.flush.size刷写的阀值，默认是 134217728，即128MB。hbase.hregion.memstore.block.multiplier是一个倍数，默认是4。RegionServer全部memstore达到规定值hbase.regionserver.global.memstore.size.lower.limit是0.95，hbase.regionserver.global.memstore.size是0.4，堆内存总共是 16G，触发刷写的阈值是：6.08GB触发阻塞的阈值是：6.4GBCompact合并机制在hbase中主要存在两种类型的compac合并minor compact小合并在将Store中多个HFile(StoreFile)合并为一个HFile这个过程中，删除和更新的数据仅仅只是做了标记，并没有物理移除，这种合并的触发频率很高。minor compact文件选择标准由以下几个参数共同决定： <property> <name>hbase.hstore.compaction.min</name> <value>3</value> </property> <property> <name>hbase.hstore.compaction.max</name> <value>10</value> </property> <property> <name>hbase…

初识HBase
type: item
date: 2020-09-21T15:55:14+08:00
description: HBase 简介HBase是什么HBase 基于 Google的BigTable论文而来，是一个分布式海量列式非关系型数据库系统，可以提供超大规模数据集的实时随机读写。接下来，通过一个场景初步认识HBase列存储如下MySQL存储机制，空值字段浪费存储空间idNAMEAGESALARYJOB1小明23 学生2小红 10w律师 如果是列存储的话，可以这么玩......rowkey：1 name：小明rowkey：1 age：23rowkey：1 job：学生rowkey：2 name ：小红rowkey：2 salary：10wrowkey：2 job：律师....列存储的优点：1）减少存储空间占用。2）支持好多列HBase的特点海量存储：底层基于HDFS存储海量数据列式存储：HBase表的数据是基于列族进行存储的，一个列族包含若干列极易扩展：底层依赖HDFS，当磁盘空间不足的时候，只需要动态增加DataNode服务节点就可以高并发：支持高并发的读写请求稀疏：稀疏主要是针对HBase列的灵活性，在列族中，你可以指定任意多的列，在列数据为空的情况下，是不会占用存储空间的。数据的多版本：HBase表中的数据可以有多个版本值，默认情况下是根据版本号去区分，版本号就是插入数据的时间戳数据类型单一：所有的数据在HBase中是以字节数组进行存储HBase的应用交通方面：船舶GPS信息，每天有上千万左右的数据存储。金融方面：消费信息、贷款信息、信用卡还款信息等电商方面：电商网站的交易信息、物流信息、游览信息等电信方面：通话信息总结：HBase适合海量明细数据的存储，并且后期需要有很好的查询性能（单表超千万、上亿，且并发要求高）HBase数据模型HBase的数据也是以表（有行有列）的形式存储HBase逻辑架构HBase物理存储概念描述NameSpace（数据库）命名空间，类似于关系型数据库的database概念，每个命名空间下有多个表。HBase两个自带的命名空间，分别是hbase和default，hbase中存放的是HBase内置的表，default表是用户默认使用的命名空间。一个表可以自由选择是否有命名空间，如果创建表的时候加上了命名空间后，这个表名字以:作为区分。Table类似于关系型数据库的表概念。不同的是，HBase定义表时只需要声明列族即可，数据属性，比如超时时间（TTL），压缩算法（COMPRESSION）等，都在列族的定义中定义，不需要声明具体的列。Row（一行逻辑数据）HBase表中的每行数据都由一个RowKey和多个Column（列）组成。一个行包含了多个列，这些列通过列族来分类,行中的数据所属列族只能从该表所定义的列族中选取，不能定义这个表中不存在的列族，否则报错NoSuchColumnFamilyException。RowKey（每行数据主键）Rowkey由用户指定的一串不重复的字符串定义，是一行的唯一标识！数据是按照RowKey的字典顺序存储的，并且查询数据时只能根据RowKey进行检索，所以RowKey的设计十分重要。如果使用了之前已经定义的RowKey，那么会将之前的数据更新掉。Column Family（列族）列族是多个列的集合。一个列族可以动态地灵活定义多个列。表的相关属性大部分都定义在列族上，同一个表里的不同列族可以有完全不同的属性配置，但是同一个列族内的所有列都会有相同的属性。列族存在的意义是HBase会把相同列族的列尽量放在同一台机器上，所以说，如果想让某几个列被放到一起，你就给他们定义相同的列族。Column Qualifier（列）Hbase中的列是可以随意定义的，一个行中的列不限名字、不限数量，只限定列族。因此列必须依赖于列族存在！列的名称前必须带着其所属的列族！例如info：name，info：ageTimeStamp（时间戳→版本）用于标识数据的不同版本（version）。时间戳默认由系统指定，也可以由用户显式指定。在读取单元格的数据时，版本号可以省略，如果不指定，Hbase默认会获取最后一个版本的数据返回。Cell一个列中可以存储多个版本的数据。而每个版本就称为一个单元格（Cell）。Region（表的分区）Region由一个表的若干行组成！在Region中行的排序按照行键（rowkey）字典排序。Region不能跨RegionSever，且当数据量大的时候，HBase会拆分Region。HBase整体架构Zookeeper实现了HMaster的高可用保存了HBase的元数据信息，是所有HBase表的寻址入口对HMaster和HRegionServer实现了监控HMaster（Master）为HRegionServer分配Region维护整个集群的负载均衡维护集群的元数据信息发现失效的Regi…

Hadoop 3.x新特性概述
type: item
date: 2020-09-21T00:44:01+08:00
description: Hadoop3.x中增强了很多特性，在Hadoop3.x中，不再允许使用jdk1.7，要求jdk1.8以上版本。这是因为Hadoop 2.0是基于JDK 1.7开发的，而JDK 1.7在2015年4月已停止更新，这直接迫使Hadoop社区基于JDK 1.8重新发布一个新的Hadoop版本，而这正是Hadoop3.x。Hadoop3.x以后将会调整方案架构，将Mapreduce 基于内存+io+磁盘，共同处理数据。Hadoop 3.x中引入了一些重要的功能和优化，包括HDFS 可擦除编码、多Namenode支持、MR Native Task优化、YARN基于cgroup的内存和磁盘IO隔离、YARN container resizing等。Hadoop3.x官方文档地址如下：http://hadoop.apache.org/docs/r3.0.1/Hadoop3.x新特性之Common改进Hadoop Common改进：精简Hadoop内核，包括剔除过期的API和实现，将默认组件实现替换成最高效的实现（比如将FileOutputCommitter缺省实现换为v2版本，废除hftp转由webhdfs替代，移除Hadoop子实现序列化库org.apache.hadoop.Recordslasspath isolation以防止不同版本jar包冲突，比如google Guava在混合使用Hadoop、HBase和Spark时，很容易产生冲突。（https://issues.apache.org/jira/browse/HADOOP-11656）Shell脚本重构。 Hadoop 3.0对Hadoop的管理脚本进行了重构，修复了大量bug，增加了新特性，支持动态命令等。使用方式上则和之前版本的一致。（https://issues.apache.org/jira/browse/HADOOP-9902）Hadoop3.x新特性之HDFS改进Hadoop3.x中最大改变的是HDFS，HDFS通过最近black块计算，根据最近计算原则，本地black块，加入到内存，先计算，通过IO，共享内存计算区域，最后快速形成计算结果。HDFS支持数据的擦除编码，这使得HDFS在不降低可靠性的前提下，节省一半存储空间。（https://issues.apache.org/jira/browse/HDFS-7285）多NameNode支持，即支持一个集群中，一个active、多个standby namenode部署方式。注：多ResourceManager特性在hadoop 2.0中已经支持。（https://issues.apache.org/jira/browse/HDFS-6440）关于这两个特性的官方文档地址：http://hadoop.apache.org/docs/r3.0.1/hadoop-project-dist/hadoophdfs/HDFSErasureCoding.html http://hadoop.apache.org/docs/r3.0.1/hadoop-project-dist/hadoophdfs/HDFSHighAvailabilityWithQJM.htmlHadoop3.x新特性之YARN改进基于cgroup的内存隔离和IO Disk隔离（https://issues.apache.org/jira/browse/YARN-2619）用curator实现RM leader选举（https://issues.apache.org/jira/browse/YARN-4438）containerresizing（https://issues.apache.org/jira/browse/YARN-1197）Timelineserver next generation （https://issues.apache.org/jira/browse/YARN-2928）官方文档地址：http://hadoop.apache.org/docs/r3.0.1/hadoop-yarn/hadoop-yarnsite/TimelineServiceV2.htmlHadoop3.x新特性之MapReduce改进Tasknative优化。为MapReduce增加了C/C++的map output collector实现（包括Spill，Sort和IFile等），通过作业级别参数调整就可切换到该实现上。对于shuffle密集型应用，其性能可提高约30%。（https://issues.apache.org/jira/browse/MAPREDUCE-2841）MapReduce内存参数自动推断。在Hadoop 2.0中，为MapReduce作业设置…

Apache Hadoop核心源码剖析
type: item
date: 2020-09-21T00:36:54+08:00
description: 源码阅读准备下载Apache Hadoop-2.9.2官方源码将源码导入idea中启动idea在提示界面选择导入点击Finish等待下载和解决依赖完成，源码导入成功！！NameNode 启动流程命令启动Hdfs集群start-dfs.sh该命令会启动Hdfs的NameNode以及DataNode，启动NameNode主要是通过org.apache.hadoop.hdfs.server.namenode.NameNode类。重点关注NameNode在启动过程中做了哪些工作（偏离主线的技术细节不深究）对于分析启动流程主要关注两部分代码：public class NameNode extends ReconfigurableBase implements NameNodeStatusMXBean { //该静态代码块主要是初始化一些HDFS的配置信息 static{ HdfsConfiguration.init(); //进入之后发现方法是空的，没有任何操作？其实不是观察HdfsConfiguration的静态代码块 } //HdfsConfiguration的类以及静态代码块 public class HdfsConfiguration extends Configuration { static { addDeprecatedKeys(); // adds the default resources Configuration.addDefaultResource("hdfs-default.xml"); Configuration.addDefaultResource("hdfs-site.xml"); } ... //main方法 public static void main(String argv[]) throws Exception{ //分析传入的参数是否为帮助参数，如果是帮助的话打印帮助信息，并退出。 if(DFSUtil.parseHelpArgument(argv,NameNode.USAGE,System.out,true)){ System.exit(0); } try{ //格式化输出启动信息，并且创建hook（打印节点关闭信息） StringUtils.startupShutdownMessage(NameNode.class,argv,LOG); //创建namenode NameNode namenode=createNameNode(argv,null); if（namenode!=null){ //加入集群 namenode.join(); } } catch(Throwable e){ //异常处理 LOG.error("Failed to start namenode.",e); terminate(1,e); } } ---------------------------------------------------------------------- //关注createNameNode public static NameNode createNameNode(String argv[], Configuration conf) throws IOException { LOG.info("createNameNode " + Arrays.asList(argv)); if (conf == null) conf = new HdfsConfiguration(); // Parse out some generic args into Configuration. GenericOptionsParser hParser = new GenericOptionsParser(conf, argv); argv = hParser.getRemainingArgs(); // Parse the rest, NN specific args. //解析启动的参数 StartupOption startOpt = parseArguments(argv); if (startOpt == null) { printUsage(System.err); return null; } setStartupOption(conf, startOpt); switch (startOpt) { .... default: { //正常启动进入该分支 //初始化metric系统 DefaultMetricsSystem.initialize("NameNode"); //返回新的NameNode return new NameNode(conf); } } } --------------…

Yarn资源调度
type: item
date: 2020-09-21T00:19:34+08:00
description: Yarn架构ResourceManager（rm）：处理客户端请求、启动/监控ApplicationMaster、监控NodeManager、资源分配与调度。NodeManager（nm）：单个节点上的资源管理、处理来自ResourceManager的命令、处理来自ApplicationMaster的命令。ApplicationMaster（am）：数据切分、为应用程序申请资源，并分配给内部任务、任务监控与容错。Container：对任务运行环境的抽象，封装了CPU、内存等多维资源以及环境变量、启动命令等任务运行相关的信息。Yarn任务提交（工作机制）作业提交过程之Yarn：作业提交第1步：Client调用job.waitForCompletion方法，向整个集群提交MapReduce作业。第2步：Client向RM申请一个作业id。第3步：RM给Client返回该job资源的提交路径和作业id。第4步：Client提交jar包、切片信息和配置文件到指定的资源提交路径。第5步：Client提交完资源后，向RM申请运行MrAppMaster。作业初始化第6步：当RM收到Client的请求后，将该job添加到容量调度器中。第7步：某一个空闲的NM领取到该Job。第8步：该NM创建Container，并产生MRAppmaster。第9步：下载Client提交的资源到本地。任务分配第10步：MrAppMaster向RM申请运行多个MapTask任务资源。第11步：RM将运行MapTask任务分配给另外两个NodeManager，另两个NodeManager分别领取任务并创建容器。任务运行第12步：MR向两个接收到任务的NodeManager发送程序启动脚本，这两个NodeManager分别启动MapTask，MapTask对数据分区排序。第13步：MrAppMaster等待所有MapTask运行完毕后，向RM申请容器，运行ReduceTask。第14步：ReduceTask向MapTask获取相应分区的数据。第15步：程序运行完毕后，MR会向RM申请注销自己。进度和状态更新YARN中的任务将其进度和状态返回给应用管理器，客户端每秒(通过mapreduce.client.progressmonitor.pollinterval设置)向应用管理器请求进度更新，展示给用户。作业完成除了向应用管理器请求作业进度外，客户端每5秒都会通过调用waitForCompletion()来检查作业是否完成。时间间隔可以通过mapreduce.client.completion.pollinterval来设置。作业完成之后，应用管理器和Container会清理工作状态。作业的信息会被作业历史服务器存储以备之后用户核查。Yarn调度策略Hadoop作业调度器主要有三种：FIFO、Capacity Scheduler和Fair Scheduler。Hadoop2.9.2默认的资源调度器是Capacity Scheduler。可以查看yarn-default.xmlFIFO（先进先出调度器）容量调度器（Capacity Scheduler 默认的调度器）Apache Hadoop默认使用的调度策略。Capacity 调度器允许多个组织共享整个集群，每个组织可以获得集群的一部分计算能力。通过为每个组织分配专门的队列，然后再为每个队列分配一定的集群资源，这样整个集群就可以通过设置多个队列的方式给多个组织提供服务了。除此之外，队列内部又可以垂直划分，这样一个组织内部的多个成员就可以共享这个队列资源了，在一个队列内部，资源的调度是采用的是先进先出(FIFO)策略。Fair Scheduler（公平调度器，CDH版本的hadoop默认使用的调度器）Fair调度器的设计目标是为所有的应用分配公平的资源（对公平的定义可以通过参数来设置）。公平调度在也可以在多个队列间工作。举个例子，假设有两个用户A和B，他们分别拥有一个队列。当A启动一个job而B没有任务时，A会获得全部集群资源；当B启动一个job后，A的job会继续运行，不过一会儿之后两个任务会各自获得一半的集群资源。如果此时B再启动第二个job并且其它job还在运行，则它将会和B的第一个job共享B这个队列的资源，也就是B的两个job会用于四分之一的集群资源，而A的job仍然用于集群一半的资源，结果就是资源最终在两个用户之间平等的共享。Yarn多租户资源隔离配置Yarn集群资源设置为A，B两个队列，A队列设置占用资源70%主要用来运行常规的定时任务，B队列设置占用资源30%主要运行临时任务，两个队列间可相互资源共享，假如A队列资源占满，B队列资源比较充裕，A队列可以使用B队列的资源，使总体做到资源利用最大化。选择使用Fai…

MapReduce编程框架
type: item
date: 2020-09-20T01:37:37+08:00
description: MapReduce思想MapReduce思想在生活中处处可见。我们或多或少都曾接触过这种思想。MapReduce的思想核心是分而治之，充分利用了并行处理的优势。即使是发布过论文实现分布式计算的谷歌也只是实现了这种思想，而不是自己原创。MapReduce任务过程是分为两个处理阶段：Map阶段：Map阶段的主要作用是“分”，即把复杂的任务分解为若干个“简单的任务”来并行处理。Map阶段的这些任务可以并行计算，彼此间没有依赖关系。Reduce阶段：Reduce阶段的主要作用是“合”，即对map阶段的结果进行全局汇总。再次理解MapReduce的思想官方WordCount案例源码解析经过查看分析官方WordCount案例源码我们发现一个统计单词数量的MapReduce程序的代码由三个部分组成：Mapper类Reducer类运行作业的代码（Driver）Mapper类继承了org.apache.hadoop.mapreduce.Mapper类重写了其中的map方法，Reducer类继承了org.apache.hadoop.mapreduce.Reducer类重写了其中的reduce方法。重写的Map方法作用：map方法其中的逻辑就是用户希望mr程序map阶段如何处理的逻辑；重写的Reduce方法作用：reduce方法其中的逻辑是用户希望mr程序reduce阶段如何处理的逻辑；Hadoop序列化为什么进行序列化？序列化主要是我们通过网络通信传输数据时或者把对象持久化到文件，需要把对象序列化成二进制的结构。观察源码时发现自定义Mapper类与自定义Reducer类都有泛型类型约束，比如自定义Mapper有四个形参类型，但是形参类型并不是常见的java基本类型。为什么Hadoop要选择建立自己的序列化格式而不使用java自带serializable？序列化在分布式程序中非常重要，在Hadoop中，集群中多个节点的进程间的通信是通过RPC（远程过程调用：Remote Procedure Call）实现；RPC将消息序列化成二进制流发送到远程节点，远程节点再将接收到的二进制数据反序列化为原始的消息，因此RPC往往追求如下特点：紧凑:数据更紧凑，能充分利用网络带宽资源快速:序列化和反序列化的性能开销更低Hadoop使用的是自己的序列化格式Writable,它比java的序列化serialization更紧凑速度更快。一个对象使用Serializable序列化后，会携带很多额外信息比如校验信息，Header，继承体系等。Java基本类型与Hadoop常用序列化类型Java基本类型Hadoop Writable类型booleanBooleanWritablebyteByteWritableintIntWritablefloatFloatWritablelongLongWritabledoubleDoubleWritableStringTextmapMapWritablearrayArrayWritableMapReduce编程规范及示例编写Mapper类用户自定义一个Mapper类继承Hadoop的Mapper类Mapper的输入数据是KV对的形式（类型可以自定义）Map阶段的业务逻辑定义在map()方法中Mapper的输出数据是KV对的形式（类型可以自定义）注意：map()方法是对输入的一个KV对调用一次！！Reducer类用户自定义Reducer类要继承Hadoop的Reducer类Reducer的输入数据类型对应Mapper的输出数据类型（KV对）Reducer的业务逻辑写在reduce()方法中Reduce()方法是对相同K的一组KV对调用执行一次Driver阶段创建提交YARN集群运行的Job对象，其中封装了MapReduce程序运行所需要的相关参数入输入数据路径，输出数据路径等，也相当于是一个YARN集群的客户端，主要作用就是提交我们MapReduce程序运行。WordCount代码实现需求在给定的文本文件中统计输出每一个单词出现的总次数输入数据：wc.txt;输出：apache 2clickhouse 2hadoop 1mapreduce 1spark 2xiaoming 1具体步骤按照MapReduce编程规范，分别编写Mapper，Reducer，Driver。新建maven工程导入hadoop依赖<dependencies> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.8.2</version> </dependency> <dependency> <groupId>or…

HDFS分布式文件系统
type: item
date: 2020-09-16T15:23:24+08:00
description: HDFS简介HDFS（全称：Hadoop Distribute File System，Hadoop 分布式文件系统）是 Hadoop 核心组成，是分布式存储服务。分布式文件系统横跨多台计算机，在大数据时代有着广泛的应用前景，它们为存储和处理超大规模数据提供所需的扩展能力。HDFS是分布式文件系统中的一种。HDFS的重要概念HDFS 通过统一的命名空间目录树来定位文件； 另外，它是分布式的，由很多服务器联合起来实现其功能，集群中的服务器有各自的角色（分布式本质是拆分，各司其职）；典型的 Master/Slave 架构HDFS 的架构是典型的 Master/Slave 结构。HDFS集群往往是一个NameNode（HA架构会有两个NameNode,联邦机制）+多个DataNode组成；NameNode是集群的主节点，DataNode是集群的从节点。分块存储（block机制）HDFS 中的文件在物理上是分块存储（block）的，块的大小可以通过配置参数来规定；Hadoop2.x版本中默认的block大小是128M；命名空间（NameSpace）HDFS 支持传统的层次型文件组织结构。用户或者应用程序可以创建目录，然后将文件保存在这些目录里。文件系统名字空间的层次结构和大多数现有的文件系统类似：用户可以创建、删除、移动或重命名文件。Namenode 负责维护文件系统的名字空间，任何对文件系统名字空间或属性的修改都将被 Namenode 记录下来。HDFS提供给客户单一个抽象目录树，访问形式：hdfs://namenode的hostname:port/test/inputhdfs://linux121:9000/test/inputNameNode元数据管理我们把目录结构及文件分块位置信息叫做元数据。NameNode的元数据记录每一个文件所对应的block信息（block的id,以及所在的DataNode节点的信息）DataNode数据存储文件的各个 block 的具体存储管理由 DataNode 节点承担。一个block会有多个DataNode来存储，DataNode会定时向NameNode来汇报自己持有的block信息。副本机制为了容错，文件的所有 block 都会有副本。每个文件的 block 大小和副本系数都是可配置的。应用程序可以指定某个文件的副本数目。副本系数可以在文件创建的时候指定，也可以在之后改变。副本数量默认是3个。一次写入，多次读出HDFS 是设计成适应一次写入，多次读出的场景，且不支持文件的随机修改。 （支持追加写入，不只支持随机更新）正因为如此，HDFS 适合用来做大数据分析的底层存储服务，并不适合用来做网盘等应用（修改不方便，延迟大，网络开销大，成本太高）HDFS架构NameNode(nn):Hdfs集群的管理者，Master维护管理Hdfs的名称空间（NameSpace）维护副本策略记录文件块（Block）的映射信息负责处理客户端读写请求DataNode:NameNode下达命令，DataNode执行实际操作，Slave节点。保存实际的数据块负责数据块的读写Client:客户端上传文件到HDFS的时候，Client负责将文件切分成Block,然后进行上传请求NameNode交互，获取文件的位置信息读取或写入文件，与DataNode交互Client可以使用一些命令来管理HDFS或者访问HDFSHDFS客户端操作Shell 命令行操作HDFS基本语法bin/hadoop fs 具体命令 OR bin/hdfs dfs 具体命令命令大全hdfs dfsHDFS命令演示1）启动Hadoop集群（方便后续的测试）start-dfs.sh start-yarn.sh2）-help：输出这个命令参数hadoop fs -help rm3）-ls: 显示目录信息hadoop fs -ls /4）-mkdir：在HDFS上创建目录hadoop fs -mkdir -p /test/bigdata5）-moveFromLocal：从本地剪切粘贴到HDFStouch hadoop.txt hadoop fs -moveFromLocal ./hadoop.txt /test/bigdata6）-appendToFile：追加一个文件到已经存在的文件末尾touch hdfs.txt vi hdfs.txt输入namenode datanode block replicationhadoop fs -appendToFile hdfs.txt /test/bigdata/hadoop.txt7）-cat：显示文件内容hadoop fs -cat /test/bigdata/hadoop.txt8）-chgrp 、-chmod、-ch…

Apache Hadoop完全分布式集群搭建
type: item
date: 2020-09-14T21:59:07+08:00
description: 软件和操作系统版本Hadoop框架是采用Java语言编写，需要java环境（jvm）JDK版本：JDK8版本集群：知识点学习：统一使用vmware虚拟机虚拟三台linux节点，linux操作系统：Centos7项目阶段：统一使用云服务器，5台云服务器节点Hadoop搭建方式单机模式：单节点模式，非集群，生产不会使用这种方式单机伪分布式模式：单节点，多线程模拟集群的效果，生产不会使用这种方式完全分布式模式：多台节点，真正的分布式Hadoop集群的搭建（生产环境建议使用这种方式）虚拟机环境准备三台虚拟机（静态IP，关闭防火墙，修改主机名，配置免密登录，集群时间同步）在/opt目录下创建文件夹创建软件安装包存放目录和软件安装目录mkdir -p /opt/test/software mkdir -p /opt/test/serversHadoop下载地址：https://archive.apache.org/dist/hadoop/common/hadoop-2.9.2/Hadoop官网地址：http://hadoop.apache.org/上传hadoop压缩包到/opt/test/software集群规划框架linux121linux122linux123HDFSNameNode、DataNodeDataNodeSecondaryNameNode、DataNodeYARNNodeManagerNodeManagerNodeManager、ResourceManager安装Hadoop登录linux121节点；进入/opt/test/software，解压安装文件到/opt/test/serverstar -zxvf hadoop-2.9.2.tar.gz -C /opt/test/servers查看是否解压成功ll /opt/test/servers/hadoop-2.9.2添加Hadoop到环境变量vim /etc/profile##HADOOP_HOME export HADOOP_HOME=/opt/test/servers/hadoop-2.9.2 export PATH=$PATH:$HADOOP_HOME/bin export PATH=$PATH:$HADOOP_HOME/sbin使环境变量生效source /etc/profile验证hadoophadoop version校验结果：hadoop目录drwxr-xr-x. 2 root root 194 Nov 13 2018 bindrwxr-xr-x. 3 root root 20 Nov 13 2018 etcdrwxr-xr-x. 2 root root 106 Nov 13 2018 includedrwxr-xr-x. 3 root root 20 Nov 13 2018 libdrwxr-xr-x. 2 root root 239 Nov 13 2018 libexec-rw-r--r--. 1 root root 106210 Nov 13 2018 LICENSE.txt-rw-r--r--. 1 root root 15917 Nov 13 2018 NOTICE.txt-rw-r--r--. 1 root root 1366 Nov 13 2018 README.txtdrwxr-xr-x. 3 root root 4096 Nov 13 2018 sbindrwxr-xr-x. 4 root root 31 Nov 13 2018 share1）bin目录:对Hadoop进行操作的相关命令，如hadoop，hdfs等2）etc目录：Hadoop的配置文件目录，如hdfs-site.xml，core-site.xml等3）lib目录：Hadoop本地库（解压缩的依赖）4）sbin目录：存放的是Hadoop集群启动停止相关脚本，命令5）share目录：Hadoop的一些jar，官方案例jar，文档等集群配置Hadoop集群配置 = HDFS集群配置 + MapReduce集群配置 + Yarn集群配置HDFS集群配置1）将JDK路径明确配置给HDFS（修改hadoop-env.sh）2）指定NameNode节点以及数据存储目录（修改core-site.xml）3）指定SecondaryNameNode节点（修改hdfs-site.xml）4）指定DataNode从节点（修改etc/hadoop/slaves文件，每个节点配置信息占一行）MapReduce集群配置1）将JDK路径明确配置给MapReduce（修改mapred-env.sh）2）指定MapReduce计算框架运行Yarn资源调度框架（修改mapred-site.xml）Yarn集群…

Apache Hadoop的重要组成
type: item
date: 2020-09-14T21:15:06+08:00
description: Hadoop=HDFS(分布式文件系统)+MapReduce(分布式计算框架)+Yarn(资源协调框架)+Common模块Hadoop HDFS：（Hadoop Distribute File System ）一个高可靠、高吞吐量的分布式文件系统比如：100T数据存储该怎么设计？Google发表的论文翻译成中文即“分而治之”分：拆分→数据切割，100T数据拆分为10G一个数据块由一个电脑节点存储这个数据块。数据切割、制作副本、分散储存图中涉及到几个角色NameNode（nn）：存储文件的元数据，比如文件名、文件目录结构、文件属性（生成时间、副本数、文件权限），以及每个文件的块列表和块所在的DataNode等。SecondaryNameNode（2nn）：辅助NameNode更好的工作，用来监控HDFS状态的辅助后台程序，每隔一段时间获取HDFS元数据快照。DataNode（dn）：在本地文件系统存储文件块数据，以及块数据的校验。注意：NN，2NN,DN这些既是角色名称，进程名称，代指电脑节点名称！！Hadoop MapReduce：一个分布式的离线并行计算框架拆解任务、分散处理、汇整结果MapReduce计算 = Map阶段 + Reduce阶段Map阶段就是“分”的阶段，并行处理输入数据；Reduce阶段就是“合”的阶段，对Map阶段结果进行汇总；Hadoop YARN：作业调度与集群资源管理的框架计算资源协调Yarn中有如下几个主要角色，同样，既是角色名、也是进程名，也指代所在计算机节点名称。ResourceManager(rm)：处理客户端请求、启动/监控ApplicationMaster、监控NodeManager、资源分配与调度；NodeManager(nm)：单个节点上的资源管理、处理来自ResourceManager的命令、处理来自ApplicationMaster的命令；ApplicationMaster(am)：数据切分、为应用程序申请资源，并分配给内部任务、任务监控与容错。Container：对任务运行环境的抽象，封装了CPU、内存等多维资源以及环境变量、启动命令等任务运行相关的信息。ResourceManager是老大，NodeManager是小弟，ApplicationMaster是计算任务专员。Hadoop Common：支持其他模块的工具模块（Configuration、RPC、序列化机制、日志操作）