郭卫东 发表于 2024-11-21 13:01:54

云计算条记

云计算与大数据

云计算界说:云计算是一种贸易计算模型。它将计算使命分布在大量计算机构成的资源池上,使各种应用体系可以或许根据必要获取计算力、存储空间和信息服务
大数据界说:海量数据或巨量数据,其规模巨大到无法通过如今主流的计算机体系在公道时间内获取、存储、管理、处理并提炼以帮助使用者决策。
https://i-blog.csdnimg.cn/direct/d3e3da0e07e0410f82c530f6fc70d816.png
大数据是内容,云计算是平台(呆板)处理加工出有用的数据
云计算特点:超大规模、虚拟化、高可靠性、通用性、高可伸缩性、按需服务、及其便宜
云计算按服务类型分三类:SaaS、PaaS、IasS           
           https://i-blog.csdnimg.cn/direct/6ba9566ed3f94eb19857aa10041a2734.png   https://i-blog.csdnimg.cn/direct/0409aea15b0b4c5b81c06296ea518f78.png
服务方式还可以分为公有云、混合云、私有云
Google云计算

分布式文件体系GFS

目的:
        1)分布式存储(数据被分散存储在多个物理位置的存储设备,大文件被切割成大小雷同的若                                   干块存储)
        2)并行访问(多个操作或请求同时进行,以进步处理速率和效率)
        3)处理服务器失效问题(若出现故障,导致的数据丢失问题——>冗余备份)
        4)应对数据不断增长问题(添加服务器)
体系架构:
        1)GFS客户端
        2)GFS主服务器
        3)GFS数据库服务器
https://i-blog.csdnimg.cn/direct/cf967b1290e84d79b4dcbbdce6764efc.png
GFS客户端的作用:通过Shell下令方式访问GFS,提供客户端编程接口
GFS主服务器的作用:维护所有文件的元数据,定期向块服务器网络其状态

[*]文件和 Chunk 的命名空间。
[*]文件和 Chunk 的对应关系。
[*]每个 Chunk 副本的存放所在
前两种元数据会存放在主服务器本地磁盘上,持久化存储,并定期复制到远程呆板备份。块位置不会持久化存储,而是在块服务器加入集群时询问得到。
 GFS数据库服务器的作用:存储和管理文件数据块
GFS数据写入过程:
https://i-blog.csdnimg.cn/direct/8992392a1b4d41a8bf20a2e29118b885.png
 GFS读取数据过程:https://i-blog.csdnimg.cn/direct/f54091b66c6547639f36de2c53bfe2ba.png
MapReduce框架

        一个分布式、并行处理的计算框架,该部分必要用户自己编写怎样处理数据的程序,分为Map函数与Reduce函数
实现机制:用户编写好程序后,交给主控程序,其决定使命主动分配工作机去处理map与reduce
这里的map就是Java中的双列集合,以键值对形式表示。


https://i-blog.csdnimg.cn/direct/43839b1af70c4f15806a7c54b188452e.png
 https://i-blog.csdnimg.cn/direct/c7a38318518c41778ac844ebfe480472.png
使用键值对(key-value pairs)的形式处理数据是MapReduce模型的一个核心特点,紧张有以下几个缘故原由:

[*] 数据组织:键值对提供了一种自然的方式来组织和访问数据。键(key)可以作为数据的索引,使得数据的查找和处理更加高效。
[*] 简化编程模型:MapReduce通过键值对简化了并行处理的复杂性。开发者只必要关注怎样将输入数据转换为键值对,以及怎样根据键值对输出结果,而不必要处理数据的并行分配和网络。
[*] 分布式处理:在分布式环境中,数据必要在多个计算节点之间分割和传输。键值对的形式使得数据可以根据键进行分组和分配,从而实现负载平衡和数据的局部性。
[*] 排序和分组:MapReduce框架会主动对Map阶段输出的键值对进行排序和分组,这为Reduce阶段的处理提供了便利。雷同的键会被聚集在一起,使得可以对雷同键的数据进行批量处理。
[*] 容错性:在分布式计算中,节点大概会失败。键值对的形式有助于数据的规复和重试机制,由于每个键值对可以独立处理,即使某个节点失败,也只影响特定键的数据。
[*] 机动性:键值对的形式提供了机动性,允许开发者根据必要界说键和值。键可以是任何可比较的数据类型,值可以是任何数据结构,这使得MapReduce可以应用于多种不同的数据处理使命。
[*] 优化和扩展性:键值对的形式使得MapReduce框架可以在内部进行优化,例如,通过归并具有雷同键的值来减少网络传输,或者通过并行处理不同的键来进步效率。
[*] 聚合操作:在Reduce阶段,雷同的键会聚集在一起,这使得执行聚合操作(如求和、平均、最大/最小值等)变得简单和高效。
[*] 可扩展的数据处理:键值对的形式使得MapReduce可以轻松扩展到处理PB级别的数据集,由于它允许数据在多个节点上进行分割和处理。

