首页
Search
1
v2ray异常错误之二
3,310 阅读
2
linux时区设置
2,698 阅读
3
DB2常用操作
2,173 阅读
4
websphere修改jvm内存xmx和xms
1,929 阅读
5
nfs客户端文件属主为nobody的现象
1,552 阅读
技术
生活
运动
游戏
电影
登录
Search
标签搜索
docker
linux
troubleshooting
nginx
secure
truenas
mysql
windows
python
esxi
docker swarm
oracle
zabbix
tomcat
blog
dsm
群晖
rpa
freenas
db
yuc
累计撰写
291
篇文章
累计收到
0
条评论
首页
栏目
技术
生活
运动
游戏
电影
页面
搜索到
2
篇与
的结果
2024-04-24
impala的调优以及导数
优化问题 交换内存调优 vm.swappiness = 0 内存大小 内存最少128G,256G更佳,内存的大小直接影响了查询和导入数据,在cdh5.5版本后取消了内存溢出写入磁盘,查询或者倒数时内存溢出会立即错误 硬盘空间 硬盘一定要足够,在正式环境中,我们需要使用默认设置复制快为3,那么存储空间需求为三倍 hdfs块大小、列存储 hdfs调整数据块大小,在使用parquet列式存储时候,大块文件对性能提升非常大,反之小文件会增加hdfs寻块的时间,推荐的块大小为1G 合适的字段分区 字段分区能够极大提升查询性能,但也需要遵从一定限制,过多的分区有可能会导致数据分布不均,某些块可能非常小,导致查询时间变长 导入数据的压缩格式 压缩能够减少存储空间的使用,但是牺牲了cpu的性能,不论是在查询,还是在导入的时候,都需要把数据进行解压,会消耗更多的cpu时间,对于cpu密集型的工作负载,可以关闭压缩功能,同时,官方测试不使用压缩比压缩查询稍快,使用snappy性能优于gzip压缩 集群负载类型和网络 cdh又分为网络工作负载,cpu工作负载,内存工作负载等类型,所以不仅仅内存需要满足一定需求。磁盘IO,网络带宽(内网10G/s)也都需要满足需求 raid类型 磁盘不需要使用raid,因为hdfs本来就是使用大量廉价机器来提升性能,但raid1明显违背了这一点,raid0数据不可靠,当一个节点宕机,此节点所有的磁盘数据丢失,如果真的需要使用raid来提升性能,那么使用raid5+0,raid1+0,官方推荐方式是jbod,这种方式性能比raid0差不太多,但是可靠性更高,当一块盘损坏时,hdfs会自动重建该盘的数据到其他磁盘,我们只需要替换该盘即可。且官方提到raid0受制于最慢的那块盘,如果最慢的磁盘数据没有写入,其他磁盘无论多块也是不完整的数据,特别是raid0在使用时间过长后损坏的几率以及变慢的几率变高 查看表的信息统计 show table stats TABLE_NAME 查看表的分区 show partitions TABLE_NAME 对表进行信息统计 compute stats TABLE_NAME 关闭压缩 set compression_codec=none; 缓存表 hdfs cacheadmin -addPool 'impala_pool' -owner impala -limit 40000000000 alter table TABLE_NAME set cached in 'impala_pool' with replication=3 alter table TABLE_NAME set uncached 数据导入问题 字段支持类型 impala支持的字段类型有区别于mysql或者oracle等关系型数据库,其中NUMBER改为DECIMAL,VARCHAR2改为VARCHAR,DATE改为TIMESTAMP 数值类型的精度问题 如果在导入数据的时候提示 Error converting column: 34 to DECIMAL(10,0),则表明数据类型不对,可以查看oracle数据库的对应字段的数值精度,再修改即可 数据导入流程和分隔符 先根据原表创建表结构,然后导出数据,这里选择好分隔符field=\"0x1c\" record=\"0x1e\",再根据导出数据时的分隔符创建impala普通表,然后创建parquet表,把普通表导入parquet表,或者先对parquet表进行分区后再导入,最后对导入的数据使用compute stats进行优化 分隔符问题 通过修改impala导入时默认的lines terminated换行符和escape取消转义,原因可能是impala默认换行符\n也能匹配到被取消转义后的oracle换行符 oracle导入数据到impala 这个脚本是之前从oracle导出数据并且导入到impala中,最后转换为parquet表 #!/bin/bash # #列出需要导入的表名,可以是一张表,也可以是多张表 tables="F_BRLXJJB_NEW F_BASY_DBZ F_BASY_JBQK f_basy_jbqk_gx F_BASY_ZZY F_BASY_SSFL F_BASY_FY F_BASY_BFBZ F_BASY_BACX F_FJZL_NEW F_BASY_CYBR F_YBCYRS_NEW F_YBCYRS_NEW_NB" #删除历史的一些遗留文件,或者异常退出产生的遗留文件等 rm -rf /tmp/files/* hadoop fs -rm -r -f /tmp/files/* mkdir /tmp/files hadoop fs -mkdir /tmp/files chmod 777 /tmp/files #抽取oracle中的数据 for i in `echo $tables`;do su - oracle -c "sqluldr user=USER/PASS@SID query=\"select * from ${i}\" file=/tmp/files/${i}.txt field=\"0x1c\" record=\"0x1e\" serial=true charset=utf8 safe=yes" & while true;do n=`ps -ef | grep sqluldr | grep -v grep | wc -l` if [ ${n} -lt 3 ];then break else sleep 60s fi done done while true;do n=`ps -ef | grep sqluldr | grep -v grep | wc -l` if [ ${n} -eq 0 ];then break else sleep 60s fi done #把抽取的数据上传到hdfs for i in `echo $tables`;do hadoop fs -put /tmp/files/${i}.txt /tmp/files & while true;do n=`ps -ef | grep "\-put /tmp/files" | grep -v grep | wc -l` if [ ${n} -lt 3 ];then break else sleep 60s fi done done while true;do n=`ps -ef | grep "hadoop fs -put" | grep -v grep | wc -l` if [ ${n} -eq 0 ];then break else sleep 60s fi done sleep 1200s #删除原来的表,这里的库名根据实际情况修改,然后创建表 for i in `echo $tables`;do impala-shell -q "drop table if exists default.txt_${i}" impala-shell -f tables/${i} done #修改上传文件的权限 hadoop fs -chmod -R 777 /tmp/files #加载数据到普通的表中 for i in `echo $tables`;do impala-shell -q "load data inpath '/tmp/files/${i}.txt' into table default.txt_${i}" done #设置不压缩表,貌似在这里设置没有效果 impala-shell -q "set compression_codec=none" #加载数据到parquet表,上面没有删除parquet表,所以这里是加载数据的语句 for i in `echo $tables`;do impala-shell -f psql/${i} done #对parquet表进行元数据更新操作 for i in `echo $tables`;do impala-shell -q "compute stats default.${i}" done
2024年04月24日
7 阅读
0 评论
0 点赞
2024-04-24
hadoop以及hdfs的若干问题
hdfs丢失块过多的问题 在HDFS客户端,并执行如下命令: 执行命令退出安全模式 hadoop dfsadmin -safemode leave 执行健康检查,删除损坏掉的block hdfs fsck / -delete namenode 空间不足无法使用 在导入数据的时候把namenode误作为datanode,直接从namenode上传数据到hdfs中,当namenode的磁盘完全被存满之后报错namenode is in safemode。想要删除上传的文件,发现已经无法删除,并且再次提示此错误,想通过以下命令强制离开安全模式safemode: hadoop dfsadmin -safemode leave 但再次操作删除文件仍然进入safemode,此时进入循环 最后的解决方案:重启hadoop集群,查看是否在safemode中,不是,则删除文件,成功 datanode各节点分布数据差异大 分布最小的节点20%,最大的60%,这样下次导入数据容易导致磁盘不足,需要对集群中分布的数据做balancer,在任意节点执行: hadoop balancer -threshold 5 #节点之间允许5%大小的容量差值,大小在0-100 设置hdfs中平衡数据的传输带宽 如果传输的带宽过大或者过小都有可能影响节点性能,需要根据情况取一个合适的值,参数 dfs.balance.bandwidthPerSec 默认值: 1048575(1M/s),在balancer的时候每个节点传输的最大带宽,可以修改hdfs-site.xml来修改平衡的带宽 <property> <name>dfs.balance.bandwidthPerSec</name> <value>20971520</value> <description> Specifies the maximum bandwidth that each datanode can utilize for the balancing purpose in term of the number of bytes per second. </description> </property> 这里调整传输的最大带宽为 20M/s,当然也可以临时修改带宽: hdfs dfsadmin -setBalancerBandwidth 104857600 如果是cdh,则可以通过图形化页面修改值来持久化修改 对当前上传的文件设置冗余 hdfs中上传的文件,如果不特定修改参数,那么副本数就是之前的默认值,但如果对于一些临时大文件,不想要多个副本,则可以在上传的时候手动设置其副本数即可: hadoop fs -D dfs.replication=1 -put /file/to/path /file/to/hadooppath 如果想要修改以前已上传文件的副本数,则可以通过如下命令: hadoop fs -setrep -R cdh中root用户无法在任何hdfs文件夹中创建文件 发现使用root用户也无法在hdfs 根目录下创建文件夹,google了一下,有几个解决办法: 方法一: a. In cloudera manager, you can change the settings: hdfs->configuration->view&edit, uncheck the Check HDFS Permissions dfs.permissions and restart the hdfs. # 具体操作:在cdh的web中点击集群-hdfs-配置 方法二: b. I resolved the issue by creating a supergroup in /etc/group and updated the user logins on it. I mean user should be part of HDFS supergroup to have access to write on HDFS. # 具体操作:在服务器中添加supergroup组,然后添加root用户到这个组中/etc/group文件内容直接修改即可supergroup:x:501:root
2024年04月24日
6 阅读
0 评论
0 点赞