分享知识,分享快乐

0%

yarn webUI 看不到日志

解决办法:

Resource Manager webUI No logs available for container

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
1. Please verify once if you could collect logs using "yarn logs" command as below?
{{
yarn logs -applicationId <appID> -appOwner <user>
}}

2. please verify the below directories if they have right permissions
{{
hdfs dfs -ls /user/history/done
hdfs dfs -ls /user/history/done_intermediate
}}

3. Please verify if "Enable Log Aggregation" has been enabled or not
{{
ClouderaManager-->Yarn-->Configurations-->"Enable Log Aggregation"
}}

4. Verify the permissions for /tmp/logs as below,
{{
hadoop fs -chown mapred:hadoop /tmp/logs
hadoop fs -chown -R :hadoop /tmp/logs/*
}}
阅读全文 »

用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

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

阅读全文 »

hbase-conf:

  • RS堆栈大小: 32G
  • hbase.bucketcache.size=64 =64 * 1024M: 堆外缓存大小,单位为M
  • dfs.replication=3on=3: hdfs副本数
  • hbase.hregion.max.filesize=20G=20G: Region大小
  • hbase.hregion.memstore.flush.size=256=256M: Memstore刷新大小
  • hbase.regionserver.global.memstore.upperLimit=0.t=0.55: 整个RS中Memstore最大比例

#- hbase.regionserver.global.memstore.lowerLimit=0.t=0.5: 整个RS中Memstore最小比例 默认0.95

  • hbase.bucketcache.ioengine=off=offheap: 使用堆外缓存

#- hbase.bucketcache.percentage.in.combinebinedcache=0.9: 堆外读缓存所占比例,剩余为堆内元数据缓存大小

  • hfile.block.cache.size=0.2=0.2: 校验项,+upperLimit需要小于0.8
  • hbase.master.handler.count=256=256: Master处理客户端请求最大线程数
  • hbase.regionserver.handler.count=256=256: RS处理客户端请求最大线程数
  • hbase.hstore.blockingStoreFiles=100: storefile个数达到该值则block写入
  • hbase.hregion.memstore.block.multiplier=3:r=3: 强制刷新Memstore大小的倍数
  • hbase.client.retries.number: 3 : 3
  • hbase.rpc.timeout: 50: 5000

hbase-jvm:

HBASE_OFFHEAPSIZE=??G
HBASE_OPTS="-XX:MaxDirectMemorySize=??G -Xmx??G -Xms??G -Xmn1g -Xss256k -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=256m -XX:+UseParNewGC -XX:MaxTenuringThreshold=15 -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:+CMSClassUnloadingEnabled -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSFullGCsBeforeCompaction=0 -XX:CMSInitiatingOccupancyFraction=70 -XX:+PrintTenuringDistribution -XX:SurvivorRatio=2 -XX:+UseConcMarkSweepGC -XX:-DisableExplicitGC $HBASE_OPTS"

-XX:+UseG1GC
-XX:InitiatingHeapOccupancyPercent=65
-XX:-ResizePLAB
-XX:MaxGCPauseMillis=90
-XX:+UnlockDiagnosticVMOptions
-XX:+G1SummarizeConcMark
-XX:+ParallelRefProcEnabled
-XX:G1HeapRegionSize=32m
-XX:G1HeapWastePercent=20
-XX:ConcGCThreads=4
-XX:ParallelGCThreads=16
-XX:MaxTenuringThreshold=1
-XX:G1MixedGCCountTarget=64
-XX:+UnlockExperimentalVMOptions
-XX:G1NewSizePercent=2
-XX:G1OldCSetRegionThresholdPercent=5

HDFS:

阅读全文 »

机器概况

  • 总内存:256G
  • 可分配内存:256*0.75=192G
  • 总硬盘:1.8T*12=21.6T
  • 可用硬盘空间:21.6T*0.85=18.36T

内存规划

Disk / Java Heap Ratio

Disk / Java Heap Ratio=Disk Size / Java Heap = RegionSize / MemstoreSize * ReplicationFactor * HeapFractionForMemstore * 2
一台RegionServer上1bytes的Java内存大小需要搭配多大的硬盘大小最合理。

公式解释:

  • 硬盘容量维度下Region个数: Disk Size / (RegionSize *ReplicationFactor)
  • Java Heap维度下Region个: Java Heap * HeapFractionForMemstore / (MemstoreSize / 2 )
  • 硬盘维度和Java Headp维度理论相等:Disk Size / (RegionSize *ReplicationFactor) = Java Heap * HeapFractionForMemstore / (MemstoreSize / 2 ) => Disk Size / Java Heap = RegionSize / MemstoreSize * ReplicationFactor * HeapFractionForMemstore * 2

默认配置:

  • RegionSize: hbase.hregion.max.filesize=10G
  • MemstoreSize: hbase.hregion.memstore.flush.size=128M
  • ReplicationFactor: dfs.replication=3
  • HeapFractionForMemstore: hbase.regionserver.global.memstore.lowerLimit = 0.4

计算为:10G / 128M * 3 * 0.4 * 2 = 192,即RegionServer上1bytes的Java内存大小需要搭配192bytes的硬盘大小最合理。

阅读全文 »

修改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 内容如下:

阅读全文 »