在MapReduce框架中,工作机的分配以及数据的排序分组是由框架自己以及与之共同的分布式文件体系(如Hadoop的HDFS)共同完成的。使命是怎样被分配和完成的呢?:

[*] 作业调度器(Job Scheduler):

[*]MapReduce框架中的作业调度器负责分配使命给工作机(Worker Nodes)。它根据集群的资源情况和使命需求,将Map使命和Reduce使命分配给不同的节点执行。

[*] 使命跟踪器(Task Tracker):

[*]在Hadoop中,每个工作节点上运行的使命跟踪器负责管理该节点上的Map和Reduce使命的执行。它与作业调度器通讯,吸收使命分配,并监控使命的执行状态。

[*] 数据的分割和分配:

[*]在Map阶段之前,输入数据会被分割成多个数据块(Splits),每个数据块会被分配给一个Map使命。分割策略通常基于数据的大小和集群的设置。

[*] 分布式文件体系(Distributed File System):

[*]分布式文件体系(如HDFS)负责存储数据块,并确保数据块在多个节点上的复制和容错。它也参与数据的本地化,尽量将使命分配给存储数据块的节点,以减少网络传输。

[*] 排序和分组:

[*]Map使命的输出会临时存储在本地磁盘上,并被框架主动排序和分组。在Reduce阶段,雷同的键(Key)会被发送到同一个Reduce使命中,以便进行聚合操作。

[*] Shuffle和Sort阶段:

[*]在Map使命完成和Reduce使命开始之间,有一个称为“Shuffle”的阶段,框架会负责将Map输出的数据通过网络传输到精确的Reduce使命。在这个阶段,数据会根据键进行排序和分组。

[*] Reduce使命:

[*]Reduce使命吸收来自Shuffle阶段排序和分组后的数据,对具有雷同键的数据值进行归约操作,如求和、平均、连接等。

BigTable :大规模分布式数据库,用于存储结构化数据

BigTable按key(row:string, column:string, time:int64) -> value(string)方式排序,方便快速索引。为了实现集群,BigTable以行名范围对数据拆分片存储
https://i-blog.csdnimg.cn/direct/48cf652650c4498681c758f3930a8a52.png
1. 团体架构
BigTable的团体架构由三个核心组件构成:


[*]客户端库(Client Library):提供用户与BigTable体系交互的接口,处理请求转化、结果返回、错误查抄和重试逻辑。
[*]主服务器(Master Server):负责管理所有的子表服务器,维护数据同等性,处理负载平衡和故障规复。
[*]子表服务器(Tablet Server):实际存储数据的组件,每个子表服务器负责管理一部分数据,即子表(Tablet)。
2. 数据存储与索引
BigTable的数据模型是一个稀疏的、分布式的、持久化的多维有序映射表。索引由以下三个维度构成:


[*]行键(Row Key):任意字节串,数据按行键排序存储,支持高效扫描操作。
[*]列键(Column Key):用于区分同一行中的不同数据字段,组织成列族(Column Family)。
[*]时间戳(Timestamp):记载数据版本信息,支持多版本并发控制。
3. 数据拆分与存储


[*]BigTable表被分成多个一连的行块,称为子表(Tablet),每个子表都是一个一连的、不可变的、持久化的、有序的数据集合。
[*]子表以SSTable(Sorted String Table)格式存储在Google的文件体系Colossus上,SSTable提供持久、有序且不可变的键值对映射。
三者关系 

GFS(Google File System)、MapReduce和BigTable是Google开发的三个相互独立但又紧密联合的体系,它们共同构成了Google处理和存储大数据的核心技能架构。以下是它们之间的关系:

[*] GFS(Google File System):

[*]GFS是Google计划的大规模分布式文件体系,用于存储海量数据。它运行在普通的商用呆板上,通过软件方法解决体系可靠性问题,以降低存储资本。
[*]GFS的紧张特点是高可靠性、可扩展性和高吞吐量,它通过在多个数据块服务器(Chunk Server)上存储数据块(Chunk)的多个副本来实现数据的冗余和容错。

[*] MapReduce:

[*]MapReduce是Google开发的一个编程模型,用于大规模数据集的分布式处理。它包罗Map和Reduce两个紧张步调,Map步调负责处理输入数据并生成中央键值对,Reduce步调则对这些中央结果进行归约处理。
[*]MapReduce通常与GFS联合使用,GFS提供数据存储,而MapReduce则利用这些数据进行并行计算。MapReduce的输出通常存储回GFS。

[*] BigTable:

[*]BigTable是Google计划的大规模分布式数据库,用于存储结构化数据。它是建立在GFS和MapReduce之上的,用于处理PB级别的数据,并可以或许摆设在数千台呆板上。
[*]BigTable将数据分割成称为Tablets的小部分,每个Tablet约莫100-200MB,由GFS存储。这种分割机制使得BigTable可以或许实现精良的负载平衡和数据管理。

