配额:
目录配额:hdfs dfsadmin -setQuota
空间配额:hdfs dfsadmin -setSpaceQuota 块大小x副本数
快照:
和Linux的硬链接类似,作为数据块的引用
原文件发生改变,快照不会改变
回收站:
core-site.xml
hdfs dfs -expunge
序列化
序列化是将结构化对象转化为字节流
序列化出现的领域:
进程间通信
永久存储
hadoop中的进程间通信是通过RPC实现的,
RPC是一种协议,使用的是序列化技术
特点:
紧凑
快速
可扩展
支持互操作
writable:是java中基本类型的封装
int ==> intWritable
String ==> Text
hadoop归档文件:har
1文件 ====> 150字节
hadoop archive -archiveName my.har /data data1 data2 / //启动yarn
hdfs dfs -lsr har:///my.har
hadoop的压缩:
deflate(default)
gzip
bzip2
lzo
lz4
snappy
.deflate压缩耗时: 1029 压缩大小: 1646396 .deflate解压耗时: 841
.gz压缩耗时: 405 压缩大小: 1646408 .gz解压耗时: 173
.bz2压缩耗时: 4347 压缩大小: 1139847 .bz2解压耗时: 1225
.lz4压缩耗时: 68 压缩大小: 2531023 .lz4解压耗时: 104
压缩效率:lz4 < gzip < deflate < bzip2
解压效率:lz4 < gzip < deflate < bzip2
压缩占比:bzip2 < deflate < gzip < lz4
引入lzo依赖:pom
<!-- Lzo的依赖 -->
<dependency>
<groupId>org.anarres.lzo</groupId>
<artifactId>lzo-hadoop</artifactId>
<version>1.0.0</version>
</dependency>
apache的hadoop默认不支持snappy:
1、将s101的hadoop配置文件的etc文件夹备份到~下
mv /soft/hadoop/etc ~
2、删除/soft/hadoop-2.7.3目录'
rm -rf /soft/hadoop-2.7.3
3、将hadoop-2.7.3_snappy.tar.gz发送到s101,并解压到/soft目录
tar -xzvf hadoop-2.7.3_snappy.tar.gz -C /soft
4、将新文件夹的etc目录删除
rm -rf /soft/hadoop-2.7.3/etc
5、将备份的etc文件夹移动到/soft/hadoop即可
mv ~/etc /soft/hadoop/
将代码稍作修改,将其打成jar放在Linux上运行
1、修改代码
2、在idea上进行build
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.7</source>
<target>1.7</target>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>com.oldboy.compression.TestCodec</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id> <!-- this is used for inheritance merges -->
<phase>package</phase> <!-- bind to the packaging phase -->
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
.deflate压缩耗时: 763 压缩大小: 1646396 .deflate解压耗时: 254
.gz压缩耗时: 294 压缩大小: 1646408 .gz解压耗时: 89
.bz2压缩耗时: 2992 压缩大小: 1139847 .bz2解压耗时: 730
.lz4压缩耗时: 70 压缩大小: 2531023 .lz4解压耗时: 81
.lzo_deflate压缩耗时: 184 压缩大小: 2564953 .lzo_deflate解压耗时: 148
.snappy压缩耗时: 65 压缩大小: 2563606 .snappy解压耗时: 47
压缩效率:snappy < lz4 < lzo < gzip < deflate < bzip2
解压效率:snappy < lz4 < gzip < lzo < deflate < bzip2
压缩占比:bzip2 < deflate < gzip < lz4 < snappy < lzo
所以,在生产环境中,序列化或者网络间传输数据一般都使用压缩技术
平衡硬件占用率:压缩使用cpu的多线程实现,解决空间占用和网络带宽的消耗
解决小文件:
har //hadoop archive
压缩 //codec
序列文件 //sequenceFile
sequenceFile:序列文件
SeqFile是扁平化文件包含二进制的K-V
SequenceFile在内部支持压缩,并包括以下三种压缩类型:
不压缩: //不压缩
记录压缩: //只压缩value
块压缩 : //k-v以block的形式聚合在一起并进行压缩,block可配置
SequenceFile的数据格式:
版本: //包括3个字节的SEQ,和真实版本号(e.g. SEQ4 or SEQ6)
key的类名 //e.g. org.apache.hadoop.io.IntWritabe
value的类名 //
是否压缩 //boolean
是否是块压缩 //boolean
压缩编解码器 //compression codec
元数据 //真实数据
同步点 //
创建SeqFile:1、
读取SeqFile:1、
2、hdfs dfs -text file:///F:/seq/1.seq
sequenceFile可切割:
1、物理切割:hdfs块切割
2、逻辑切割:mapreduce计算单位是行,所以文件需要逻辑可切割
即在文件的任意位置都能定位到文件数据
能够进行逻辑切割的文件形式:
1)bzip2压缩 //自带压缩
2)Lzo压缩 //手动加索引
//LzoIndexer indexer = new LzoIndexer(conf);
//indexer.index(new Path(lzoPath));
3)sequenceFile //通过同步点(sync)机制获取数据定位,并进行计算
SequenceFile的seek和Sync:
seek:硬性定位指针,从此位置开始读取
sync:定位到最近同步点(当前位置之后的),从同步点读取数据
SequenceFile的sort:
MapFile:排序且带索引的seqFile
index: //索引数据
//key= data中的key
value = 条目的position
data: //真实数据
SeqFile转换为Mapfile
person ===> personWritable
通过personWritable形式将person对象,转化为SequenceFile
MapFile.fix( fs, p, IntWritable.class, Text.class, false, conf); //必须是false
SequenceFile三种压缩类型:
不压缩: //不压缩
记录压缩: //只压缩value
块压缩: //
创建SequenceFile或压缩编解码器出现异常:
1、在windows的cmd中输入hadoop version测试版本,如果出现版本号则下一步 //环境变量
2、输入winutils,如果出现错误,需要安装vc++运行库 //vc++运行库缺失
maven:
项目构建、依赖管理和项目信息管理
配置maven环境变量:
1、M2_HOME=E:\Program\apache-maven-3.5.0
2、PATH
3、在cmd中输入mvn -v
%M2_HOME%下的conf文件夹里面的settings.xml文件是非常重要的文件
0、创建pom文件:pom.xml
<?xml version="1.0"?>
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.oldboy</groupId>
<artifactId>helloworld</artifactId>
<version>1.0</version>
</project>
1、创建一个文件夹,并在文件夹中打开cmd,并输入以下命令创建文件夹
md src\main\java\com\oldboy\helloworld
2、使得pom.xml文件和src文件夹保持在相同目录下
3、在helloworld文件夹编写HelloWorld.java
package com.oldboy.helloworld;
public class HelloWorld{
public static void main(String[] args){
System.out.println("Hello world");
}
}
4、在pom文件所在目录下输入mvn clean compile
mvn clean //删除target文件夹
compile //编译
package //打包
archetype:generate //生成项目骨架
public class TestSeqCompress {
public static void main(String[] args) throws Exception {
System.setProperty("HADOOP_USER_NAME","centos");
Configuration conf = new Configuration();
conf.set("fs.defaultFS","file:///");//这一步需要在FileSystem之前,如果在之后,就是先连接Hadoop在设置成本地,
//导致后面使用的conf还是Hadoop的,set就没有意义了。
FileSystem fs = FileSystem.get(conf);//连接系统
CompressionCodec cos = (CompressionCodec)ReflectionUtils.newInstance(LzoCodec.class, conf);
Path p = new Path("file:///D:/e/2.seq");
SequenceFile.Writer writer = SequenceFile.createWriter(fs,conf,p,IntWritable.class,Text.class,
SequenceFile.CompressionType.NONE);
//IntWritable key = new IntWritable(1);
//Text value = new Text("hello"+1);
for(int i = 1;i<100;i++){
Random r = new Random();
int j = r.nextInt(1000);
IntWritable key = new IntWritable(j);
Text value = new Text("tom"+i);
writer.append(key,value);
}
writer.close();
//System.out.println();
}
}