【HDFS】Hadoop2.x HDFS shell命令

本文详细介绍HDFS文件系统中常用的31条命令,包括文件上传、下载、权限设置、文件统计等操作,帮助读者掌握HDFS的基本管理和使用技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. hdfs dfs -appendToFile <localsrc> ... <dst>

 

可同时上传多个文件到HDFS里面

 

2.  hdfs dfs -cat URI [URI ...]

 

查看文件内容

 

3. hdfs dfs -chgrp [-R] GROUP URI [URI ...]

 

修改文件所属组

 

4.  hdfs dfs -chmod [-R] <MODE[,MODE]... | OCTALMODE> URI [URI ...]

 

修改文件权限

 

5. hdfs dfs -chown [-R] [OWNER][:[GROUP]] URI [URI ]

 

修改文件所有者,文件所属组,其他用户的读、写、执行权限

 

6. hdfs dfs -copyFromLocal <localsrc> URI

 

复制文件到hdfs

 

7.  hdfs dfs -copyToLocal [-ignorecrc] [-crc] URI <localdst>

 

复制文件到本地

 

8. hdfs dfs -count [-q] <paths>

 

统计文件及文件夹数目

 

9.  hdfs dfs -cp [-f] URI [URI ...] <dest>

 

Hadoop HDFS 文件系统间的文件复制

 

10. hdfs dfs -du [-s] [-h] URI [URI ...]

 

统计目录下的文件及大小

 

 

 

11. hdfs dfs -dus <args>

 

汇总目录下的文件总大小

 

12.  hdfs dfs -expunge

 

清空回收站,文件被删除时,它首先会移到临时目录.Trash/中,当超过延迟时间之后,文件才会被永久删除

 

13. hdfs dfs -get [-ignorecrc] [-crc] <src> <localdst>

 

下载文件到本地

 

14. hdfs dfs -getfacl [-R] <path>

 

查看ACL (访问权限组拥有者)

 

15. hdfs dfs -getmerge <src> <localdst> [addnl]

 

合并下载文件到本地

 

16. hdfs dfs -ls <args>

 

查看目录

 

17. hdfs dfs -lsr <args>

 

循环列出目录、子目录及文件信息 

 

18. hdfs dfs -mkdir [-p] <paths>

 

创建空白文件夹

 

19.  dfs -moveFromLocal <localsrc> <dst>

 

剪切文件到hdfs

 

20.  hdfs dfs -moveToLocal [-crc] <src> <dst>

 

剪切文件到本地

 

21. hdfs dfs -mv URI [URI ...] <dest>

 

剪切hdfs文件

 

22. hdfs dfs -put <localsrc> ... <dst>

 

上传文件

 

23. hdfs dfs -rm [-skipTrash] URI [URI ...]

 

删除文件/空白文件夹

 

24.  hdfs dfs -rmr [-skipTrash] URI [URI ...]

 

递归删除  删除文件及文件夹下的所有文件

 

25. hdfs dfs -setfacl [-R] [-b|-k -m|-x <acl_spec> <path>]|[--set <acl_spec> <path>]

 

Sets Access Control Lists (ACLs) of files and directories.

Options:

  • -b: Remove all but the base ACL entries. The entries for user, group and others are retained for compatibility with permission bits.
  • -k: Remove the default ACL.
  • -R: Apply operations to all files and directories recursively.
  • -m: Modify ACL. New entries are added to the ACL, and existing entries are retained.
  • -x: Remove specified ACL entries. Other ACL entries are retained.
  • --set: Fully replace the ACL, discarding all existing entries. The acl_spec must include entries for user, group, and others for compatibility with permission bits.
  • acl_spec: Comma separated list of ACL entries.
  • path: File or directory to modify.

Examples:

  • hdfs dfs -setfacl -m user:hadoop:rw- /file
  • hdfs dfs -setfacl -x user:hadoop /file
  • hdfs dfs -setfacl -b /file
  • hdfs dfs -setfacl -k /dir
  • hdfs dfs -setfacl --set user::rw-,user:hadoop:rw-,group::r--,other::r-- /file
  • hdfs dfs -setfacl -R -m user:hadoop:r-x /dir
  • hdfs dfs -setfacl -m default:user:hadoop:r-x /dir

Exit Code:

