Item 01 : View C++ as a federation of languages.

本文解析了C++作为多重范型编程语言的特点,详细介绍了其包含的过程形式、面向对象形式、函数形式、泛型形式及元编程形式,并探讨了不同编程范型下的高效编程策略。

C++是个多重范型(Multiparadigm)编程语言,一个同时支持过程形式(procedural)、面向对象形式(object-oriented)、函数形式(functional)、泛型形式(generic)、元编程形式(metaprogramming)的语言。

C++语言特性可以分成如下4部分:

 

Part 1 : C. (procedural)

C的特性:区块(blocks)、语句(statements)、预处理(preprocessor)、内置数据类型(built-in data types)、数组(arrays)、指针(pointers)等等。

C的局限性:没有模板(templates)、没有异常(exceptions)、没有重载(overloading)。

 

Part 2 : Object-Oriented C++.

面向对象的特性:

1. 封装(encapsulation)

2. 继承(inheritance)

3. 多态(polymorphism)

 

Part 3 : Template C++. (generic +  metaprogramming)

template metaprogramming(TMP,模板元编程)

 

Part 4 : STL. 

STL是一个标准模板库,包括容器(containers)、迭代器(iterators)、算法(algorithms)等。

 

高效编程:

C:对内置数据类型而言pass-by-value通常比pass-by-reference高效;

Object-Oriented C++:由于用户自定义构造函数和析构函数的存在,pass-by-reference-to-const更高效;

Template C++:由于用户自定义构造函数和析构函数的存在,pass-by-reference-to-const也是更高效;

