分享知识,分享快乐

0%

用Hue中的Oozie执行Impala Sheel脚本

在Oozie中不能像执行hive SQL那样直接执行impala SQL脚本。目前没有Impala操作,因此你必须使用调用impala-shell的shell操作。调用impala-shell的shell脚本中还必须包含设置PYTHON EGGS位置的环境变量

1
2
3
export PYTHON_EGG_CACHE=.python-eggs   

impala-shell -i 172.20.15.10:21000 -u hpt -l --auth_creds_ok_in_clear --ldap_password_cmd='echo -n ***' -q 'SET request_pool=development;'
阅读全文 »

注意:目前Hudi使用的是hadoop2.7.3版本,CDH6.3.0 环境使用的是hadoop3.0.0, 所以在打包的时候需要加上**-Dhadoop.version=3.0.0** 参数

1
mvn clean install -DskipTests -DskipITs -Dcheckstyle.skip=true -Drat.skip=true -Dhadoop.version=3.0.0
1
2
3
4
5
sudo -u yarn spark-shell  \
--queue bf_yarn_pool.development \
--packages org.apache.spark:spark-avro_2.11:2.4.0 \
--conf 'spark.serializer=org.apache.spark.serializer.KryoSerializer' \
--jars `ls /opt/hudi/packaging/hudi-spark-bundle/target/hudi-spark-bundle_2.11-*.*.*-SNAPSHOT.jar`
阅读全文 »

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日")
阅读全文 »