Hadoop源代码分析 - HDFS

本文详细剖析了Hadoop源代码,覆盖从概述到各核心组件的工作原理,包括RPC机制、DataNode与NameNode交互过程、文件系统编辑日志、网络拓扑及数据块复制策略等内容。
 Hadoop 源代码分析(1)overview
Hadoop 源代码分析(2)package

Hadoop 源代码分析(3) org.apache.hadoop.io

Hadoop 源代码分析(4)

Hadoop 源代码分析(5)org.apache.hadoop.rpc
http://caibinbupt.javaeye.com/blog/278778

RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。

RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。当我们讨论HDFS的,通信可能发生在:
  • Client-NameNode之间,其中NameNode是服务器
  • Client-DataNode之间,其中DataNode是服务器
  • DataNode-NameNode之间,其中NameNode是服务器
  • DataNode-DateNode之间,其中某一个DateNode是服务器,另一个是客户端
Hadoop 源代码分析(6)org.apache.hadoop.rpc.Client
http://caibinbupt.javaeye.com/blog/280790

Hadoop 源代码分析(7)org.apache.hadoop.rpc.Server

Hadoop 源代码分析(8)org.apache.hadoop.rpc

Hadoop 源代码分析(9)HDFS Overview and DataNode

Hadoop 源代码分析(10)HDFS 工作状态

Hadoop 源代码分析(11)HDFS 升级,回滚,提交
StorageInfo, Storage, Storage.StorageDirectory, DataStorage

Hadoop 源代码分析(12)HDFS DataNode
FSDataSet, FSDataSet.FSVolumeset, FSDataSet.FSVolume, FSDataSet.FSDir, Block, BlockInfo
http://caibinbupt.javaeye.com/blog/284365

Hadoop 源代码分析(13)分析DataNode上的动态行为, 读Block的过程
DataXceiverServer, DataXceiver, BlockSender, BlockReceiver
http://caibinbupt.javaeye.com/blog/284979

Hadoop 源代码分析(14)HDFS 写Block的过程
http://caibinbupt.javaeye.com/blog/286259

Hadoop 源代码分析(15)HDFS 的其他操作

OP_READ_METADATA (82):读数据块元文件
OP_REPLACE_BLOCK (83):替换一个数据块

OP_COPY_BLOCK (84):拷贝一个数据块

OP_BLOCK_CHECKSUM (85):读数据块检验码


Hadoop 源代码分析(16) DataBlockScanner用于定时对数据块文件进行校验
http://caibinbupt.javaeye.com/blog/286650

Hadoop 源代码分析(17)DataNode
 1) 在启动DataNode工作线程前,DataNode需要向NameNode注册
2) 注册成功后就可以启动DataNode线程。
3) DataNode的run方法,循环里有两种选择,升级(暂时不讨论)/正常工作。
4) 正常工作offerService也是个循环,在循环里,offerService会定时向NameNode发送心跳,报告系统中Block状态的变化,报告DataNode现在管理的Block状态。
5) 发送心跳和Block状态报告时,NameNode会返回一些命令,DataNode将执行这些命令。
6) ProcessCommand 处理一下命令:
  DNA_TRANSFER:拷贝数据块到其他DataNode
  DNA_INVALIDATE:删除数据块(简单方法)
  DNA_SHUTDOWN:关闭DataNode(简单方法)
  DNA_REGISTER:DataNode重新注册(简单方法)
  DNA_FINALIZE:提交升级(简单方法)
  DNA_RECOVERBLOCK:恢复数据块
http://caibinbupt.javaeye.com/blog/287870

Hadoop 源代码分析(18)NameNode
NameNode作为HDFS中文件目录和文件分配的管理者,它保存的最重要信息
http://caibinbupt.javaeye.com/blog/288546

Hadoop 源代码分析(19)INode
http://caibinbupt.javaeye.com/blog/288547

Hadoop 源代码分析(20) HDFS使用操作日志,保存更新
http://caibinbupt.javaeye.com/blog/289759

Hadoop 源代码分析(21)分析FSEditLog.java,该类提供了NameNode操作日志和日志文件的相关方法
http://caibinbupt.javaeye.com/blog/292073

Hadoop 源代码分析(22)对租约Lease进行分析及访问控制

Hadoop 源代码分析(24) FSNamesystem (1) 分析FSNamesystem的成员变量

FSNamesystem是NameNode实际记录信息的地方,保存在FSNamesystem中的数据有:

1. 文件名<->数据块列表(存放在FSImage和日志中)
2. 合法的数据块列表(上面关系的逆关系)
3. 数据块<->DataNode(只保存在内存中,根据DataNode发过来的信息动态建立)
4. DataNode上保存的数据块(上面关系的逆关系)
5. 最近发送过心跳信息的DataNode(LRU)


Hadoop 源代码分析(25) FSNamesystem (2) NameNode 上线程的定义及SafeMode相关信息
1. NameNode上的线程,分别对应DataNode心跳检查,租约检查,安全模式检查和数据块复制,我们会在后面介绍这些线程对应的功能。
 Daemon hbthread = null;   // HeartbeatMonitor thread
 Daemon lmthread = null;   // LeaseMonitor thread
 Daemon smmthread = null;  // SafeModeMonitor thread
 Daemon replthread = null;  // Replication thread
2. 安全模式是这样一种状态,系统处于这个状态时,不接受任何对名字空间的修改,同时也不会对数据块进行复制或删除数据块。
3. 系统启动以后,DataNode会报告目前它拥有的数据块的信息,当系统接收到的Block信息到达一定门槛,同时每个Block都有dfs.replication.min个副本后,系统等待一段时间后就离开安全模式。
http://caibinbupt.javaeye.com/blog/297800
 

Hadoop 源代码分析(26)HDFS网络拓扑,Replication Target Chooser, Decommission

1. HDFS的网络拓扑(NetworkTopology,DNSToSwitchMapping)
2. HDFS Replication 选择 Target(ReplicationTargetChooser )
3. chooseTarget是ReplicationTargetChooser中最重要的方法,它通过内部的一个NetworkTopology对象,计算出一个DatanodeDescriptor数组,该数组就是选定的DataNode,同时,顺序就是最佳的数据流顺序
4. Decommission进程,例如,某节点被列入到不允许连接到NameNode的机器列表中(HostsFileReader),那么,该节点会进入Decommission状态,它上面的数据块会被复制到其它节点,复制结束后机器进入DatanodeInfo.AdminStates.DECOMMISSIONED,这台机器就可以从HDFS中撤掉。
http://caibinbupt.javaeye.com/blog/298079


Hadoop 源代码分析(27)分析NameNode.java的成员变量,然后两个类综合起来,分析它提供的接口,并配合说明接口上请求对应的处理流程。
http://caibinbupt.javaeye.com/blog/298592


Hadoop 源代码分析(28) NameNode上实现的ClientProtocol (1)

http://caibinbupt.javaeye.com/blog/299415 


Hadoop 源代码分析(29) NameNode上实现的ClientProtocol (2)
http://caibinbupt.javaeye.com/blog/300045

 

Hadoop 源代码分析(30) NameNode上实现的ClientProtocol (3)

http://caibinbupt.javaeye.com/blog/301030

Hadoop 源代码分析(31) NameNode上实现的ClientProtocol (4)
http://caibinbupt.javaeye.com/blog/301030


Hadoop 源代码分析(32)DatanodeProtocol (1)

http://caibinbupt.javaeye.com/blog/301579

 

Hadoop 源代码分析(33)DatanodeProtocol (2)

http://caibinbupt.javaeye.com/blog/304604

 

Hadoop 源代码分析(34)DatanodeProtocol (3)

http://caibinbupt.javaeye.com/blog/305362


Hadoop 源代码分析(35)NameNode上还有一系列的线程,不断检查系统的状态

http://caibinbupt.javaeye.com/blog/306857


Hadoop 源代码分析(36)Secondary NameNode & NamenodeProtocol

http://caibinbupt.javaeye.com/blog/309224

 

Hadoop 源代码分析(37)Secondary NameNode Process
http://caibinbupt.javaeye.com/blog/314760

Hadoop 源代码分析(38)DFSClient (1)
http://caibinbupt.javaeye.com/blog/318046

 

Hadoop 源代码分析(39)DFSClient (2)

http://caibinbupt.javaeye.com/blog/318607


Hadoop 源代码分析(40)DFSClient (3)

http://caibinbupt.javaeye.com/blog/318813


Hadoop 源代码分析(41)DFSClient (4)
http://caibinbupt.javaeye.com/blog/318916

 

原文链接:http://www.cnblogs.com/licheng/archive/2011/02/12/1952733.html

