分享知识,分享快乐

0%

1
2
3
4
5
cd /tmp
hdfs dfsadmin -fetchImage ./tmp_meta
hdfs oiv -i ./tmp_meta -o ./fsimage.csv -p Delimited
hdfs dfs -mkdir -p /tmp/hdfs_metadata/fsimage
hdfs dfs -copyFromLocal ./fsimage.csv /tmp/hdfs_metadata/fsimage
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
drop table if exists hdfs_meta_temp;
create external table hdfs_meta_temp (path string ,
repl int ,
modification_time string ,accesstime string ,
preferredblocksize int ,blockcount double,
filesize double ,nsquota int ,
dsquota int ,
permission string ,username string ,groupname string)row format delimited
fields terminated by '\t' location '/tmp/hdfs_metadata/fsimage/' ;

--将临时表转换为Impala的 Parquet表
drop table hdfs_meta
create table hdfs_meta stored as parquet as
select path,
repl,
cast(concat(modification_time, ' :00') as timestamp) modification_time,
cast(concat(accesstime,':00') as timestamp) accesstime,
preferredblocksize,
blockcount,
filesize,nsquota,dsquota,permission,username,groupname
from hdfs_meta_temp;

instr(path,’/’,1,2)这两个参数主要表示指定统计的HDFS目录以及目录钻取深度,instr()函数中的最后一个参数即为目录钻取深度

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT 
--concat('/',split_part(path,'/',2)) basepath,
--concat('/',split_part(path,'/',2),'/',split_part(path,'/',3)) basepath,
--concat('/',split_part(path,'/',2),'/',split_part(path,'/',3),'/',split_part(path,'/',4)) basepath,
concat('/',split_part(path,'/',2),'/',split_part(path,'/',3),'/',split_part(path,'/',4),'/',split_part(path,'/',5)) basepath,
sum(blockcount) blockcounts,
cast(sum(filesize)/1024/1024/1024 as decimal(18,2) ) filesizes,
count(*) file_nums,
cast(count(*)/sum(blockcount) as decimal(18,2) ) as avg_block ,
cast(sum(filesize)/count(*)/1024 as decimal(18,2) ) AS avg_filesize
FROM tmp.hdfs_meta
where instr(path,'/',1,4)>0
--and strleft(path, instr(path,'/',1,4)-1)='/user/hive/warehouse'
GROUP BY basepath
order by file_nums desc, avg_filesize
limit 200

总结

如上SQL的统计分析可以看到有三个比较重要的统计指标file_nums、blockcounts和avg_filesize。通过这三个指标进行小文件分析,进行如下分析:

如果file_nums/blockcounts的值越大且avg_filesize越小则说明该HDFS或Hive表的小文件越多。

方法二、

使用Sqoop脚本将Hive元数据中关于Hive库和表的信息抽取的Hive中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
sqoop import \
-D mapred.job.queue.name=bf_yarn_pool.development \
--connect "jdbc:mysql://10.0.20.107:3306/baofoo_hive_2" \
--username cs_yangz \
--password *** \
--query 'select c.NAME,c.DB_LOCATION_URI,a.TBL_NAME,a.OWNER,a.TBL_TYPE,b.LOCATION from TBLS a,SDS b,DBS c where a.SD_ID=b.SD_ID and a.DB_ID=c.DB_ID and $CONDITIONS' \
--fields-terminated-by ',' \
--delete-target-dir \
--hive-database default \
--target-dir /tmp/hive_tables_temp \
--hive-import \
--hive-overwrite \
--hive-table hive_tables_temp \
--m 1
阅读全文 »

hdfs性能测试

hadoop自带TestDFSIO测试

1
2
3
4
5
6
7
cd /tmp
sudo -u hdfs hadoop jar \
/opt/cloudera/parcels/CDH/lib/hadoop-mapreduce/hadoop-mapreduce-client-jobclient-3.0.0-cdh6.0.1-tests.jar TestDFSIO \
-D mapreduce.job.queuename=bf_yarn_pool.production \
-D test.build.data=/tmp/benchmark \
-D mapreduce.output.fileoutputformat.compress=false \
-write -nrFiles 10 -fileSize 1000

