一、hadoop发展由来、历史、子项目
什么是hadoop
Google Lab 开发的 Map/Reduce 和 Google File System(GFS) ,后由
apache基金会进行封装为MapReduce和HDFS组成
Hadoop的框架最核心的设计就是:HDFS和MapReduce。
HDFS为海量的数据提供了存储,
而MapReduce则为海量的数据提供了计算。
二、讲解HDFS(namenode和datanode),实现机制和优点
三、讲解MapReduce离线计算、Storm(流式计算,基于磁盘)、Spark(内存迭代计算,基于内存)
四、安装一台linux系统,版本为CentOS7
设置网卡在 /etc/sysconfig/network-scripts/ifcfg-enp0s3
ONBOOT=yes
虚拟机网络设置为桥接网络 选择对应联网方式
通过 ping www.baidu.com 来测试是否有网络
yum install net-tools
安装jdk1.8 并配置环境变量
https://www.cnblogs.com/Dylansuns/p/6974272.html
五、宿主机和虚拟机可以相互ping通,并在虚拟机设置静态IP
BOOTPROTO=static
DNS1=192.168.1.1
IPADDR=192.168.1.120
NETMASK=255.255.255.0
GATWAY=192.168.1.1
ZONE=public
六、创建用户,并赋权限
useradd user1 添加用户
passwd user1 设置密码
chown -R user:group 授权目录 例如:chown -R hadoop:hadoop /home
// userdel –r user3 删除用户及目录
七、SSH免密登录
切换到hadoop用户下操作
ssh-keygen -t rsa
一路回车
ll -a
进入 ~/.ssh文件夹下
touch authorized_keys
cat id_rsa.pub >authorized_keys
chmod 600 authorized_keys
测试ssh hadoop-01机器名 IP地址
设置host:root用户下 vi /etc/hosts
添加内容:ip地址 名称
查看防火墙状态
service iptables status
关闭防火墙
service iptables stop
查看防火墙开机启动状态
chkconfig iptables --list
关闭防火墙开机启动
chkconfig iptables off
关闭防火墙
systemctl stop firewalld
重启linux系统
八、下载hadoop3.2.0
https://www.apache.org/dyn/closer.cgi/hadoop/common/hadoop-3.2.0/hadoop-3.2.0.tar.gz
http://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/hadoop-3.2.0/hadoop-3.2.0.tar.gz
九、将hadoop包上传至 /home/software
下载前进入 /home/software
wget http://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/hadoop-3.2.0/hadoop-3.2.0.tar.gz
tar -zxvf hadoop..... -C 路径
yum -y install wget
10、解压至/home/app
tar -zxvf hadoop3.2.0 -C /home/app/
11、进入hadoop3.2.0/etc/hadoop
12、修改配置文件
1)core-site.xml:
fs.defaultFS
hdfs://hadoop-01:9000
hadoop.tmp.dir
/home/app/hadoop-3.2.0/tmp/
2)hdfs-site.xml:
dfs.replication
1
3)mapred-site.xml:
mapreduce.framework.name
yarn
4)yarn-site.xml:
<!-- Site specific YARN configuration properties -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop-01</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 进入hadoop中bin目录执行./hadoop classpath命令查看hadoop路径 -->
<property>
<name>yarn.application.classpath</name>
<value>/home/app/hadoop-3.2.0/etc/hadoop:/home/app/hadoop-3.2.0/share/hadoop/common/lib/*:/home/app/hadoop-3.2.0/share/hadoop/common/*:/home/app/hadoop-3.2.0/share/hadoop/hdfs:/home/app/hadoop-3.2.0/share/hadoop/hdfs/lib/*:/home/app/hadoop-3.2.0/share/hadoop/hdfs/*:/home/app/hadoop-3.2.0/share/hadoop/mapreduce/lib/*:/home/app/hadoop-3.2.0/share/hadoop/mapreduce/*:/home/app/hadoop-3.2.0/share/hadoop/yarn:/home/app/hadoop-3.2.0/share/hadoop/yarn/lib/*:/home/app/hadoop-3.2.0/share/hadoop/yarn/*</value>
</property>
</configuration>
13、配置hadoop环境变量 切换到root用户 vi /etc/profile source /etc/profile 使文件生效
export HADOOP_HOME=/home/app/hadoop-3.2.0
export JAVA_HOME=/home/app/jdk1.8.0_201
export JRE_HOME=
J
A
V
A
H
O
M
E
/
j
r
e
e
x
p
o
r
t
C
L
A
S
S
P
A
T
H
=
.
:
{JAVA_HOME}/jre export CLASSPATH=.:
JAVAHOME/jreexportCLASSPATH=.:{JAVA_HOME}/lib:
J
R
E
H
O
M
E
/
l
i
b
e
x
p
o
r
t
P
A
T
H
=
{JRE_HOME}/lib export PATH=
JREHOME/libexportPATH={JAVA_HOME}/bin:
H
A
D
O
O
P
H
O
M
E
/
s
b
i
n
:
{HADOOP_HOME}/sbin:
HADOOPHOME/sbin:{HADOOP_HOME}/bin:$PATH
14、格式化namenode
hadoop namenode -format
15、启动hdfs: 在hadoop/sbin目录下
./start-dfs.sh
vi hadoop-env.sh
添加java home路径:export JAVA_HOME=jdk路径
jps查看启动项
16、启动yarn:start-yarn.sh
查看进程
jps netstat -nltp
17、hdfs操作
查看目录文件:hadoop fs -ls /
存放文件:hadoop fs -put 文件 /目录
获取文件:hadoop fs -get /文件名 /目录
tmp/dfs/data/current/BP.../current/finalized/sub..0/sub...0
文件大小默认为字节 b--》k-->m-->g-->t-->p 1024
18、进入cd share/hadoop/mapreduce/
创建一个测试文件后缀为.data
19、在hdfs上创建文件
hadoop fs -mkdir /wc
hadoop fs -mkdir /wc/srcdata
20、将测试文件上传到srcdata目录
hadoop fs -put test.data /wc/srcdata
查看 hadoop fs -ls /wc/srcdata
21、执行MapReduce中wordcount算法:
hadoop jar hadoop-mapreduce-examples-3.2.0.jar wordcount /wc/srcdata /wc/output
22、查看结果
hadoop fs -cat /wc/output/part-r-00000
23、通过浏览器可以访问hdfs文件系统
需要先开放namenode节点9870端口号
访问网址为:http://linux系统IP地址:9870
点击Utilities ---- Browse the file system
24、开放linux防火墙端口,hadoop3.x以上namenode web 端口改为9870 原端口号为50070
firewall-cmd --zone=public --add-port=9870/tcp --permanent
改完需要reload firewall-cmd --reload
25、退出安全模式
hadoop dfsadmin -safemode leave
26、
查看防火墙状态
service iptables status
关闭防火墙
service iptables stop
查看防火墙开机启动状态
chkconfig iptables --list
关闭防火墙开机启动
chkconfig iptables off
关闭防火墙
systemctl stop firewalld
# service firewalld start; 或者 #systemctl start firewalld.service;#开启防火墙
# service firewalld stop; 或者 #systemctl stop firewalld.service;#关闭防火墙
# service firewalld restart; 或者 #systemctl restart firewalld.service; #重启防火墙
# systemctl disable firewalld.service#禁止防火墙开启自启
# systemctl enable firewalld.service#开启防火墙开启自启
27、java api操作hdfs
1) 导入jar包
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>3.2.0</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>3.2.0</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs-client</artifactId>
<version>3.2.0</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-mapreduce-client-core</artifactId>
<version>3.2.0</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
2) 操作对象
//通过configuration对象来配置文件系统
private static Configuration config = null;
//文件操作系统对象
private static FileSystem fs = null;
//操作hdfs的用户
private static final String HDFS_USER = "hadoop";
//hdfs服务地址 ip或机器名加端口号
private static final String HDFS_URL = "hdfs://192.168.1.124:9000";
//获取配置参数configuration对象,此对象会对xxx-site.xml文件进行解析
config = new Configuration();
//设置服务器操作地址
config.set("fs.defaultFS", HDFS_URL);
//获取一个HDFS文件系统客户端实例化对象
//产生的实例究竟是哪一个文件系统的客户端,是根据conf相关参数来决定的
fs = FileSystem.get(new URI(HDFS_URL), config, HDFS_USER);
3) 操作方法
//上传文件
fs.copyFromLocalFile(new Path("D:\\hadoop-test-file\\aaa.data"), new Path("/1806A/1806A.txt"));
//删除
.delete(new Path("/aaa"), true);
//创建文件夹
.mkdirs(new Path("/111/2222/aaa"));
//重命名
.rename(new Path("/123"), new Path("/321"));
//下载
.copyToLocalFile(new Path("/1806A/1806A.txt"), new Path("d:/"));
//遍历文件
RemoteIterator<LocatedFileStatus> listFiles = HdfsClient.getHadoopFileSystem()
.listFiles(new Path("/"), true);
while (listFiles.hasNext()){
LocatedFileStatus file = listFiles.next();
System.out.println(file.getPath().getName());
}
//遍历文件夹和文件
FileStatus[] fileArr = HdfsClient.getHadoopFileSystem()
.listStatus(new Path("/wc/output"));
for(FileStatus file : fileArr){
System.out.println(file.getPath().getName() + "--" + (file.isDirectory() ? "dir" : "file"));
}
//io流方式上传文件
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
String dateStr = sdf.format(new Date()).toString();
String filename = System.currentTimeMillis() + ".txt";
FSDataOutputStream fos = null;
FileInputStream fis = null;
try {
// 文件保存在服务器上地址
fos = HdfsClient.getHdfsFileSystem()
.create(new Path("/jk/" + dateStr + "/" + filename));
// 用户上传的文件
fis = new FileInputStream(new File("D:\\hadoop-test-file\\1810B.txt"));
IOUtils.copyBytes(fis, fos, 4096, false);
} catch (IOException e) {
e.printStackTrace();
} finally {
IOUtils.closeStream(fis);
IOUtils.closeStream(fos);
}
//io流方式从hdfs上下载文件
FSDataInputStream inputStream = null;
try {
inputStream = HdfsClient.getHdfsFileSystem()
.open(new Path("/jk/1810b/1810B.txt"));
IOUtils.copyBytes(inputStream, System.out, 4096, false);
} catch (IOException e) {
e.printStackTrace();
} finally {
IOUtils.closeStream(inputStream);
}
28、javaAPI自定义MapReduce程序
1) 新建Map测试类继承Mapper<LongWritable, Text, Text, LongWritable>
2) 重写map方法
// 获取文件内容
String content = value.toString();
// 将内容按空格分隔存入map集合当中
String[] contentArr = StringUtils.split(content, ' ');
for (String word : contentArr) {
// 将map集合写入reduce中
context.write(new Text(word), new LongWritable(1));
}
3) 新建Reduce类继承Reducer<Text, LongWritable, Text, LongWritable>
4) 重写reduce方法
// 遍历map的value
Iterator<LongWritable> iterator = values.iterator();
// 定义计数器
Long count = new Long(0);
// 循环value值
while (iterator.hasNext()) {
// 获取value值
LongWritable longWritable = iterator.next();
// 相同的key进行累加操作
count += longWritable.get();
}
context.write(key, new LongWritable(count));
5) 编写启动类
Configuration config = new Configuration();
Job job = Job.getInstance(config);
// 设置启动类
job.setJarByClass(MapReduceRunner.class);
// 设置Map类
job.setMapperClass(MapTest.class);
// 设置Reduce类
job.setReducerClass(ReduceTest.class);
// 设置输出的key也就是统计的关键词
job.setOutputKeyClass(Text.class);
// 设置输出的value也就是统计关键词的数量
job.setOutputValueClass(LongWritable.class);
// 设置MapReduce计算的文件
FileInputFormat.setInputPaths(job, "/jk/1810b/1810B.txt");
// 设置MapReduce计算完后的文件输出文件
// 注意:输出的目录不要存在
FileOutputFormat.setOutputPath(job, new Path("/jk/output"));
job.waitForCompletion(true);
6) 将启动类打jar包,上传到服务器
执行命令:hadoop jar jar包名 包路径.启动类名