文章目录
- 复习一
- 一. 单选题
- 二. 多选题
- 三. 填空题
- 复习三
- 一. 单选题
复习一
一. 单选题
- (单选题)压缩速度由大到小snappy、LZO、gzip、bzip2,压缩比最大的是
A. snappy
B. LZO
C. gzip
D. zip2
正确答案: D:zip2;
答案解析:
压缩率:zip2>gzip>lzo>snappy
压缩速度:snappy>lzo>gzip>zip2
压缩比越大 压缩速度越慢
- (单选题)以下类中哪一个可以实现程序从文件中读取数据
A. inputStream
B. FileInputStream
C. FileOutputStream
D. DataOutput
正确答案: B:FileInputStream;
答案解析:
inoutStream是一个抽象类,是所有输入流类的超类,本身不能直接用来读取文件。
FileOutStream用于将数据写入文件
DataOutput是一个接口,定义了写入数据到二进制流的方法输入流,从文件读取FileInputStream
二. 多选题
- (多选题)实现java序列化的接口
A. Serializable
B. Externalizable
C. action
D. string
正确答案: A B: Serializable ; Externalizable;
答案解析:
A. Serializable 接口是一个标记接口,它不包含任何方法。当一个类实现了这个接口,它就可以将其实例的状态保存到一个字节流中,并且可以从字节流中重构回来。
B. Externalizable 接口扩展了 Serializable 接口,并添加了两个方法:writeExternal 和 readExternal。这允许类有更多的控制权,比如自定义序列化和反序列化的机制。
C. action 不是一个与序列化相关的接口。
D. String 是Java的一个类,用于表示字符串,它本身实现了 Serializable 接口,但不是用来实现序列化的接口。
- (多选题)hadoop序列化接口
A. Serializable
B. Externalizable
C. Writable
D. WritableComparable
正确答案: C D:Writable; WritableComparable;
答案解析:
WritableComparable接口是Writable接口的子接口
A. Serializable 是Java标准序列化接口,但在Hadoop中通常不使用,因为它的性能比Hadoop的序列化机制慢。
B. Externalizable 也是Java的序列化接口,允许自定义序列化机制,但同样不是Hadoop中使用的序列化接口。
C. Writable 是Hadoop的序列化接口,用于数据的序列化和反序列化。它是Hadoop数据类型必须实现的接口,以便能够在Hadoop的各种节点之间传输。
D. WritableComparable 接口继承自 Writable 并添加了 Comparable 接口。这允许比较操作,是MapReduce框架中键(Key)类必须实现的接口,以便在排序和分组时使用。
- (多选题)选择hadoop可序列化类型
A. String
B. Arrays
C. Text
D. IntWritable
正确答案: C D:Text ; IntWritable;
答案解析:
String和Arrays不是可序列化类型,没有实现Writable接口。
A. String 是Java的基本数据类型,虽然它实现了 Serializable 接口,但在Hadoop中通常使用 Text 类来代替 String,因为 Text 类实现了 Writable 接口。
B. Arrays 本身不是Hadoop的序列化类型,但如果数组中的元素是 Writable 类型的,那么这个数组可以被序列化。
C. Text 是Hadoop中用于文本数据的序列化类型,它实现了 Writable 接口。
D. IntWritable 是Hadoop中用于整数数据的序列化类型,它实现了 Writable 接口。
- (多选题)分布式系统的三个基本特征()
A. 并发性
B. 副本
C. 可扩展性
D. 稳定性
正确答案: ABC:并发性; 副本; 可扩展性;
答案解析:
分布式系统的特点很多,冗余副本、并发、可扩展性、全局的时钟(确定分布环境下事件发生的先后)、故障总会发生等。稳定性不在其中,因为默认分布式系统中设备故障、网络故障等认为是不可靠的。因此设计时通过各种手段达到尽量大的稳定。
- (多选题)广义地将云计算解释为一种通过互联网提供的一种服务,被分为3个层次
( )基础架构即服务() 平台即服务() 软件即服务,灵活度依次从高到底
A. IaaS
B. Paas
C. SaaS
正确答案: A B C:IaaS; Paas; SaaS;
答案解析:
基本概念,灵活性从大到小,配置难度也是从大到小。SaaS提供某软件功能
1.基础架构即服务 (IaaS): 这是最底层的服务,提供虚拟化的计算资源。用户可以在这些资源上运行任何软件,包括操作系统和应用程序。因为用户几乎可以控制整个软件堆栈,所以IaaS提供了最高的灵活度。
2.平台即服务 (PaaS): 这个层次提供了一个平台,用户可以在上面开发、运行和管理应用程序,而不必担心底层基础设施的维护和管理。PaaS提供的灵活度适中,用户不需要管理基础设施,但仍然可以控制应用程序。
3.软件即服务 (SaaS): 这是最高层的服务,提供的是直接可用的软件应用。用户不需要关心应用程序的开发、维护或基础架构,只需通过互联网使用软件即可。SaaS提供的灵活度最低,因为用户通常只能使用软件而不能控制其任何部分。
- (多选题) Apache Hadoop2.0的核心组件是()
A. HDFS
B. MapReduce
C. YARN
D. zookeeper
E. Common
正确答案: A B C E:HDFS; MapReduce; YARN; Common;
答案解析:
zookeeper不是,common容易漏掉
A. HDFS (Hadoop Distributed File System):一个分布式文件系统,提供高吞吐量的数据访问。
B. MapReduce:一个编程模型和处理大数据集的实现。
C. YARN (Yet Another Resource Negotiator):一个资源管理和作业调度平台。
E. Common:提供Hadoop的框架和核心库。D. ZooKeeper 不是Hadoop 2.0的核心组件,但它是一个为分布式应用提供协调服务的软件项目,经常与Hadoop及其他大数据解决方案一起使用。
- (多选题)想要访问hdfs文件系统中的文件,可以使用()设置。
Configuration conf=new Configuration();
A. conf.set(“fs.defaultFS”,”hdfs://master:9000”) FileSystem.get(conf);
B. FileSystem.get(new URI(“hdfs://master:9000/”),conf)
C. linux系统中配置了hdfs分布式配置文件,默认读取无需设置,在linux上执行程序
正确答案: ABC
答案解析:
三种方式都可以,注意C说明了程序运行的环境是linux系统,且按照分布式运行配置了文件,则conf会自动加载相关配置文件。如果没有配置文件不管是linux还是windows上执行均以本地模式。
A. 使用 Configuration 对象和 FileSystem.get 方法:
Configuration conf = new Configuration();
conf.set(“fs.defaultFS”, “hdfs://master:9000”);
FileSystem fs = FileSystem.get(conf);
B. 直接在 FileSystem.get 方法中指定HDFS的URI:
FileSystem fs = FileSystem.get(new URI(“hdfs://master:9000/”), conf);
C. 如果在Linux系统中已经配置了HDFS的分布式配置文件,且这些配置文件被正确地放置在了类路径下,那么在执行程序时,Hadoop客户端默认会读取这些配置文件,无需在代码中显式设置。
三. 填空题
- (填空题)对下面的person类进行序列化改造
public class person _____________ {
String name;
int age;
public void set( String name,int age ){
this.name=name;
this.age=age; }
public void write(_____ )throws IOException{
out.writeUTF(name);
out.writeInt(age);}
public void _____(DataInput in) throws IOException{
name=in.readUTF();
age=in.readInt();}
}
正确答案:
(1) implements Writable
(2) DataOutput out
(3) readFields
public class Person implements Writable {
String name;
int age;
public void set(String name, int age) {
this.name = name;
this.age = age;
}
public void write(DataOutput out) throws IOException {
out.writeUTF(name);
out.writeInt(age);
}
public void readFields(DataInput in) throws IOException {
name = in.readUTF();
age = in.readInt();
}
}
implements Writable - 这使得 Person 类可以通过Hadoop的序列化/反序列化机制进行处理。
DataOutput out - 这是 write 方法的参数类型,用于将数据写入到输出流。
readFields - 这是 Writable 接口中的方法,需要被重写以从输入流中读取数据。
- (填空题)以下程序段实现了对hdfs中/file1.txt进行压缩,使用BZip2压缩算法,并将压缩文件存储到hdfs,文件名及存储路径为:/bzfile1.bz2。
String codecclass = “org.apache.hadoop.io.compress.BZip2Codec”;
Configuration conf=new Configuration();
URI uri=new URI(“hdfs://192.168.100.101:9000/”);
FileSystem fs = ;
FSDataInputStream fin = fs.open();
FSDataOutputStream fout = fs.create(new Path(“/bzfile1.bz2”));
Class<?> cls1 = Class.forName(codecclass);
CompressionCodec dfcInstance = (CompressionCodec) ReflectionUtils.newInstance(cls1, conf);
_________________ outs=dfcInstance.createOutputStream(fout);
IOUtils.copyBytes(_______________);
正确答案:
(1) FileSystem.get(uri,conf)
(2) new Path(“/file1.txt”)
(3) CompressionOutputStream
(4) fin, outs, 1024,true;fin,outs conf
String codecclass = "org.apache.hadoop.io.compress.BZip2Codec";
Configuration conf = new Configuration();
URI uri = new URI("hdfs://192.168.100.101:9000/");
FileSystem fs = FileSystem.get(uri, conf);
FSDataInputStream fin = fs.open(new Path("/file1.txt"));
FSDataOutputStream fout = fs.create(new Path("/bzfile1.bz2"));
Class<?> cls1 = Class.forName(codecclass);
CompressionCodec dfcInstance = (CompressionCodec) ReflectionUtils.newInstance(cls1, conf);
CompressionOutputStream outs = dfcInstance.createOutputStream(fout);
IOUtils.copyBytes(fin, outs, 1024, true);
答案解析:
压缩的基本步骤:依次创建源文件输入流FSDataInputStream fin,文件输出流FSDataOutputStream fout,创建压缩编码器(掌握反射机制创建方法),通过压缩编码器的createOutputStream方法封装 fout,创建压缩文件输出流cout,利用IOutiles提供的copybytes方法实现文件输入流到压缩输出流的数据拷贝,即形成压缩文件。
FileSystem.get(uri, conf) - 这行代码用于获取指向HDFS的 FileSystem 实例。
new Path(“/file1.txt”) - 这是要打开的HDFS文件的路径。
CompressionOutputStream - 这是 dfcInstance.createOutputStream(fout) 返回的输出流的类型。
fin, outs, 1024, true - 这是 IOUtils.copyBytes 方法的参数,用于将输入流 fin 的内容复制到输出流 outs,并在复制完成后关闭流。
- (填空题)下面的数量单位从大到小依次是__1__、2、3、4、5、6、7、
A KB B GB C TB D MB E PB F EB G ZB
正确答案:
(1) G
(2) F
(3) E
(4) C
(5) B
(6) D
(7) A
ZB (Zettabyte): 1 ZB 等于 2的70次方字节,或者说是 1024 EB。这是一个极其庞大的数字,通常用于描述全球数据中心的总存储容量。
EB (Exabyte): 1 EB 等于 2的60次方字节,或者是 1024 PB。这个单位可以用来衡量大型企业或云服务提供商的数据存储。
PB (Petabyte): 1 PB 是 2的50次方字节,或者是 1024 TB。这个单位经常用于科学研究中,比如天文学或基因组学的数据存储。
TB (Terabyte): 1 TB 等于 2的40次方字节,或者是 1024 GB。个人电脑的硬盘驱动器和外部驱动器通常以TB为单位。
GB (Gigabyte): 1 GB 是 2的30次方字节,或者是 1024 MB。这个单位用于衡量普通软件的大小,或者是智能手机的存储空间。
MB (Megabyte): 1 MB 等于 2的20次方字节,或者是 1024 KB。这个单位常用于衡量文档或图片的大小。
KB (Kilobyte): 1 KB 是 2的10次方字节。虽然在现代计算中不是很常见,但仍然可以用于衡量非常小的文件大小。
- (填空题) 1TB=__1__KB 2^n表示2的n次幂
A2^10 B 2^40 C 2^30 D 2^50
正确答案:
(1) C
答案解析:1TB=2^40 B =2^30 KB 1KB=2^10 B
-
(填空题)Student类的定义如下:
package fanshe;
public class Student {
public String name;
private int age;
private char sex;
public Student() {System.out.println(“调用了公有、无参构造方法”);}
Student(String name) {System.out.println("无修饰符的构造方法 name= " + name); }
Student(char sex) { System.out.println(“性别:” + sex);}
public Student(String name, int age) {System.out.println(“姓名:” + name+ " age: " + age);}
protected Student(boolean n) { System.out.println("受保护的构造方法 n = " + n); }
private Student(int age) {System.out.println(“私有的构造方法 年龄:” + age);}
public void showage(int age) {System.out.println(“调用了private showage: age = " + age+”,sex "+this.sex); }
}
主类定义如下:
public class usestudent {
public static void main(String[] args) throws Exception {
Class cls = Class.forName(“xxxx.Student”);
Constructor con = cls.getConstructor(null);
Object obj1= con.newInstance();//输出结果:1
con = cls.getDeclaredConstructor(char.class);
2//填入语句
obj1= con.newInstance(‘男’);
Field f = cls.getField(“name”);
f.set(obj1,“zhangsan”);
System.out.println(((Student)obj1).name);
Object obj2=cls.getConstructor().newInstance();
Field f2=cls.getDeclaredField(“sex”);
f2.setAccessible(true);
3//填入语句,obj2的性别为女
Method m =cls.getDeclaredMethod(“showage”, int.class);
m.invoke(obj2, 20);//输出结果:4
}
}
正确答案:
(1) 调用了公有、无参构造方法
(2) con.setAccessible(true);
(3) f2.set(obj2, ‘女’);
(4) 调用了private showage: age = 20 ,sex 女
答案解析: -
(填空题) java项目的src文件夹下xxxx包中定义了文件property.txt,内容如下
classname=xxxx.person
person类定义如下:
package xxxx;
public class person { public String name;
public person(){
System.out.println(“调用了person()构造函数”); }
public person(String name){this.name=name;System.out.println(“person(name)”);}
public String toString(){ return “tostring method”;}
}
主类定义如下:
public class useperson {
public static void main(String[] args) throws Exception {
Properties prop = new Properties();
FileInputStream fin =new FileInputStream(“src/xxxx/property.txt”);
prop.load(fin);
String clstr=prop.getProperty(“classname”);
Class cls = Class.forName(clstr);
person p=ReflectionUtils.newInstance(cls,new Configuration());
}
}
写出程序的输出:1
正确答案:
(1) 调用了person()构造函数
public class usestudent {
public static void main(String[] args) throws Exception {
// 通过反射获取Student类的Class对象
Class cls = Class.forName("xxxx.Student");
// 获取公有无参构造方法并创建实例,输出调用了公有、无参构造方法
Constructor con = cls.getConstructor(null);
Object obj1 = con.newInstance(); // 输出结果: (1) 调用了公有、无参构造方法
// 获取私有构造方法(参数为char),设置可访问,创建实例
con = cls.getDeclaredConstructor(char.class);
con.setAccessible(true); // 填入语句 (2)
obj1 = con.newInstance('男'); // 实例化对象,输出性别:男
// 获取公有字段name并设置值为zhangsan
Field f = cls.getField("name");
f.set(obj1, "zhangsan");
System.out.println(((Student)obj1).name); // 输出zhangsan
// 创建另一个实例
Object obj2 = cls.getConstructor().newInstance();
// 获取私有字段sex,设置可访问,并设置值为女
Field f2 = cls.getDeclaredField("sex");
f2.setAccessible(true); // 填入语句 (3)
f2.set(obj2, '女'); // 设置obj2的性别为女
// 获取私有方法showage,并调用,传入参数20
Method m = cls.getDeclaredMethod("showage", int.class);
m.invoke(obj2, 20); // 输出结果: (4) 调用了private showage: age = 20 ,sex 女
}
}
答案解析:
调用了person()构造函数.使用配置文件设置要创建的类的对象,注意Property类的使用、配置文件的定义位置不同,读文件的路径不一样;另外使用的hadoop的ReflectionUtils工具类使用反射机制创建对象.
- (填空题)开放hdfs文件系统/myfile目录下所有文件和目录的读写执行权限的hdfs shell命令是__1__
正确答案:
(1) hdfs dfs -chmod -R 777 /myfile
答案解析:hdfs dfs -chmod -R 777 /myfile
或者配置hdfs-site.xml中的属性 dfs.permissions.enable 值为false - (填空题)Configuration conf=new Configuration()
1;//通过conf加载配置项目src目录中文件myconf.xml
正确答案:
(1) conf.addResource(“myconf.xml”)
Configuration conf = new Configuration();
conf.addResource(new Path("myconf.xml")); // 填入语句
答案解析:
程序读取当前机器上的配置文件,然后再运行程序中配置的内容。
加载当前运行的机器的配置文件的内容,先core-default.xml,如果src目录中有core-site.xml也会加载
然后是程序中配置的最后执行,如果有的话。后面的配置会覆盖之前的配置
可以通过addResource()方法加载指定的配置文件,一般把配置文件放在项目的src路径下,比如配置hdfs-site.xml yarn-site.xml等
- (填空题)配置文件conf.xml
正确答案:
(1) property
(2) /configuration
(3) str3
答案解析:property;/configuration;知道配置文件格式;由于getString中属性名str找不到,给value赋值为默认的值str3
在Hadoop的配置文件中,通常使用 <property>
标签来定义配置项,每个 <property>
包含一个 <name>
和一个 <value>
。结束标签应该是 </property>
。整个配置文件被 <configuration>
和 </configuration>
标签包围。
如果配置文件 conf.xml 中没有名为 “str” 的项,或者其值为空,那么 value 将会是 “str3”。
- (填空题)以下程序实现了hdfs系统hdfs://master:9000/中/mydirs/file1.txt文件的读写功能
public class readandwritehfsfile {
public static void main(String[] args) throws Exception {
Configuration conf=new Configuration();
FileSystem fs = FileSystem.get( 1);
Path file= new Path(2);
FSDataOutputStream fout = fs.create(file,true);
fout.write(“你好,hadoop!”.getBytes(“utf-8”));
fout.flush();
fout.close();
FSDataInputStream fin2 = fs.open(file);
int len=fin.available();
byte[] c=new byte[len];
3 System.out.println(new String(c, “utf-8”));
fin2.close();
fs.close();}
}
正确答案:
(1) new URI(“hdfs://master:9000/”)
(2) “/mydirs/file1.txt”
(3) fin2.read©
public class ReadAndWriteHDFSFile {
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(new URI("hdfs://master:9000/"), conf);
Path file = new Path("/mydirs/file1.txt");
FSDataOutputStream fout = fs.create(file, true);
fout.write("你好,hadoop!".getBytes("utf-8"));
fout.flush();
fout.close();
FSDataInputStream fin2 = fs.open(file);
int len = fin2.available();
byte[] c = new byte[len];
fin2.read(c);
System.out.println(new String(c, "utf-8"));
fin2.close();
fs.close();
}
}
答案解析:
new URI(“hdfs://master:9000/”) 是HDFS文件系统的URI。
“/mydirs/file1.txt” 是要操作的文件路径。
fin2.read(c)
是从文件中读取数据到字节数组c。
- (填空题)java项目的src文件夹下xxxx包中定义了文件property.txt,内容如下
classname=xxxx.person
person类定义如下:
package xxxx;
public class person { public String name;
public person(){
System.out.println(“调用了person()构造函数”); }
public person(String name){this.name=name;System.out.println(“person(name)”);}
public String toString(){ return “tostring method”;}
}
主类定义如下:
public class useperson {
public static void main(String[] args) throws Exception {
Properties prop = new Properties();
FileInputStream fin =new FileInputStream(“src/xxxx/property.txt”);
prop.load(fin);
String clstr=prop.getProperty(“classname”);
Class cls = Class.forName(clstr);
person p=ReflectionUtils.newInstance(cls,new Configuration());
}
}
写出程序的输出:1
正确答案:
(1) 调用了person()构造函数
答案解析:
调用了person()构造函数.
使用配置文件设置要创建的类的对象,注意Property类的使用、配置文件的定义位置不同,读文件的路径不一样;另外使用的hadoop的ReflectionUtils工具类使用反射机制创建对象
四. 判断题
- (判断题)压缩比越大,压缩速率越小
• A. 对
• B. 错
正确答案: 对
- (判断题) hadoop就是云计算技术
• A. 对
• B. 错
正确答案: 错
答案解析:错误。hadoop是一种具体实现,体现了云计算体系中的一部分技术
- (判断题)NameNode 是一个中心服务器( mater ),负责管理文件系统的命名空间( NameSpace )及客户端对文件的访问。DataNode负责存储数据和执行计算任务。定期向namenode发送所存储块的列表信息
A. 对
B. 错
正确答案: 对
答案解析:
- (判断题)文件块的存储位置也被持久存储在namenode的元数据中。
A. 对
B. 错
正确答案: 错
答案解析:不存储位置信息,在系统启动时,由datanode向namenode报告
- (判断题)因为小文件造成block数量过多,block元信息大量占用namenode的内存,因此hadoop不适合处理大量的小文件
A. 对
B. 错
正确答案: 对
复习三
一. 单选题
- (单选题)1GB=( )B 2^n表示2的n次幂
A. 2^10
B. 2^40
C. 2^30
D. 2^50
正确答案: C: 2^30 ;
答案解析:
2^10=1K
2^20=1M
2^30=1G
2^40=1T
2^50=1P 掌握常用数量单位
- (单选题)MapReduce计算框架中,输入格式默认是TextInputFormat,则map函数的输入的key value类型分别是( )
A. LongWritable Text
B. long string
C. Text Text
D. LongWrtiable IntWritable
正确答案: A:LongWritable Text;
答案解析:
LongWritable Text是TextInputFormat默认的key value类型
- (单选题)HDFS中不会被持久存储的信息是( )
A. 文件名
B. 目录名
C. 文件的分块信息
D. 块的存储位置
正确答案: D: 块的存储位置;
答案解析:
块存储位置不持久存储,每次在集群启动时由datanode向namenode报告生成,安全模式阶段完成
- (单选题)按照默认配置,文件大小为150M,则该文件会被分为( )片
A. 4
B. 3
C. 2
D. 1
正确答案: C:2;
答案解析:
文件大小/128M>1.1被分片,150/128>1.1分为2片
- (单选题)按照默认配置,文件大小为128.5M,则该文件会被分为( )片(易错)
A. 1
B. 2
C. 3
D. 4
正确答案: A:1;
答案解析:
文件大小/128M>1.1会被分片,否则作为一片,本题128.5/128<1.1
- (单选题)以下类中哪一个可以实现程序从文件中读取数据
A. inputStream
B. FileInputStream
C. FileOutputStream
D. DataOutput
正确答案: B:FileInputStream;
答案解析:
输入流,从文件读取FileInputStream
- (单选题)压缩速度由大到小 snappy、LZO、gzip、bzip2,压缩比最大的是
A. snappy
B. LZO
C. gzip
D. zip2
正确答案: D:zip2;
答案解析:
压缩比越大 压缩速度越慢
- (单选题)reduce阶段收到的key类型为Text,则map阶段相关设置正确的是
A. job.setMapOutputKeyClass(Text.class);
B. job.setOutputKeyClass(Text.class);
C. job.setOutputKeyClass(Text);
D. job.setMapOutputValueClass(Text);
正确答案: A:job.setMapOutputKeyClass(Text.class);;
答案解析:
map的输出端与key的输入端类型一致