"C:\Program Files\Java\jdk-17\bin\java.exe" -Didea.launcher.port=54222 "-Didea.launcher.bin.path=D:\hadoop\IntelliJ IDEA Community Edition 2018.3.6\bin" -Dfile.encoding=UTF-8 -classpath "D:\hadoop\Hadoop\target\classes;D:\hadoop\hadoop-3.1.4\share\hadoop\client\hadoop-client-api-3.1.4.jar;D:\hadoop\hadoop-3.1.4\share\hadoop\client\hadoop-client-runtime-3.1.4.jar;D:\hadoop\hadoop-3.1.4\share\hadoop\client\hadoop-client-minicluster-3.1.4.jar;D:\hadoop\hadoop-3.1.4\share\hadoop\common\hadoop-kms-3.1.4.jar;D:\hadoop\hadoop-3.1.4\share\hadoop\common\hadoop-nfs-3.1.4.jar;D:\hadoop\hadoop-3.1.4\share\hadoop\common\hadoop-common-3.1.4.jar;D:\hadoop\hadoop-3.1.4\share\hadoop\common\hadoop-common-3.1.4-tests.jar;D:\hadoop\hadoop-3.1.4\share\hadoop\hdfs\hadoop-hdfs-3.1.4.jar;D:\hadoop\hadoop-3.1.4\share\hadoop\hdfs\hadoop-hdfs-nfs-3.1.4.jar;D:\hadoop\hadoop-3.1.4\share\hadoop\hdfs\hadoop-hdfs-rbf-3.1.4.jar;D:\hadoop\hadoop-3.1.4\share\hadoop\hdfs\hadoop-hdfs-3.1.4-tests.jar;D:\hadoop\hadoop-3.1.4\share\hadoop\hdfs\hadoop-hdfs-client-3.1.4.jar;D:\hadoop\hadoop-3.1.4\share\hadoop\hdfs\hadoop-hdfs-httpfs-3.1.4.jar;D:\hadoop\hadoop-3.1.4\share\hadoop\hdfs\hadoop-hdfs-rbf-3.1.4-tests.jar;D:\hadoop\hadoop-3.1.4\share\hadoop\hdfs\hadoop-hdfs-client-3.1.4-tests.jar;D:\hadoop\hadoop-3.1.4\share\hadoop\hdfs\hadoop-hdfs-native-client-3.1.4.jar;D:\hadoop\hadoop-3.1.4\share\hadoop\hdfs\hadoop-hdfs-native-client-3.1.4-tests.jar;D:\hadoop\hadoop-3.1.4\share\hadoop\mapreduce\hadoop-mapreduce-examples-3.1.4.jar;D:\hadoop\hadoop-3.1.4\share\hadoop\mapreduce\hadoop-mapreduce-client-hs-3.1.4.jar;D:\hadoop\hadoop-3.1.4\share\hadoop\mapreduce\hadoop-mapreduce-client-app-3.1.4.jar;D:\hadoop\hadoop-3.1.4\share\hadoop\mapreduce\hadoop-mapreduce-client-core-3.1.4.jar;D:\hadoop\hadoop-3.1.4\share\hadoop\mapreduce\hadoop-mapreduce-client-common-3.1.4.jar;D:\hadoop\hadoop-3.1.4\share\hadoop\mapreduce\hadoop-mapreduce-client-shuffle-3.1.4.jar;D:\hadoop\hadoop-3.1.4\share\hadoop\mapreduce\hadoop-mapreduce-c
最新发布
05-07
<think>好的,我现在需要帮助用户解决Hadoop 3.1.4的启动命令配置问题,特别是关于JDK 17和IDEA Community Edition 2018.3.6的classpath路径分析。首先,我得回顾一下用户提供的引用内容和之前的问题。 用户提到了几个关键点:Hadoop运行配置问题、启动命令的构成,以及classpath路径分析。引用中提到了ClassNotFoundException,JAVA_HOME未设置的问题,还有修改hadoop-env.sh和yarn.application.classpath的配置。此外,用户还提到了完全分布式环境的搭建步骤,比如移动和解压安装包,配置workers文件和环境变量。 首先,ClassNotFoundException通常和类路径有关,可能是驱动类没找到,或者打包的jar文件没有正确包含所需的类。用户使用JDK 17,需要注意Hadoop版本是否兼容,因为Hadoop 3.1.4可能对JDK 17的支持有限,官方文档可能推荐的是JDK 8或11。这时候可能需要确认兼容性,或者调整JDK版本。 接下来是启动命令的配置。Hadoop启动通常通过start-dfs.sh和start-yarn.sh,这些脚本会读取Hadoop的配置文件,比如hadoop-env.sh,里面需要正确设置JAVA_HOME。用户提到使用JDK 17,所以必须确保hadoop-env.sh中的JAVA_HOME指向正确的JDK路径,例如export JAVA_HOME=/usr/lib/jvm/jdk-17。如果路径错误,会导致JAVA_HOME找不到,从而引发各种错误。 关于classpath,用户需要运行hadoop classpath命令获取路径,并将结果添加到yarn.application.classpath的配置中。这确保YARN能够找到所有的依赖库。同时,如果用户使用IDEA进行开发,需要确保项目中的classpath配置正确,包括Hadoop的库和JDK 17的版本。IDEA 2018.3.6可能较旧,可能需要检查是否支持JDK 17,或者是否需要升级插件。 另外,用户的环境变量配置在/etc/profile.d/my_env.sh中,需要确认Hadoop和JDK的路径是否正确设置,并且通过source命令使其生效。同时,workers文件中的节点名称是否正确,比如master、slave1、slave2是否与实际的主机名对应,SSH免密登录是否配置,这些都是启动分布式环境的关键步骤。 可能用户遇到的错误包括:ClassNotFoundException(类路径问题)、JAVA_HOME未设置(环境变量或配置文件错误)、或者节点通信问题(workers配置或SSH问题)。需要一步步检查这些方面,确认每个配置项的正确性。 最后,用户可能需要了解如何在IDEA中配置Hadoop项目,添加正确的依赖库,并设置运行参数,确保打包后的jar包含所有需要的类,并且Hadoop的classpath正确指向这些依赖。同时,考虑到JDK 17的新特性,比如模块化系统,可能需要调整Hadoop的启动脚本或依赖项,避免不兼容的问题。</think>### Hadoop 3.1.4 启动命令配置详解(JDK-17 + IDEA 2018.3.6) #### 一、核心配置项分析 1. **JAVA_HOME配置** 修改 `$HADOOP_HOME/etc/hadoop/hadoop-env.sh` 文件,明确指定JDK-17路径: ```bash export JAVA_HOME=/usr/lib/jvm/jdk-17 ``` 若未配置,会触发 `Error: JAVA_HOME is not set` 错误[^2]。 2. **Classpath动态获取** 运行 `hadoop classpath` 获取当前Hadoop类路径,输出结果需添加到 `yarn-site.xml` 的 `yarn.application.classpath` 配置项中: ```xml <property> <name>yarn.application.classpath</name> <value>/opt/module/hadoop-3.1.4/etc/hadoop:/opt/module/hadoop-3.1.4/share/hadoop/common/lib/*:...</value> </property> ``` 该路径包含Hadoop核心库和第三方依赖[^3]。 3. **IDEA项目配置要点** - 确保 `pom.xml` 中Hadoop依赖版本与集群版本一致(3.1.4) - 设置编译兼容性为JDK-17: ```xml <properties> <maven.compiler.source>17</maven.compiler.source> <maven.compiler.target>17</maven.compiler.target> </properties> ``` #### 二、典型启动命令结构 完整作业提交命令示例: ```bash hadoop jar your-job.jar com.example.MainClass \ -D mapreduce.job.queuename=default \ /input/path /output/path ``` - `hadoop jar`:Hadoop执行入口 - `-D` 参数:动态配置MapReduce参数 - 末尾参数:程序自定义输入输出路径 #### 三、JDK-17兼容性问题 需注意: 1. Hadoop 3.1.4 官方支持最高JDK11,使用JDK-17需重新编译Hadoop源码: ```bash mvn clean package -Pdist,native -DskipTests -Dmaven.javadoc.skip=true -Djava.version=17 ``` 2. 若出现 `UnsupportedClassVersionError`,需检查IDEA的编译输出目标版本设置 #### 四、调试技巧 1. **环境验证命令**: ```bash # 检查JAVA_HOME echo $JAVA_HOME # 验证Hadoop类路径 hadoop classpath ``` 2. **日志定位**: - NameNode日志:`$HADOOP_HOME/logs/hadoop-*-namenode-*.log` - YARN日志:通过 `yarn logs -applicationId <app_id>` 获取
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值