–结果

1
2
3
4
5
6
7
8
9
21/01/19 15:29:04 INFO fs.TestDFSIO: ----- TestDFSIO ----- : write
21/01/19 15:29:04 INFO fs.TestDFSIO: Date & time: Tue Jan 19 15:29:04 CST 2021
21/01/19 15:29:04 INFO fs.TestDFSIO: Number of files: 10
21/01/19 15:29:04 INFO fs.TestDFSIO: Total MBytes processed: 10000
21/01/19 15:29:04 INFO fs.TestDFSIO: Throughput mb/sec: 23.96
21/01/19 15:29:04 INFO fs.TestDFSIO: Average IO rate mb/sec: 32.37
21/01/19 15:29:04 INFO fs.TestDFSIO: IO rate std deviation: 29.51
21/01/19 15:29:04 INFO fs.TestDFSIO: Test exec time sec: 68
21/01/19 15:29:04 INFO fs.TestDFSIO:

结果说明:

Total MBytes processed : 总共需要写入的数据量 ==》 256*1000

Throughput mb/sec :总共需要写入的数据量/(每个map任务实际写入数据的执行时间之和(这个时间会远小于Test exec time sec))==》256000/(map1写时间+map2写时间+…)

Average IO rate mb/sec :(每个map需要写入的数据量/每个map任务实际写入数据的执行时间)之和/任务数==》(1000/map1写时间+1000/map2写时间+…)/256,所以这个值跟上面一个值总是存在差异。

IO rate std deviation :上一个值的标准差

Test exec time sec :整个job的执行时间

testDFSIO的参数如下:

read 读测试。执行该测试之前,需要先做write测试
write 写测试
nfFiles 文件个数,默认为1
fileSize 文件大小,默认为1MB
resFile 结果文件名,默认为” TestDFSIO_results.log”
bufferSize 设置缓存大小,默认为1000000
clean 清理数据
seq 数据是否有序,默认无序

备注

阅读全文 »

HDFS ACL权限设置

今天主要给大家说一下HDFS文件权限的问题。当一个普通用户去访问HDFS文件时,可能会报Permission denied的错误。那么你会怎么做呢?

像修改linux文件似的,可能的做法有:

  • 修改文件所有者
  • 直接将文件赋予全部的权限,即rwx权限。

上面的做法虽然可以达到目的,但是相对来说对权限的把握不是很精准,不适用于生产环境。

本文主要讲解HDFS的ACL(Access Control List)权限,通过hdfs超级用户,来为普通用户分配权限。

一、背景

如下图所示,

image-20210113155315046

目录没有权限,所以创建失败了。

阅读全文 »

修改Kudu表名,和映射在impala的表名

kudu的表名和impala的表名是两码事

修改kudu表名

方法一、在linux中kudu节点执行

1
kudu table rename_table 172.20.85.113:7051 impala::kd_baofoo_cm.cm_entry_tmp impala::kd_baofoo_cm.cm_entry

方法二、在presto中执行

1
ALTER TABLE kudu.default."impala::kd_baofoo_cm.cm_entry" RENAME TO kudu.default."impala::kd_baofoo_cm.cm_entry_tmp"

修改了kudu的表名后 在impala查询kudu会报错,需要修改

修改映射的impala表名

1
2
alter table kd_baofoo_cm.cm_entry set tblproperties('kudu.table_name'='impala::kd_baofoo_cm.cm_entry_tmp');
alter table kd_baofoo_cm.cm_entry rename to kd_baofoo_cm.cm_entry_tmp;
阅读全文 »

问题: 存在文件大小为0,处于打开状态的文件,程序读取这些文件会报错