[*] 相互关系:

[*]GFS为MapReduce和BigTable提供了底层的数据存储服务。MapReduce处理的数据存储在GFS中,而BigTable则直接建立在GFS之上。
[*]MapReduce可以用于处理存储在GFS中的数据,生成的结果可以存储回GFS,也可以作为BigTable的输入。
[*]BigTable利用GFS的高可靠性和可扩展性来存储其Tablets,而MapReduce则可以用于处理BigTable中的数据。

总的来说,GFS、MapReduce和BigTable共同构成了Google处理大数据的根本设施,此中GFS提供存储,MapReduce提供数据处理本领,而BigTable则提供结构化数据的存储和管理。

Amazon云计算服务


[*] 计算服务:

[*]Amazon EC2:提供云端虚拟服务器,允许用户按需启动不同类型和大小的计算实例 。
[*]Amazon ECS:容器管理服务,允许用户在云端运行和管理容器化应用程序。
[*]Amazon EKS:提供Kubernetes服务,使得用户无需运行自己的Kubernetes集群即可在AWS上运行Kubernetes 。

[*] 存储服务:

[*]Amazon S3:提供对象存储服务,适合从任意位置检索任意数量的数据 。
[*]Amazon EBS:提供弹性块存储服务,与EC2实例共同使用,提供持久块存储。
[*]Amazon S3 Glacier:提供低资本、长期的数据归档解决方案。

[*] 数据库服务:

[*]Amazon RDS:提供在云端设置、运行和扩展关系数据库的服务 。
[*]Amazon DynamoDB:提供托管式的NoSQL数据库服务 。
[*]Amazon Redshift:提供快速、简单、经济实惠的数据仓库服务 。

[*] 联网和内容分发服务:

[*]Amazon VPC:提供虚拟私有云服务,允许用户在AWS云中创建隔离的网络环境。
[*]Amazon CloudFront:提供举世内容分发网络服务 。

[*] 分析和大数据服务:

[*]Amazon Athena:提供使用SQL查询Amazon S3中数据的服务 。
[*]Amazon EMR:提供大数据处理服务,支持多种数据处理框架,如Hadoop和Spark。

[*] 人工智能和呆板学习服务:

[*]Amazon SageMaker:提供构建、训练和摆设呆板学习模型的服务。
[*]Amazon Rekognition:提供图像和视频分析服务,可以或许辨认和提取图像中的对象和场景。

[*] 物联网服务:

[*]AWS IoT:提供设备管理、数据存储、分析和安全服务,支持设备与AWS云之间的通讯。

[*] 安全性和合规性服务:

[*]Amazon Cognito:提供用户身份验证和授权服务。
[*]AWS Key Management Service:提供密钥管理服务,用于加密和解密数据。

[*] 开发人员工具:

[*]AWS CodeCommit:提供源代码管理服务。
[*]AWS CodeBuild:提供持续集成和持续交付服务。

[*] 管理工具:

[*]Amazon CloudWatch:提供监控服务,可以监控AWS资源和应用程序。
[*]AWS CloudFormation:提供根本设施即代码服务,允许用户使用模板来管理AWS资源。

[*] 企业级服务:

[*]AWS Outposts:允许用户在本地环境中运行AWS服务。
[*]AWS App Mesh:提供微服务网络管理服务

Hadoop

Hadoop是一个由Apache基金会开发的开源框架,它允许使用简单的编程模型来分布式地处理大规模数据集。Hadoop的计划目的是从单个服务器扩展到数千台呆板,每台呆板都提供本地计算和存储。Hadoop的核心是HDFS(Hadoop Distributed File System,Hadoop分布式文件体系)和MapReduce编程模型。 
https://i-blog.csdnimg.cn/direct/e7f4b8594f5c4d5197de42f6879789c7.png
https://i-blog.csdnimg.cn/direct/f7ce1d6b97854f1486fce683b5591964.png
Hadoop集群包罗HDFS集群和YRAN集群。由于 
HDFS集群包罗
① NameNode(nn): 存储文件的元数据,如文件名,文件目次结构,文件属性(生成时间、副本数、文件权限),以及每个文件的块所在的 DataNode 等。
② DataNode(dn): 在本地文件体系存储文件块数据,以及块数据校验和。
③ Secondary DataNode(2nn): 用来监控 HDFS 状态的辅助背景程序,每隔一段时间获取 HDFS 元数据的快照。
④Jobtracker : 确定提交代码的执行计划,决定处理那些文件,为不同的使命分配节点,监控所有使命的运行
⑤Tasktracker : Jobtracker作为主节点,Tasktracker管理各个使命在每个从节点上的执行情况。每个Tasktracker执行由Jobtracker分配的单项使命,可以生成多个JVM来并行地处理很多map或reduce使命
------->思想类似GFS,上面的nn,dn,2nn角色是摆设在不同服务器上的进程
------->NameNode与DataNode是主从架构,Secondary DataNode是辅助角色,NameNode正常时
------->起备份作用,瘫痪时顶替它发货作用。
------->Jobtracker与Tasktracker是主从架构
https://i-blog.csdnimg.cn/direct/1486da1b0fd848aeb73bd626dcabb4c4.png
https://i-blog.csdnimg.cn/direct/628b61fa55f349c29804d082c125556a.png
YRAN集群包罗
①ResourceManager 资源管理器:管理集群中所有资源。
②NodeManager节点管理器:在所有节点上运行,启动或监控容器。
③ApplicationMaster :每个提交到YARN集群的应用程序都有一个对应的ApplicationMaster,ApplicationMaster负责与ResourceManager协商资源、监控作业进度,并向ResourceManager请求更多资源或陈诉作业完成情况
④Container:Container是对资源抽象和封装的单位,目的是为了让每个应用程序对应的使命完成执行。它表示在集群节点上分配给应用程序的一组资源,包罗CPU、内存和网络等。
https://i-blog.csdnimg.cn/direct/a8260d97e6504068a9483dd2d69ce8f4.png
-------> ResourceManager与NodeManager也是主从架构
-------->YARN把JobTracker的功能拆分成了ResourceManager,ApplicationMaster
-------->由于YRAN集群与HDFS集群都是由不同进程组成,所以二者是逻辑上是分离的,但是物理
-------->上可以雷同,即一些进程可以同时摆设在同一个服务器上