STL:由于迭代器和函数对象都是在C指针之上塑造出来的,所以对于STL的迭代器和函数对象而言,pass-by-value更高效。
Exception in thread "main" org.apache.hadoop.fs.ParentNotDirectoryException: Parent path is not a directory: file:/tmp at org.apache.hadoop.fs.RawLocalFileSystem.mkdirsWithOptionalPermission(RawLocalFileSystem.java:827) at org.apache.hadoop.fs.RawLocalFileSystem.mkdirs(RawLocalFileSystem.java:808) at org.apache.hadoop.fs.RawLocalFileSystem.mkdirsWithOptionalPermission(RawLocalFileSystem.java:835) at org.apache.hadoop.fs.RawLocalFileSystem.mkdirs(RawLocalFileSystem.java:808) at org.apache.hadoop.fs.RawLocalFileSystem.mkdirsWithOptionalPermission(RawLocalFileSystem.java:835) at org.apache.hadoop.fs.RawLocalFileSystem.mkdirs(RawLocalFileSystem.java:808) at org.apache.hadoop.fs.RawLocalFileSystem.mkdirsWithOptionalPermission(RawLocalFileSystem.java:835) at org.apache.hadoop.fs.RawLocalFileSystem.mkdirs(RawLocalFileSystem.java:808) at org.apache.hadoop.fs.RawLocalFileSystem.mkdirsWithOptionalPermission(RawLocalFileSystem.java:835) at org.apache.hadoop.fs.RawLocalFileSystem.mkdirs(RawLocalFileSystem.java:808) at org.apache.hadoop.fs.ChecksumFileSystem.mkdirs(ChecksumFileSystem.java:997) at org.apache.hadoop.fs.FileSystem.mkdirs(FileSystem.java:767) at org.apache.hadoop.mapreduce.JobSubmissionFiles.getStagingDir(JobSubmissionFiles.java:162) at org.apache.hadoop.mapreduce.JobSubmissionFiles.getStagingDir(JobSubmissionFiles.java:113) at org.apache.hadoop.mapreduce.JobSubmitter.submitJobInternal(JobSubmitter.java:148) at org.apache.hadoop.mapreduce.Job$11.run(Job.java:1678) at org.apache.hadoop.mapreduce.Job$11.run(Job.java:1675) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:422) at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1899) at org.apache.hadoop.mapreduce.Job.submit(Job.java:1675) at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:1696) at com.inspur.sunqing.hadoop.mr.ProvinceCountApp.main(ProvinceCountApp.java:94)
05-14
<think>好的,我需要解决用户提到的Hadoop中的ParentNotDirectoryException异常。首先,我得回忆一下这个异常通常在什么情况下发生。根据经验,这个异常通常与文件路径有关,特别是当尝试在一个不是目录的路径下创建子目录或文件时。例如,如果用户试图在某个文件路径下创建子目录,而该路径实际上是一个文件,就会抛出这个异常。 接下来,我需要验证这个猜想是否正确。查阅Hadoop的文档或相关资源可能会有帮助。不过根据用户提供的引用,虽然引用的内容中没有直接提到ParentNotDirectoryException,但引用[1]提到权限问题,引用[3]涉及HDFS的设计,引用[4]涉及内存问题,这可能与资源管理有关,但可能不直接相关。不过,用户的问题是关于路径的,所以应该聚焦在路径处理上。 可能的解决方法包括检查目标路径是否存在,以及确认父路径是否为目录。例如,如果用户尝试创建路径/hadoop/data/file.txt/data,而/hadoop/data/file.txt已经是一个文件,那么创建子目录data就会失败,因为file.txt不是目录。这时候需要检查路径是否正确,或者删除已存在的同名文件。 此外,权限问题也可能导致异常,如引用[1]中提到的权限不足,但ParentNotDirectoryException更可能是路径结构问题。不过,确保用户有足够的权限写入父目录也是必要的。 需要分步骤说明解决方法,比如检查路径是否存在,确认父路径是目录而不是文件,处理已存在的同名文件,检查权限设置,以及验证路径格式是否正确。同时,可能需要提供Hadoop命令示例,如hadoop fs -ls和hadoop fs -rm来帮助用户操作。 另外,用户可能需要了解如何避免此类异常,例如在编程时先检查父路径是否为目录,或者使用API正确创建目录结构。例如,在Java中使用FileSystem.mkdirs()方法前,先检查父路径是否存在且为目录。 总结来说,解决方案应围绕路径验证、文件与目录的区分、权限检查和正确的API使用展开。同时,结合用户提供的引用,虽然引用内容不直接相关,但可以强调在HDFS操作中路径和权限的重要性,如引用[1]中的权限修改命令可能在某些情况下辅助解决问题。</think>### Hadoop中ParentNotDirectoryException异常的原因及解决方法 #### 异常原因 当HDFS客户端尝试在**非目录路径下创建子目录或文件**时,会触发$ParentNotDirectoryException$。具体场景包括: 1. 目标路径的父级路径是文件而非目录(例如路径为`/data/file.txt/subdir`,但`file.txt`是一个文件) 2. 编程接口错误调用(如使用`create()`方法时路径层级错误) 3. 并发操作导致路径状态冲突(需结合日志分析) #### 解决步骤 1. **验证路径结构** ```bash hadoop fs -ls <父级路径> ``` 如果返回结果中父级路径类型显示为`-rw-r--r--`(文件),则需删除该文件: ```bash hadoop fs -rm <父级路径> ``` 2. **创建缺失的父目录** ```bash hadoop fs -mkdir -p <父级目录路径> ``` 使用`-p`参数自动创建多级目录,例如: ```bash hadoop fs -mkdir -p /user/hadoop/data/input ``` 3. **检查API调用逻辑** 在Java代码中,优先使用`FileSystem.mkdirs()`创建目录: ```java Path parentPath = new Path("/user/hadoop/data"); if (!fs.exists(parentPath)) { fs.mkdirs(parentPath); // 创建多级目录 } Path targetPath = new Path(parentPath, "newfile.txt"); FSDataOutputStream out = fs.create(targetPath); // 正确创建文件 ``` 4. **处理权限问题** 若父目录权限不足(如引用[1]中提到的权限问题),需调整权限: ```bash hadoop fs -chmod 755 /user/hadoop/data ``` #### 典型案例 假设试图上传文件到路径`hdfs://namenode/user/test.csv/output`,但`test.csv`已存在且是文件。此时: 1. 删除冲突文件:`hadoop fs -rm /user/test.csv` 2. 创建合法目录:`hadoop fs -mkdir -p /user/output` 3. 重新执行文件上传操作 #### 附加建议 - 使用`hadoop fs -test -d <路径>`命令验证路径类型 - 在代码中增加路径预检查逻辑 - 参考HDFS Federation设计(如引用[3]),注意跨集群路径映射问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值