1
2
3
4
[root@cdh85-29 ~]# hadoop fs -du -h  hdfs://ns1/flume/BankCardAuthReqDTO/CREDIT-PRODUCT-RESULT-LOG-MEMBER-RESPONSE_bak
0 1.1 G hdfs://ns1/flume/BankCardAuthReqDTO/CREDIT-PRODUCT-RESULT-LOG-MEMBER-RESPONSE_bak/CREDIT-PRODUCT-RESULT-LOG-MEMBER-RESPONSE-1.1594769101120.log.gz
0 1.1 G hdfs://ns1/flume/BankCardAuthReqDTO/CREDIT-PRODUCT-RESULT-LOG-MEMBER-RESPONSE_bak/CREDIT-PRODUCT-RESULT-LOG-MEMBER-RESPONSE-1.1594856701472.log.gz
0 1.1 G hdfs://ns1/flume/BankCardAuthReqDTO/CREDIT-PRODUCT-RESULT-LOG-MEMBER-RESPONSE_bak/CREDIT-PRODUCT-RESULT-LOG-MEMBER-RESPONSE-1.1594941000485.log.gz

cloudera论坛也有类型的错误 :

1
Cannot obtain block length for LocatedBlock

https://community.cloudera.com/t5/Support-Questions/Cannot-obtain-block-length-for-LocatedBlock/td-p/117517

但是这个方法并没有解决我的问题。 hdfs debug recoverLease -path 这样也关闭不了文件 ,纠删码策略下 不知道什么bug 这些文件关闭不了。

我的解决方法:

获取hdfs没有正常关闭的文件并删除:

1
hadoop fsck /flume/ -files -openforwrite | grep "OPENFORWRITE"  >tmp.txt

tmp.txt 内容如下:

阅读全文 »

xargs可以将输入内容(通常通过命令行管道传递),转成后续命令的参数,通常用途有:

  1. 命令组合:尤其是一些命令不支持管道输入,比如ls
  2. 避免参数过长:xargs可以通过-nx来将参数分组,避免参数过长。

使用语法如下

1
2
Usage: xargs [OPTION]... COMMAND INITIAL-ARGS...
Run COMMAND with arguments INITIAL-ARGS and more arguments read from input.

入门例子

首先,创建测试文件

1
touch a.js b.js c.js

接着,运行如下命令:

1
ls *.js | xargs ls -al

输出如下:

阅读全文 »

重启dn导致集群不能写入数据,几百个任务都失败了, 经过一个通宵的折腾,记录一下这次重大事故。

报错日志

1
2
DataStreamer Exception
20-11-2020 09:48:59 CST mysql2sqoop-1-RD202006060009 INFO - org.apache.hadoop.ipc.RemoteException(java.io.IOException): File /user/yarn/.staging/job_1605809645188_1956/job.jar could only be written to 0 of the 1 minReplication nodes. There are 66 datanode(s) running and no node(s) are excluded in this operation.

报错的日志各种误导,走了很多弯路,只说一下,最终解决了这个问题的方法:

网上有人出现这个问题是格式化解决,它们日志是There are 0 datanode(s) running and no node(s) are excluded in this operation.我的hdfs集群是正常的所有节点都在,只是不能写入数据。

我用的分层策略是One_SSD,查看了DFS Storage Types,发现disk的空间不够。

image-20201120151830207

解决步骤

ssd磁盘的机器和普通磁盘的机器分2个角色组

普通组不加[SSD]

阅读全文 »

python时间strftime格式化去除前导0

解决方案:

linux (加一个“-”符号)

1
datetime.date(2020, 11, 9).strftime("%-m月%-d日")