在YARN(Yet Another Resource Negotiator)框架中,ApplicationMaster(AM)和NodeManager(NM)之间的关系:

[*] 资源请求与分配:

[*]ApplicationMaster负责向ResourceManager请求资源,这些资源以Container的形式表示。一旦ResourceManager批准了资源请求,它会通知相应的NodeManager准备Container。

[*] 使命启动:

[*]当NodeManager收到ResourceManager的指令,它会为分配给它的Container准备执行环境,并通知ApplicationMaster。
[*]ApplicationMaster随后会向NodeManager发送启动使命的下令,包罗使命的执行下令、环境设置、所需资源等。

[*] 使命监控:

[*]NodeManager负责监控在其节点上运行的使命(Container)。它会定期向ApplicationMaster发送心跳信号,陈诉使命的状态和进度,包罗CPU使用情况、内存使用情况、磁盘I/O和网络I/O等。

Hadoop安装 

详细过程网络查询,这里过一下步调 
https://i-blog.csdnimg.cn/direct/3be64bee59e64bb2897afd233b9fe499.png
环境准备:一样平常在Linux体系环境下运行
①设置SSH免密登录:主从架构中,主机必要远程登录从机,每次登录都必要暗码的话,非常贫苦 。从机与主机的通讯一样平常RPC(远程过程调用)机制实现,且为了主机安全性所以一样平常不必要登录主机
----->ssh是一种远程登录协议,除此之外还有其他协议可供选择
在Hadoop集群中,主机和从机之间的通讯是双向的,但是否必要从机登录主机取决于详细的操作和集群的设置。

[*] 主机到从机的通讯:

[*]主机(例如ResourceManager或NameNode)必要与从机(例如NodeManager或DataNode)通讯,以管理和监控集群的状态。这通常涉及到发送下令、请求资源使用情况、使命调度等。
[*]为了实现这种通讯,主机大概必要可以或许SSH到从机,以便执行远程下令和管理使命。这通常通过设置SSH免密登录来实现,使得主机可以无需手动输入暗码就能登录到从机。

[*] 从机到主机的通讯:

[*]从机也必要与主机通讯,以陈诉状态、请求使命、上传数据等。这种通讯通常是通过RPC(远程过程调用)机制实现的,不必要从机直接登录到主机。
[*]然而,在某些情况下,如集群的维护、故障排查或手动执行某些操作时,从机大概必要可以或许登录到主机。这同样可以通过设置SSH免密登录来实现。

[*] 安全性和权限:

[*]出于安全思量,通常发起限制对主机的访问,由于主机上运行着集群的关键服务。因此,除非必要,否则不发起从机频繁登录主机。
[*]在实际操作中,可以通过设置SSH的权限和密钥管理来控制哪些从机可以登录主机,以及它们可以执行哪些操作

② jdk安装:下载jdk压缩包,解压在指定的一个文件夹内(自己选),然后在环境变量中设置(给这个jdk的路径起个名,如许在体系任何地方,只必要叫它的名字就可以打开它,不然一样平常启动一个程序都必要给出路径)
③Hadoop安装:下载Hadoop压缩包,解压在指定的一个文件夹内(自己选)即可。剩下的就是设置文件,必要根据运行模式进行设置
本地运行模式:适合做代码调试工作
 不必要修改任何设置文件即可以运行
