【Hadoop 企业开发经验】01 HDFS

1.HDFS存储多目录

(1)给Linux系统新增加一块硬盘
参考:https://www.cnblogs.com/yujianadu/p/10750698.html
(2)生产环境服务器磁盘情况
在这里插入图片描述
(3)在hdfs-site.xml文件中配置多目录,注意新挂载磁盘的访问权限问题
HDFS的DataNode节点保存数据的路径由dfs.datanode.data.dir参数决定,其默认值为file://${hadoop.tmp.dir}/dfs/data,若服务器有多个磁盘,必须对该参数进行修改。如服务器磁盘如上图所示,则该参数应修改为如下的值。

<property>
    <name>dfs.datanode.data.dir</name>
<value>file:///dfs/data1,file:///hd2/dfs/data2,file:///hd3/dfs/data3,file:///hd4/dfs/data4</value>
</property>

注意:因为每台服务器节点的磁盘情况不同,所以这个配置配完之后,不需要分发

2.集群数据均衡

1)节点间数据均衡

(1)开启数据均衡命令

start-balancer.sh -threshold 10

对于参数10,代表的是集群中各个节点的磁盘空间利用率相差不超过10%,可根据实际情况进行调整。
(2)停止数据均衡命令

stop-balancer.sh

注意:于HDFS需要启动单独的Rebalance Server来执行Rebalance操作,所以尽量不要在NameNode上执行start-balancer.sh,而是找一台比较空闲的机器。

2)磁盘间数据均衡

磁盘间均衡本质上是文件的copy
(1)生成均衡计划(我们只有一块磁盘,不会生成计划)

hdfs diskbalancer -plan hadoop103

(2)执行均衡计划

hdfs diskbalancer -execute hadoop103.plan.json

(3)查看当前均衡任务的执行情况

hdfs diskbalancer -query hadoop103

(4)取消均衡任务

hdfs diskbalancer -cancel hadoop103.plan.json

3.项目经验之支持LZO压缩配置

hadoop本身不支持Lzo压缩;
让hadoop支持lzo有两种方式:
1.编译hadoop源码
2.编译hadoop-lzo插件

编译hadoop-lzo方式的步骤如下:
1)hadoop-lzo编译
hadoop本身并不支持lzo压缩,故需要使用twitter提供的hadoop-lzo开源组件。hadoop-lzo需依赖hadoop和lzo进行编译,编译步骤就不写了;

2)将编译好后的hadoop-lzo-0.4.20.jar 放入hadoop的common目录下

[atguigu@hadoop102 common]$ pwd
/opt/module/hadoop-3.1.3/share/hadoop/common
[atguigu@hadoop102 common]$ ls
hadoop-lzo-0.4.20.jar

3)同步hadoop-lzo-0.4.20.jar到hadoop103、hadoop104

[atguigu@hadoop102 common]$ xsync hadoop-lzo-0.4.20.jar

4)core-site.xml增加配置支持LZO压缩

<configuration>
    <property>
        <name>io.compression.codecs</name>
        <value>
            org.apache.hadoop.io.compress.GzipCodec,
            org.apache.hadoop.io.compress.DefaultCodec,
            org.apache.hadoop.io.compress.BZip2Codec,
            org.apache.hadoop.io.compress.SnappyCodec,
            com.hadoop.compression.lzo.LzoCodec,
            com.hadoop.compression.lzo.LzopCodec
        </value>
    </property>

    <property>
        <name>io.compression.codec.lzo.class</name>
        <value>com.hadoop.compression.lzo.LzoCodec</value>
    </property>
</configuration>

5)同步core-site.xml到hadoop103、hadoop104

[atguigu@hadoop102 hadoop]$ xsync core-site.xml

6)启动及查看集群

[atguigu@hadoop102 hadoop-3.1.3]$ sbin/start-dfs.sh
[atguigu@hadoop103 hadoop-3.1.3]$ sbin/start-yarn.sh

7)测试-数据准备

[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -mkdir /input
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -put README.txt /input

8)测试-压缩

[atguigu@hadoop102 hadoop-3.1.3]$ hadoop jar \
share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount\
-Dmapreduce.output.fileoutputformat.compress=true \
-Dmapreduce.output.fileoutputformat.compress.codec=com.hadoop.compression.lzo.LzopCodec  \
/MapReduce/01wc/wcinput \
/MapReduce/01wc/outputLzo

在这里插入图片描述
在这里插入图片描述
经过lzo压缩的输出文件后缀为.lzo,并且文件内容乱码

4.LZO创建索引来支持切片

上面我们知道了如何配置MapRedue的输出文件格式是Lzo压缩的;但是纯Lzo格式的文件作为MR的输入数据,是不支持切片的,因此这里教你如何让MR支持lzo文件的切片

1.给LZO文件创建索引的方式
LZO压缩文件的可切片特性依赖于其索引,故我们需要手动为LZO压缩文件创建索引。若无索引,则LZO文件的切片只有一个。

hadoop jar \
/path/to/your/hadoop-lzo.jar \
com.hadoop.compression.lzo.DistributedLzoIndexer \
big_file.lzo

2.lzo切片测试
(1)不建立索引测试
1.将一个lzo文件bigtable.lzo(200M)上传到集群的根目录

[atguigu@hadoop102 module]$ hadoop fs -mkdir /input
[atguigu@hadoop102 module]$ hadoop fs -put bigtable.lzo /input

2.执行wordcount程序,测试

[atguigu@hadoop102 module]$ hadoop jar \
/opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount \
-Dmapreduce.job.inputformat.class=com.hadoop.mapreduce.LzoTextInputFormat \
/input \
/output1

注意:这里指定的就是inputFormat的类型,用的是LzoTextInputFormat;
在这里插入图片描述
在没有建立索引的情况下,即便是lzo文件,也只有一个切片

(2)建立lzo索引测试
1.对上传的LZO文件建索引:

[atguigu@hadoop102 module]$ hadoop jar \
/opt/module/hadoop-3.1.3/share/hadoop/common/hadoop-lzo-0.4.20.jar  \
com.hadoop.compression.lzo.DistributedLzoIndexer \
/input/bigtable.lzo

在这里插入图片描述
建立索引本质上也是一个MR程序;

2.再次执行WordCount程序进行测试

[atguigu@hadoop102 module]$ hadoop jar \
/opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount \
-Dmapreduce.job.inputformat.class=com.hadoop.mapreduce.LzoTextInputFormat \
/input \
/output2

在这里插入图片描述
注意:如果以上任务,在运行过程中报如下异常

Container [pid=8468,containerID=container_1594198338753_0001_01_000002] is running 318740992B beyond the 'VIRTUAL' memory limit. Current usage: 111.5 MB of 1 GB physical memory used; 2.4 GB of 2.1 GB virtual memory used. Killing container.
Dump of the process-tree for container_1594198338753_0001_01_000002 :

解决办法:在hadoop102的/opt/module/hadoop-3.1.3/etc/hadoop/yarn-site.xml文件中增加如下配置,然后分发到hadoop103、hadoop104服务器上,并重新启动集群。

<!--是否启动一个线程检查每个任务正使用的虚拟内存量,如果任务超出分配值,则直接将其杀掉,默认是true -->
<property>
   <name>yarn.nodemanager.vmem-check-enabled</name>
   <value>false</value>
</property>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值