分享知识,分享快乐

0%

Conda常用命令整理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
conda --version #查看conda版本,验证是否安装

conda update conda #更新至最新版本,也会更新其它相关包

conda update --all #更新所有包

conda update package_name #更新指定的包

conda create -n env_name package_name #创建名为env_name的新环境,并在该环境下安装名为package_name 的包,可以指定新环境的版本号,例如:conda create -n python2 python=python2.7 numpy pandas,创建了python2环境,python版本为2.7,同时还安装了numpy pandas包

conda activate env_name #切换至env_name环境

conda deactivate #退出环境

conda info -e #显示所有已经创建的环境

conda create --name new_env_name --clone old_env_name #复制old_env_name为new_env_name

conda remove --name env_name –all #删除环境

conda list #查看所有已经安装的包

conda install package_name #在当前环境中安装包

conda install --name env_name package_name #在指定环境中安装包

conda remove -- name env_name package #删除指定环境中的包

conda remove package #删除当前环境中的包

conda create -n tensorflow_env tensorflow

conda activate tensorflow_env #conda 安装tensorflow的CPU版本

conda create -n tensorflow_gpuenv tensorflow-gpu

conda activate tensorflow_gpuenv #conda安装tensorflow的GPU版本

conda env remove -n env_name #采用第10条的方法删除环境失败时,可采用这种方法

Conda常用命令整理

https://blog.csdn.net/menc15/article/details/71477949/

阅读全文 »

spark-python版本依赖与三方模块方案

(1)使用conda创建python虚拟环境、安装第三方库

假设虚拟环境是pyspark_py36,安装位置是:

1
2
/root/miniconda3/envs/pyspark_py36
此处省略1w个字。

安装的第三方库是:

1
2
3
4
5
source activate pyspark_py36

pip install pandas
pip install sklearn
pip install lightgbm

其他省略1w字。

(2)打包整个虚拟环境

进入虚拟环境目录,压缩整个文件夹

1
2
cd /root/miniconda3/envs/
zip -r -9 -q pyspark_py36.zip pyspark_py36/
阅读全文 »

linux基础命令之:vi模式下查找和替换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
一、查找
查找命令
/pattern<Enter> :向下查找pattern匹配字符串
?pattern<Enter>:向上查找pattern匹配字符串
使用了查找命令之后,使用如下两个键快速查找:
n:按照同一方向继续查找
N:按照反方向查找
pattern是需要匹配的字符串,例如:
/hello<Enter> #查找hello
/hello<Enter> #查找hello单词(注意前后的空格)
除此之外,pattern还可以使用一些特殊字符,包括(/、^、$、*、.),其中前三个这两个是vi与vim通用的,“/”为转义字符。
/^hello<Enter> #查找以hello开始的行
/hello$<Enter> #查找以hello结束的行
//^hello<Enter> #查找^hello字符串

二、替换
1.:[range]s/pattern/string/[c,e,g,i]
range 指的是范围,1,7 指从第一行至第七行,1,$ 指从第一行至最后一行,也就是整篇文章,也可以 % 代表。 % 是目前编辑的文章,# 是前一次编辑的文章。
pattern 就是要被替换掉的字串,可以用 regexp 来表示。
string 将 pattern 由 string 所取代。
c confirm,每次替换前会询问。
e 不显示 error。
g globe,不询问,整行替换。
i ignore 不分大小写。
I ignore 大小写敏感。

2.基本替换
:s/lantian/sky/ #替换当前行第一个 lantian 为 sky
:s/lantian/sky/g #替换当前行所有 lantian 为 sky
:n,$s/lantian/sky/ #替换第 n 行开始到最后一行中每一行的第一个 lantian 为 sky
:n,$s/lantian/sky/g #替换第 n 行开始到最后一行中每一行所有 lantian 为 sky
#(n 为数字,若 n 为 .,表示从当前行开始到最后一行)
:%s/lantian/sky/ #(等同于 :g/lantian/s//sky/) 替换每一行的第一个 lantian 为 sky
:%s/lantian/sky/g #(等同于 :g/lantian/s//sky/g) 替换每一行中所有 lantian 为 sky
可以使用 #或+ 作为分隔符,此时中间出现的 / 不会作为分隔符
:s#lantian/#sky/# 替换当前行第一个 lantian/ 为 sky/
:%s+/oradata/apras/+/user01/apras1+ (
使用+ 来 替换 / ): /oradata/apras/替换成/user01/apras1/

3.删除文本中的^M
问题描述:对于换行,window下用回车换行(0A0D)来表示,linux下是回车(0A)来表示。这样,将window上的文件拷到unix上用时,总会有个^M,请写个用在unix下的过滤windows文件的换行符(0D)的shell或c程序。
使用命令:cat filename1 | tr -d “^V^M” > newfile;
使用命令:sed -e “s/^V^M//” filename > outputfilename
需要注意的是在1、2两种方法中,^V和^M指的是Ctrl+V和Ctrl+M。你必须要手工进行输入,而不是粘贴。
在vi中处理:首先使用vi打开文件,然后按ESC键,接着输入命令:
:%s/^V^M//
:%s/^M$//g
如果上述方法无用,则正确的解决办法是:
tr -d “/r” < src >dest
tr -d “/015″ dest
strings A>B

4.其它用法
:s/str1/str2/ #用字符串 str2 替换行中首次出现的字符串 str1
:s/str1/str2/g #用字符串 str2 替换行中所有出现的字符串 str1
:.,$ s/str1/str2/g #用字符串 str2 替换正文当前行到末尾所有出现的字符串 str1
:1,$ s/str1/str2/g #用字符串 str2 替换正文中所有出现的字符串 str1
:g/str1/s//str2/g #功能同上

5.g的总结说明
从上述替换命令可以看到:
g 放在命令末尾,表示对指定行的搜索字符串的每次出现进行替换;不加 g,表示只对指定行的搜索字符串的首次出现进行替换;
g 放在命令开头,表示对正文中所有包含搜索字符串的行进行替换操作。
也就是说命令的开始可以添加影响的行,如果为g表示对所有行;命令的结尾可以使用g来表示是否对每一行的所有字符串都有影响。
阅读全文 »

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

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

阅读全文 »