伪分布模式:在一台电脑中,运行多个进程以模仿其他服务器
紧张设置core-site.xml与hdfs-site.xml
core.site.xml中设置文件体系默认名,临时文件位置
hdfs-site.xml中设置副本数量,NameNode元数据存储位置,DataNode数据存储位置
先容一下core-site.xml中的参数有哪些
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
    <!-- 指定Hadoop文件系统的默认名称,通常是一个NameNode的URI -->
    <property>
      <!-- name标签中的参数一般是Hadoop预先设定好的,它有自己的意思,配置value就可以了,这些参数根据需要自己配就好,不需要全配-->
      <name>fs.defaultFS</name>      
      <value>hdfs://namenode:8020</value>
      <!-- hdfs表示hdfs文件系统,namenode是主机名,8020是用于HDFS通信的端口号。伪分布运行的话,主机名是localhost,端号自己定。这就是一个url,类似与http://baidu.com-->
    </property>

    <!-- 指定Hadoop用于存储临时文件的目录 -->
    <property>
      <name>hadoop.tmp.dir</name>
      <value>/app/hadoop/tmp</value>
      <description>A base for other temporary directories.</description>
    </property>

    <!-- 设置文件系统的缓冲区大小,影响数据读写效率 -->
    <property>
      <name>io.file.buffer.size</name>
      <value>4096</value>
      <description>The size of buffer for use in sequence files and other I/O.</description>
    </property>

    <!-- 如果启用了Hadoop的高可用性(HA),指定ZooKeeper集群的地址 -->
    <property>
      <name>ha.zookeeper.quorum</name>
      <value>zk1:2181,zk2:2181,zk3:2181</value>
      <description>Comma separated list of zookeepers for high availability setup.</description>
    </property>

    <!-- 定义抽象文件系统的实现类 -->
    <property>
      <name>fs.AbstractFileSystem.hdfs.impl</name>
      <value>org.apache.hadoop.fs.hdfs.Hdfs</value>
      <description>The implementation class of the hdfs abstract filesystem.</description>
    </property>

    <!-- 指定特定文件系统方案的实现类 -->
    <property>
      <name>fs.hdfs.impl</name>
      <value>org.apache.hadoop.hdfs.DistributedFileSystem</value>
      <description>The implementation class of the hdfs filesystem.</description>
    </property>

    <!-- 定义用于RPC通信的socket工厂类 -->
    <property>
      <name>hadoop.rpc.socket.factory.class.default</name>
      <value>org.apache.hadoop.net.StandardSocketFactory</value>
      <description>Default socket factory</description>
    </property>

    <!-- 定义代理用户可以代理的组和主机 -->
    <property>
      <name>hadoop.proxyuser..groups</name>
      <value>*</value>
      <description>Allow any group to be proxied by the user.</description>
    </property>
    <property>
      <name>hadoop.proxyuser..hosts</name>
      <value>*</value>
      <description>Allow any host to be proxied by the user.</description>
    </property>

    <!-- 指定一个脚本文件的路径,用于确定节点的网络拓扑 -->
    <property>
      <name>net.topology.script.file.name</name>
      <value>/etc/hadoop/nettopology.properties</value>
      <description>Script to get the network topology of the cluster.</description>
    </property>

    <!-- 指定集群使用的身份验证方式 -->
    <property>
      <name>hadoop.security.authentication</name>
      <value>kerberos</value>
      <description>Should Hadoop use Kerberos for authentication?</description>
    </property>

    <!-- 指定是否启用Hadoop的授权功能 -->
    <property>
      <name>hadoop.security.authorization</name>
      <value>true</value>
      <description>Is service-level authorization enabled?</description>
    </property>

    <!-- 定义可以访问Hadoop Web UI的静态用户 -->
    <property>
      <name>hadoop.http.staticuser.user</name>
      <value>dr.who</value>
      <description>Static user for httpfs.</description>
    </property>