windows (加一个“#”符号)

1
datetime.date(2020, 11, 9).strftime("%#m月%#d日")
阅读全文 »

破解PyCharm 2018.3.2

亲测可以用

破解教程:https://www.jianshu.com/p/76a30aeb8f9d

1、key

1
K71U8DBPNE-eyJsaWNlbnNlSWQiOiJLNzFVOERCUE5FIiwibGljZW5zZWVOYW1lIjoibGFuIHl1IiwiYXNzaWduZWVOYW1lIjoiIiwiYXNzaWduZWVFbWFpbCI6IiIsImxpY2Vuc2VSZXN0cmljdGlvbiI6IkZvciBlZHVjYXRpb25hbCB1c2Ugb25seSIsImNoZWNrQ29uY3VycmVudFVzZSI6ZmFsc2UsInByb2R1Y3RzIjpbeyJjb2RlIjoiSUkiLCJwYWlkVXBUbyI6IjIwMTktMDUtMDQifSx7ImNvZGUiOiJSUzAiLCJwYWlkVXBUbyI6IjIwMTktMDUtMDQifSx7ImNvZGUiOiJXUyIsInBhaWRVcFRvIjoiMjAxOS0wNS0wNCJ9LHsiY29kZSI6IlJEIiwicGFpZFVwVG8iOiIyMDE5LTA1LTA0In0seyJjb2RlIjoiUkMiLCJwYWlkVXBUbyI6IjIwMTktMDUtMDQifSx7ImNvZGUiOiJEQyIsInBhaWRVcFRvIjoiMjAxOS0wNS0wNCJ9LHsiY29kZSI6IkRCIiwicGFpZFVwVG8iOiIyMDE5LTA1LTA0In0seyJjb2RlIjoiUk0iLCJwYWlkVXBUbyI6IjIwMTktMDUtMDQifSx7ImNvZGUiOiJETSIsInBhaWRVcFRvIjoiMjAxOS0wNS0wNCJ9LHsiY29kZSI6IkFDIiwicGFpZFVwVG8iOiIyMDE5LTA1LTA0In0seyJjb2RlIjoiRFBOIiwicGFpZFVwVG8iOiIyMDE5LTA1LTA0In0seyJjb2RlIjoiR08iLCJwYWlkVXBUbyI6IjIwMTktMDUtMDQifSx7ImNvZGUiOiJQUyIsInBhaWRVcFRvIjoiMjAxOS0wNS0wNCJ9LHsiY29kZSI6IkNMIiwicGFpZFVwVG8iOiIyMDE5LTA1LTA0In0seyJjb2RlIjoiUEMiLCJwYWlkVXBUbyI6IjIwMTktMDUtMDQifSx7ImNvZGUiOiJSU1UiLCJwYWlkVXBUbyI6IjIwMTktMDUtMDQifV0sImhhc2giOiI4OTA4Mjg5LzAiLCJncmFjZVBlcmlvZERheXMiOjAsImF1dG9Qcm9sb25nYXRlZCI6ZmFsc2UsImlzQXV0b1Byb2xvbmdhdGVkIjpmYWxzZX0=-Owt3/+LdCpedvF0eQ8635yYt0+ZLtCfIHOKzSrx5hBtbKGYRPFDrdgQAK6lJjexl2emLBcUq729K1+ukY9Js0nx1NH09l9Rw4c7k9wUksLl6RWx7Hcdcma1AHolfSp79NynSMZzQQLFohNyjD+dXfXM5GYd2OTHya0zYjTNMmAJuuRsapJMP9F1z7UTpMpLMxS/JaCWdyX6qIs+funJdPF7bjzYAQBvtbz+6SANBgN36gG1B2xHhccTn6WE8vagwwSNuM70egpahcTktoHxI7uS1JGN9gKAr6nbp+8DbFz3a2wd+XoF3nSJb/d2f/6zJR8yJF8AOyb30kwg3zf5cWw==-MIIEPjCCAiagAwIBAgIBBTANBgkqhkiG9w0BAQsFADAYMRYwFAYDVQQDDA1KZXRQcm9maWxlIENBMB4XDTE1MTEwMjA4MjE0OFoXDTE4MTEwMTA4MjE0OFowETEPMA0GA1UEAwwGcHJvZDN5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxcQkq+zdxlR2mmRYBPzGbUNdMN6OaXiXzxIWtMEkrJMO/5oUfQJbLLuMSMK0QHFmaI37WShyxZcfRCidwXjot4zmNBKnlyHodDij/78TmVqFl8nOeD5+07B8VEaIu7c3E1N+e1doC6wht4I4+IEmtsPAdoaj5WCQVQbrI8KeT8M9VcBIWX7fD0fhexfg3ZRt0xqwMcXGNp3DdJHiO0rCdU+Itv7EmtnSVq9jBG1usMSFvMowR25mju2JcPFp1+I4ZI+FqgR8gyG8oiNDyNEoAbsR3lOpI7grUYSvkB/xVy/VoklPCK2h0f0GJxFjnye8NT1PAywoyl7RmiAVRE/EKwIDAQABo4GZMIGWMAkGA1UdEwQCMAAwHQYDVR0OBBYEFGEpG9oZGcfLMGNBkY7SgHiMGgTcMEgGA1UdIwRBMD+AFKOetkhnQhI2Qb1t4Lm0oFKLl/GzoRykGjAYMRYwFAYDVQQDDA1KZXRQcm9maWxlIENBggkA0myxg7KDeeEwEwYDVR0lBAwwCgYIKwYBBQUHAwEwCwYDVR0PBAQDAgWgMA0GCSqGSIb3DQEBCwUAA4ICAQC9WZuYgQedSuOc5TOUSrRigMw4/+wuC5EtZBfvdl4HT/8vzMW/oUlIP4YCvA0XKyBaCJ2iX+ZCDKoPfiYXiaSiH+HxAPV6J79vvouxKrWg2XV6ShFtPLP+0gPdGq3x9R3+kJbmAm8w+FOdlWqAfJrLvpzMGNeDU14YGXiZ9bVzmIQbwrBA+c/F4tlK/DV07dsNExihqFoibnqDiVNTGombaU2dDup2gwKdL81ua8EIcGNExHe82kjF4zwfadHk3bQVvbfdAwxcDy4xBjs3L4raPLU3yenSzr/OEur1+jfOxnQSmEcMXKXgrAQ9U55gwjcOFKrgOxEdek/Sk1VfOjvS+nuM4eyEruFMfaZHzoQiuw4IqgGc45ohFH0UUyjYcuFxxDSU9lMCv8qdHKm+wnPRb0l9l5vXsCBDuhAGYD6ss+Ga+aDY6f/qXZuUCEUOH3QUNbbCUlviSz6+GiRnt1kA9N2Qachl+2yBfaqUqr8h7Z2gsx5LcIf5kYNsqJ0GavXTVyWh7PYiKX4bs354ZQLUwwa/cG++2+wNWP+HtBhVxMRNTdVhSm38AknZlD+PTAsWGu9GyLmhti2EnVwGybSD2Dxmhxk3IPCkhKAK+pl0eWYGZWG3tJ9mZ7SowcXLWDFAk0lRJnKGFMTggrWjV8GYpw5bq23VmIqqDLgkNzuoog==

2、破解补丁下载

链接:https://pan.baidu.com/s/1EvUvweSG58kFToJXB8ugPw
提取码:vnkq

阅读全文 »

hive数据导出,并指定分隔符,元素包含引号等

语法格式

1
beeline -n username -p password -u jdbc:hive2://host:10000 --verbose=true  --showHeader=false --outputformat=tsv2  --color=true  -e "select * from ${database}.${tablename}" > ${tableName}.csv

通过 outputformat 指定输出格式

–outputformat=[table/vertical/csv/tsv/dsv/csv2/tsv2] == 指定输出格式

–delimiterForDSV="*" ‘&’ 前提(–outputformat=dsv) 指定分隔符

不同格式对应的分隔符如下表:

格式 分隔符
table 表格式
vertical 如下所示
csv ‘,’ 逗号(元素包含引号)
tsv ‘\t’ 制表符(元素包含逗号)
dsv 默认‘|’ 竖线分割,可通过delimiterForDSV指定分隔符
csv2 ‘,’ 逗号(不含引号)
tsv2 ‘\t’ 制表符(不含引号)

说明:

csv格式 == 查询元素有’'单引号

csv2格式没有单引号

tsv,tsv2同上

实例

阅读全文 »