Returns 0 on success and non-zero on error.

 

 

26.  hdfs dfs -setrep [-R] [-w] <numReplicas> <path>

 

修改副本数

 

27. hdfs dfs -stat URI [URI ...]

 

显示文件统计信息

 

28.  hdfs dfs -tail [-f] URI

 

查看文件尾部信息

 

29. hdfs dfs -test -[ezd] URI

 

对PATH进行如下类型的检查: 

-e PATH是否存在,如果PATH存在,返回0,否则返回1 

-z 文件是否为空,如果长度为0,返回0,否则返回1 

-d 是否为目录,如果PATH为目录,返回0,否则返回1 

 

30. hdfs dfs -text <src>

 

查看文件内容

 

31.  hdfs dfs -touchz URI [URI ...]

 

创建长度为0的空文件

SQL 错误 [1] [08S01]: org.apache.hive.service.cli.HiveSQLException: Error while processing statement: FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask. Permission denied: user=anonymous, access=EXECUTE, inode="/tmp":root:supergroup:drwx------ at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.check(FSPermissionChecker.java:350) at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkTraverse(FSPermissionChecker.java:311) at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkPermission(FSPermissionChecker.java:238) at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkPermission(FSPermissionChecker.java:189) at org.apache.hadoop.hdfs.server.namenode.FSDirectory.checkPermission(FSDirectory.java:1753) at org.apache.hadoop.hdfs.server.namenode.FSDirectory.checkPermission(FSDirectory.java:1737) at org.apache.hadoop.hdfs.server.namenode.FSDirectory.checkOwner(FSDirectory.java:1682) at org.apache.hadoop.hdfs.server.namenode.FSDirAttrOp.setPermission(FSDirAttrOp.java:64) at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.setPermission(FSNamesystem.java:1781) at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.setPermission(NameNodeRpcServer.java:830) at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.setPermission(ClientNamenodeProtocolServerSideTranslatorPB.java:469) at org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos$ClientNamenodeProtocol$2.callBlockingMethod(ClientNamenodeProtocolProtos.java) at org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:503) at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:989) at org.apache.hadoop.ipc.Server$RpcCall.run(Server.java:871) at org.apache.hadoop.ipc.Server$RpcCall.run(Server.java:817) 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:1893) at org.apache.hadoop.ipc.Server$Handler.run(Server.java:2606) at org.apache.hive.service.cli.operation.Operation.toSQLException(Operation.java:380)
最新发布
06-19
<think>我们面对的是两个独立的问题:1.表不存在错误(SemanticException:Tablenotfound)2.权限问题(Permissiondenied)根据引用[1]和[2],表不存在错误通常有两种情况:-表确实不存在(需要创建)-表在另一个数据库中(需要使用完全限定名或切换数据库)根据引用[4],权限问题可能出现在HDFS路径上,特别是/tmp目录。Hive在执行过程中会使用HDFS的/tmp目录存储临时文件,如果当前用户(这里是anonymous)没有该目录的写权限,就会导致错误。因此,解决方案需要分两步:一、解决表不存在问题(dws_geolocation)1.确认表是否存在:-使用`SHOWTABLES`或`DESCRIBE`命令确认表是否存在。-注意:表可能位于不同的数据库,需要使用完全限定名(database_name.table_name)或先切换数据库。2.如果表不存在,则创建表。创建语句需要根据业务需求设计,例如:```sqlCREATETABLEIFNOTEXISTSdws_geolocation(geolocation_zip_code_prefixSTRING,geolocation_citySTRING,geolocation_stateSTRING,total_payDECIMAL(18,2),total_priceDECIMAL(18,2),total_freight_valueDECIMAL(18,2),count_productINT)STOREDASORC;```3.如果表在另一个数据库,则使用完全限定名访问,例如:```sqlINSERTINTOother_db.dws_geolocation...```二、解决HDFS权限问题(Permissiondenied)错误信息:`Permissiondenieduser=anonymousaccess=EXECUTEinode=/tmp`这表明当前用户(匿名用户)对HDFS的/tmp目录没有执行权限。解决方案:1.以管理员身份登录HDFS,检查/tmp目录的权限:```bashhadoopfs-ls/tmp```正常情况下,/tmp目录的权限应为`drwxrwxrwt`(即1777权限,stickybit)。2.如果权限不正确,使用以下命令修复:```bashhadoopfs-chmod1777/tmp```3.如果问题仍然存在,可以尝试在Hive中设置当前用户(避免使用匿名用户):-在Hive客户端执行前,设置环境变量`HADOOP_USER_NAME`为有权限的用户,例如:```bashexportHADOOP_USER_NAME=hive```然后启动Hive客户端。4.或者在Hive配置文件(hive-site.xml)中配置:```xml<property><name>hive.metastore.execute.setugi</name><value>true</value></property>```这个配置会让Hive以当前操作系统的用户身份执行,而不是匿名用户。5.如果问题仍然存在,检查HDFS的/tmp目录的所有者是否为超级用户(如hdfs),并确保其他用户有写权限(通过组权限或world权限)。三、完整步骤示例假设我们确认表不存在,且需要修复权限,操作如下:步骤1:创建表(在目标数据库中)```sql--切换到目标数据库(假设为dw)USEdw;--创建表CREATETABLEIFNOTEXISTSdws_geolocation(geolocation_zip_code_prefixSTRING,geolocation_citySTRING,geolocation_stateSTRING,total_payDECIMAL(18,2),total_priceDECIMAL(18,2),total_freight_valueDECIMAL(18,2),count_productINT)STOREDASORC;```步骤2:修复HDFS权限(在Linuxshell中)```bash#以hdfs用户执行(或使用sudo-uhdfshadoopfs-chmod1777/tmp```步骤3:重新运行HiveSQL,确保使用有权限的用户(非匿名用户)执行。四、注意事项-在创建表时,需要根据实际业务设计表结构,以上仅为示例。-权限问题可能因集群配置而异,如果上述方法无效,需联系HDFS管理员。五、根本原因分析|问题类型|原因|解决方案||---------|------|---------||表不存在|表未创建或数据库上下文错误|创建表或使用完全限定名||HDFS权限不足|匿名用户无权访问/tmp|修改/tmp权限或使用认证用户|六、相关问题1.如何检查Hive表是否存在?2.如何查看HDFS目录的权限?3.Hive执行引擎(Tez/Spark)对权限的要求有何不同?4.如何配置Hive以使用特定用户身份运行?5.Hive中如何跨数据库查询表?参考引用:[^1]:不能访问元数据的错误提示,可能是Hive元数据服务配置问题。[^2]:表不存在错误(SemanticException[Error10001])。[^4]:权限问题调整方法(调整字段或分区字段)。根据上述分析,我们给出综合解决方案。</think>### 解决 Hive SQL 表不存在错误与权限问题综合方案 #### 一、表不存在问题分析(SemanticException 10001) **根本原因**:Hive 元数据中缺少目标表或数据库上下文错误,结合引用[1][2]中的表不存在错误: ```sql -- 错误示例 SELECT * FROM mdm_entity_person_id_map; -- Error: SemanticException [Error 10001]: Table not found ``` **解决方案**: 1. **验证表是否存在**: ```sql -- 检查默认数据库 USE default; SHOW TABLES LIKE 'dws_geolocation'; -- 检查所有数据库 SHOW DATABASES; USE your_db; -- 切换到目标数据库 DESCRIBE FORMATTED dws_geolocation; -- 验证表结构 ``` 2. **修复表路径或重建表**: ```sql -- 显式指定数据库 INSERT INTO your_db.dws_geolocation SELECT ... -- 重建表(包含修复字段别名错误) CREATE TABLE IF NOT EXISTS your_db.dws_geolocation ( geolocation_zip_code_prefix STRING, geolocation_city STRING, geolocation_state STRING, -- 修正原查询中的别名冲突 total_pay DECIMAL(18,2), total_price DECIMAL(18,2), total_freight_value DECIMAL(18,2), count_product INT ) STORED AS ORC LOCATION '/user/hive/warehouse/your_db.db/dws_geolocation'; -- 显式指定路径 ``` > **关键点**:引用[4]表明字段别名冲突(`geolocation_state`被错误命名为`geolocation_city`)会导致语义异常,需确保字段名一致性[^4]。 --- #### 二、HDFS权限问题分析(Permission denied) **根本原因**:匿名用户(anonymous)缺少HDFS目录执行权限,错误信息: ``` Permission denied user=anonymous access=EXECUTE inode=/tmp ``` **解决方案**: 1. **检查HDFS目录权限**: ```bash # 查看/tmp目录权限 hadoop fs -ls / | grep tmp # 期望输出: drwxrwxrwt - hdfs supergroup /tmp ``` 2. **修复目录权限**: ```bash # 添加其他用户执行权限 (需HDFS管理员执行) hadoop fs -chmod 1777 /tmp # 设置sticky bit # 验证权限 hadoop fs -stat %A /tmp # 应显示: rwxrwxrwt ``` 3. **配置Hive使用认证用户**: ```xml <!-- 在hive-site.xml中添加 --> <property> <name>hive.server2.enable.doAs</name> <value>true</value> <!-- 启用用户代理 --> </property> <property> <name>hive.metastore.execute.setugi</name> <value>true</value> <!-- 使用当前Linux用户身份 --> </property> ``` 4. **客户端指定认证用户**: ```bash # 启动Hive时指定用户 beeline -u jdbc:hive2://localhost:10000 -n your_username ``` > **注意**:引用[1]显示未认证客户端会触发`org.apache.hadoop.hive.metastore.api.MetaException`,必须配置身份验证[^1]。 --- #### 三、完整问题解决流程 ```sql -- 步骤1: 设置认证用户 !set hadoopUser your_username; -- Beeline特有命令 -- 步骤2: 验证表存在性 USE your_db; SHOW TABLES; -- 步骤3: 修复表结构 (如需) ALTER TABLE dws_geolocation CHANGE COLUMN geolocation_city geolocation_state STRING; -- 修正别名 -- 步骤4: 执行查询 INSERT INTO dws_geolocation SELECT MAX(g.geolocation_zip_code_prefix), MAX(g.geolocation_city), MAX(g.geolocation_state), -- 确保字段名匹配 SUM(o.total_pay), SUM(o.total_price), SUM(o.total_freight_value), SUM(o.count_product) FROM dwd_order o JOIN dim_geolocation g ON o.customer_zip_code_prefix = g.geolocation_zip_code_prefix; ``` --- #### 四、根本原因总结 | 问题类型 | 触发原因 | 解决方案 | |-------------------|----------------------------------|----------------------------| | **表不存在** | 元数据缺失/数据库上下文错误 | 重建表+显式指定数据库 | | **字段别名冲突** | 查询字段与表定义不一致(引用[4]) | 使用`DESCRIBE`验证+`ALTER`修正 | | **HDFS权限不足** | 匿名用户无权访问/tmp目录 | 修改目录权限+启用用户认证 | | **元数据访问失败**| 客户端未通过Hive认证(引用[1]) | 配置`hive.metastore.execute.setugi` | --- #### 五、预防措施 1. **表存在性检查脚本**: ```bash #!/bin/bash # 自动化验证表存在性 if ! hive -e "USE $DB; DESCRIBE $TABLE" &>/dev/null; then echo "Creating table $TABLE..." hive -e "$CREATE_SCRIPT" fi ``` 2. **HDFS权限监控**: ```bash # 每日检查/tmp权限 crontab -e 0 0 * * * hadoop fs -test -d /tmp || hadoop fs -mkdir /tmp 0 0 * * * hadoop fs -chmod 1777 /tmp ``` 3. **客户端认证模板**: ```xml <!-- hive-client-site.xml --> <configuration> <property> <name>hive.metastore.uris</name> <value>thrift://metastore_host:9083</value> </property> <property> <name>hive.server2.authentication</name> <value>KERBEROS</value> <!-- 启用Kerberos认证 --> </property> </configuration> ``` > **关键提示**:权限问题优先修复`/tmp`目录的1777权限,表不存在问题需结合`DESCRIBE`和`SHOW TABLES`验证上下文[^1][^2][^4]。 --- ### 相关问题 1. 如何配置Hive的Kerberos认证解决权限问题? 2. Hive字段别名冲突会导致哪些类型的语义异常? 3. 如何批量修复HDFS目录权限? 4. Hive元数据服务不可用时应如何排查? 5. 不同Hive客户端(Beeline/Hive CLI)的权限差异有哪些?[^1][^2][^4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值