</configuration> 先容一下hdfs-site.xml中的参数有哪些
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
    <!-- 指定HDFS的副本因子,即数据块在集群中的副本数量 -->
    <property>
      <name>dfs.replication</name>
      <value>3</value>
      <description>Default block replication.</description>
    </property>
   
    <!-- 指定NameNode元数据存放位置 -->
    <property>
      <name>dfs.namenode.name.dir</name>
      <value>file:/app/hadoop/hadoop-2.6.4/name</value>
      <description>NameNode存储元数据的位置(FSImage和edits log)</description>
    </property>
   
    <!-- 指定DataNode数据存储地址 -->
    <property>
      <name>dfs.datanode.data.dir</name>
      <value>file:/app/hadoop/hadoop-2.6.4/data</value>
      <description>数据节点存储实际数据的位置</description>
    </property>
   
    <!-- 指定secondary namenode的HTTP地址和端口 -->
    <property>
      <name>dfs.namenode.secondary.http-address</name>
      <value>hadoop1:9000</value>
      <description>SecondaryNameNode的HTTP地址和端口</description>
    </property>
   
    <!-- 启用WebHDFS REST接口 -->
    <property>
      <name>dfs.webhdfs.enabled</name>
      <value>true</value>
      <description>启用WebHDFS REST接口</description>
    </property>
   
    <!-- 配置HDFS的名称服务 -->
    <property>
      <name>dfs.nameservices</name>
      <value>mycluster</value>
      <description>指定HDFS的名称服务ID</description>
    </property>
   
    <!-- 配置名称服务下的活跃和备用名称节点 -->
    <property>
      <name>dfs.ha.namenodes.mycluster</name>
      <value>nn1,nn2</value>
      <description>指定名称服务下的活跃和备用NameNode名称</description>
    </property>
   
    <!-- 配置名称节点nn1的RPC通信地址 -->
    <property>
      <name>dfs.namenode.rpc-address.mycluster.nn1</name>
      <value>namenode-1:9000</value>
      <description>名称节点nn1的RPC通信地址</description>
    </property>
   
    <!-- 配置名称节点nn2的RPC通信地址 -->
    <property>
      <name>dfs.namenode.rpc-address.mycluster.nn2</name>
      <value>namenode-2:9000</value>
      <description>名称节点nn2的RPC通信地址</description>
    </property>
   
    <!-- 配置共享编辑日志的存储位置,用于支持名称节点的高可用性 -->
    <property>
      <name>dfs.namenode.shared.edits.dir</name>
      <value>qjournal://datanode-1:8485;datanode-2:8485;datanode-3:8485/mycluster</value>
      <description>共享编辑日志存储位置,用于HA模式</description>
    </property>
   
    <!-- 启用自动故障转移功能,以提高HDFS的可用性 -->
    <property>
      <name>dfs.ha.automatic-failover.enabled.mycluster</name>
      <value>true</value>
      <description>启用自动故障转移功能</description>
    </property>
   
    <!-- 配置客户端故障转移代理提供者,用于在名称节点故障时自动切换到备用名称节点 -->
    <property>
      <name>dfs.client.failover.proxy.provider.mycluster</name>
      <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
      <description>客户端故障转移代理提供者</description>
    </property>
   
    <!-- 配置JournalNode的编辑日志存储目录 -->
    <property>
      <name>dfs.journalnode.edits.dir</name>
      <value>/hadoop/hdfs/journalnode</value>
      <description>JournalNode的编辑日志存储目录</description>
    </property>
</configuration> 全分布模式:
必要修改每个客户机的host文件,将主机名与IP对应,便于用主机名访问
一台客户机上的环境搭建好就可以远程复制到其他客户机
再就是设置文件,详细过程网络查询
Hadoop安装包目次

https://i-blog.csdnimg.cn/direct/b5b0a8e23b5c447695ff819ec85d6295.png
Hadoop Shell操作下令

  类似Linux下令

[*] 查看HDFS文件体系状态:

[*]hdfs dfsadmin -report:表现HDFS的陈诉信息,包罗集群的康健状态、NameNode和DataNode的状态等。

[*] 查看HDFS的使用情况:

[*]hdfs dfsadmin -fsstatus:表现HDFS的文件体系状态,包罗剩余空间、已用空间等。

[*] 创建目次:

[*]hdfs dfs -mkdir [-p] <path>:创建一个新的目次。-p参数可以用来创建多级目次。

[*] 删除目次或文件:

[*]hdfs dfs -rm [-r] <path>:删除指定的文件或目次。-r参数表示递归删除。

[*] 上传文件到HDFS:

[*]hdfs dfs -put <localsrc> ... <dst>:将本地文件体系上的文件复制到HDFS上。

[*] 从HDFS下载文件:

[*]hdfs dfs -get [-p] <src> ... <localdst>:从HDFS上复制文件到本地文件体系。

[*] 查看文件内容:

[*]hdfs dfs -cat <path>:表现文件的内容。
[*]hdfs dfs -text <path>:表现文件内容,而且表现每个数据块的开始位置。

[*] 查看文件或目次的详细信息:

[*]hdfs dfs -ls [-h] <path>:列出目次内容,-h参数以人类可读的格式表现文件大小。

[*] 复制文件:

[*]hdfs dfs -cp <src> ... <dst>:复制文件到HDFS上的另一个位置。

[*] 移动文件:

[*]hdfs dfs -mv <src> ... <dst>:移动文件到HDFS上的另一个位置。

[*] 更改文件权限:

[*]hdfs dfs -chmod [-R] <mode> <path>:更改文件或目次的权限。-R参数表示递归更改。

[*] 更改文件所有者:

[*]hdfs dfs -chown [-R] <owner>[<group>] <path>:更改文件或目次的所有者和组。-R参数表示递归更改。

[*] 查看帮助信息:

[*]hdfs dfs -help:表现HDFS下令的帮助信息。

https://i-blog.csdnimg.cn/direct/3d2edf512a474ce183239694744a1477.png 
 
HDFS Java API

是Hadoop提供的一个编程接口,允许Java程序与HDFS进行交互,执行文件体系操作,如文件上传、下载、目次的创建、文件的删除等。以下是HDFS Java API的一些核心概念和常用方法的详解,使用时在Java中导包即可:
核心类和接口


[*] Configuration:

[*]该类用于存储Hadoop集群的设置信息,包罗文件体系的类型、NameNode的URI等。可以通过Configuration类加载Hadoop的设置文件(如core-site.xml和hdfs-site.xml)。

[*] FileSystem:

[*]FileSystem是一个抽象类,提供了操作文件体系的根本接口。它是操作HDFS的核心类,通过这个类可以进行文件的创建、删除、复制等操作。

[*] Path:

[*]表示文件体系上的一个路径。在HDFS中,所有的文件和目次都通过Path类来表示。

[*] FileStatus:

[*]表示文件或目次的状态信息,如文件大小、权限、所有权等。

常用方法


[*] 获取FileSystem实例:
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://namenode:8020");
FileSystem fs = FileSystem.get(conf);

[*]这段代码创建了一个Configuration对象,并设置了HDFS的URI,然后通过FileSystem.get(conf)方法获取FileSystem实例。

[*] 创建目次:
boolean success = fs.mkdirs(new Path("/path/to/directory"));

[*]mkdirs方法用于在HDFS上创建一个新的目次。

[*] 上传文件:
fs.copyFromLocalFile(new Path("/local/path/file.txt"), new Path("/path/in/hdfs"));

[*]将本地文件体系上的文件复制到HDFS上。

[*] 下载文件:
fs.copyToLocalFile(new Path("/path/in/hdfs"), new Path("/local/path/file.txt"));

[*]将HDFS上的文件复制到本地文件体系。

[*] 删除文件或目次:
boolean success = fs.delete(new Path("/path/to/delete"), true); // true表示递归删除

[*]delete方法用于删除HDFS上的文件或目次。

[*] 重命名文件或目次:
boolean success = fs.rename(new Path("/path/to/oldname"), new Path("/path/to/newname"));

[*]rename方法用于重命名HDFS上的文件或目次。

[*] 列出目次内容:
RemoteIterator<LocatedFileStatus> fileStatusListIterator = fs.listFiles(new Path("/path/to/directory"), true);
while (fileStatusListIterator.hasNext()) {
    LocatedFileStatus fileStatus = fileStatusListIterator.next();
    System.out.println(fileStatus.getPath().getName());
}

[*]listFiles方法用于列出HDFS上目次的内容。

[*] 查抄文件或目次是否存在:
boolean exists = fs.exists(new Path("/path/to/check"));

[*]exists方法用于查抄HDFS上的文件或目次是否存在。

[*] 获取文件状态:
FileStatus[] fileStatus = fs.listStatus(new Path("/path/to/directory"));
for (FileStatus status : fileStatus) {
    System.out.println(status.getPath().getName());
}

[*]listStatus方法用于获取HDFS上目次中文件或目次的状态信息。

注意事项



[*]在使用HDFS Java API时,必要确保Hadoop环境已经精确设置,包罗core-site.xml和hdfs-site.xml文件。
[*]操作完成后,应该调用fs.close()方法关闭FileSystem实例,释放资源。
Hadoop根本数据类型 

Hadoop提供了一系列的数据类型,紧张用于MapReduce编程模型中键值对的处理。这些数据类型是可序列化的,可以进行网络传输和文件存储,以及进行大小比较等操作。以下是一些Hadoop中常用的数据类型及其详解:

[*] Text:

[*]用于存储字符串数据。在Hadoop中,Text实际上就是一个UTF-8格式的字符串。它是org.apache.hadoop.io.Text类的实例。

[*] ByteWritable:

[*]用于存储单字节数值。它是org.apache.hadoop.io.ByteWritable类的实例。

[*] DoubleWritable:

[*]用于存储双精度浮点数。它是org.apache.hadoop.io.DoubleWritable类的实例。

[*] FloatWritable:

[*]用于存储单精度浮点数。它是org.apache.hadoop.io.FloatWritable类的实例。

[*] IntWritable:

[*]用于存储整型数值。它是org.apache.hadoop.io.IntWritable类的实例。

[*] LongWritable:

[*]用于存储长整型数值。它是org.apache.hadoop.io.LongWritable类的实例。

[*] BooleanWritable:

[*]用于存储布尔值。它是org.apache.hadoop.io.BooleanWritable类的实例。

[*] ArrayWritable:

[*]用于存储数组。它是org.apache.hadoop.io.ArrayWritable类的实例,可以存储上述任何类型的数组。

[*] MapWritable:

[*]用于存储键值对映射。它是org.apache.hadoop.io.MapWritable类的实例,可以存储一个映射,此中的键和值都是Writable类型。

[*] NullWritable:

[*]表示一个空的Writable对象。它是org.apache.hadoop.io.NullWritable类的实例,通常用作MapReduce作业中不关心的键或值。

[*] VIntWritable 和 VLongWritable:

[*]变长整数和变长长整数。这些类用于存储整数,它们使用可变长度的编码来存储数值,适合于存储较小的整数,由于它们可以有效地节省空间。VIntWritable是org.apache.hadoop.io.VIntWritable类的实例,VLongWritable是org.apache.hadoop.io.VLongWritable类的实例。

import org.apache.hadoop.io.Text;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;

public class TextExample {
    public static class MapClass extends Mapper<Object, Text, Text, IntWritable> {
      private final static IntWritable one = new IntWritable(1);
      private Text word = new Text();

      public void map(Object key, Text value, Context context) throws IOException, InterruptedException {
            word.set(value);
            context.write(word, one);
      }
    }

    public static class ReduceClass extends Reducer<Text,IntWritable,Text,IntWritable> {
      public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
            int sum = 0;
            for (IntWritable val : values) {
                sum += val.get();
            }
            context.write(key, new IntWritable(sum));
      }
    }
} 这些数据类型都实现了Writable接口,这意味着它们都可以被写入到DataOutput中(例如文件或网络流),而且可以从DataInput中读取(例如文件或网络流)。Writable接口提供了write和readFields两个方法,分别用于序列化和反序列化
在MapReduce作业中,这些数据类型常用于界说输入和输出的键值对类型,例如Mapper<KEYIN, VALUEIN, KEYOUT, VALUEOUT>和Reducer<KEYIN, VALUEIN, KEYOUT, VALUEOUT>。开发者可以根据必要选择符合的数据类型来处理数据
 MapReduce

MapReduce是一种编程模型和处理框架,用于在大规模数据集上进行分布式处理。它由两个紧张的组件组成:Map使命和Reduce使命。以下是MapReduce编程模型的详细解释:
1. MapReduce编程模型的组成部分



[*]Map使命:处理输入数据并将其转换为键值对(key-value pairs)的形式。
[*]Reduce使命:从Map使命中吸收键值对,并进行汇总或归约操作。
2. MapReduce作业的生命周期


[*] 输入分片:

[*]输入数据被Hadoop分割成多个分片,每个分片由一个Map使命处理。

[*] Map阶段:

[*]Map使命读取输入分片,并生成中央键值对。

[*] Shuffle和Sort阶段:

[*]Map使命输出的键值对被Shuffled(重新分配)和Sorted(排序)。

[*] Reduce阶段:

[*]Reduce使命读取排序后的键值对,并生成最终结果。

3. MapReduce编程接口



[*] Mapper:

[*]map()方法:处理输入键值对,并产生中央键值对。
[*]setup()方法:在map()方法之前执行,用于初始化。
[*]cleanup()方法:在map()方法之后执行,用于清算。

[*] Reducer:

[*]reduce()方法:处理中央键值对,并产生最终结果。
[*]setup()方法:在reduce()方法之前执行,用于初始化。
[*]cleanup()方法:在reduce()方法之后执行,用于清算。

4. MapReduce编程示例

以下是一个简单的WordCount程序,它计算文本中每个单词出现的次数:
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

import java.io.IOException;

public class WordCount {

    public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable> {
      private final static IntWritable one = new IntWritable(1);
      private Text word = new Text();

      public void map(Object key, Text value, Context context) throws IOException, InterruptedException {
            String[] words = value.toString().split("\\s+");
            for (String w : words) {
                word.set(w);
                context.write(word, one);
            }
      }
    }

    public static class IntSumReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
      public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
            int sum = 0;
            for (IntWritable val : values) {
                sum += val.get();
            }
            context.write(key, new IntWritable(sum));
      }
    }

    public static void main(String[] args) throws Exception {
      Configuration conf = new Configuration();
      Job job = Job.getInstance(conf, "word count");
      job.setJarByClass(WordCount.class);
      job.setMapperClass(TokenizerMapper.class);
      job.setCombinerClass(IntSumReducer.class);
      job.setReducerClass(IntSumReducer.class);
      job.setOutputKeyClass(Text.class);
      job.setOutputValueClass(IntWritable.class);
      FileInputFormat.addInputPath(job, new Path(args));
      FileOutputFormat.setOutputPath(job, new Path(args));
      System.exit(job.waitForCompletion(true) ? 0 : 1);
    }
}
5. 运行MapReduce作业

要运行MapReduce作业,你必要执行以下步调:

[*] 设置作业:

[*]设置作业的名称、Jar文件、Mapper和Reducer类等。

[*] 设置输入和输出路径:

[*]使用FileInputFormat和FileOutputFormat设置作业的输入和输出路径。

[*] 提交作业:

[*]调用job.waitForCompletion()提交作业并等待其完成。

[*] 查抄结果:

[*]作业完成后,查抄输出路径下的文件以查看结果。

MapReduce编程模型提供了一个强盛的框架,用于处理大规模数据集。通过自界说Mapper和Reducer类,你可以实现复杂的数据处理逻辑

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 云计算条记