Hadoop环境搭建及使用(超详细)
伪分布式linux搭建
电脑性能有限,只搭建两台Linux虚拟机,其他的操作一样
设置网络IP和虚拟机网关
本机物理网卡VMnet8和VMware虚拟里网卡设置要在同一网段。
克隆两个Linux,如果不会自行百度,接下来是克隆之后的配置
注意:每台linux都需要修改
第一步需要修改主机名
vim打开主机名配置文件,主机名为E1
// vim进入主机配置文件,修改和克隆虚拟机时一样的名字
vim /etc/sysconfig/network
第二步配置本机HOST映射
// 本地域名文件
vim /etc/hosts
本地域名也要映射,映射所有集群
第三步需要修改网卡信息
// vim进入网卡配置文件,需要删除eth0,再把下面的eth1改为eth0
vim /etc/udev/rules.d/70-persistent-net.rules
第四步需要配置IP
// vim进入IP配置文件,这里需要写本机IP,子网掩码,和网关ip
vim /etc/sysconfig/network-scripts/ifcfg-eth0
这里很容易出错配置,要注意,修改BOOTPROTO为static这样IP就不会变,IPADDR设置你给主机的IP,和其他机器不要重复,GATEWAY为网关IP,DNS随便,ONBOOT为yes,其他的可以删除不需要
以上配置完成输入启动指令
// 服务重启
service network restart
关闭防火墙并开机不启动,每一个机器都要执行
// 关闭防火墙
service iptables stop
//开机不启动
chkconfig iptables off
环境配置
需要JDK和HADOOP压缩包传输到其中一台Linux作为集群主机,配置好所有文件用SSH工具包中scp拷贝到其他Linux。
SSH->scp指令配置
// 直接输入指令行,下载工具包
yum install openssh-clients
// SSH免密登录,疯狂Enter
ssh-keygen
// 选择免密IP,之后输入密码
ssh-copy-id E2
JDK和hadoop环境变量配置,当然之前要传输JDK和HADOOP到linux其中一台
// 修改profile文件
vim /etc/profile
JDK使用scp指令传输到其他linux
// 远程传输到E2,路径最好一样,防止以后麻烦
scp -r /root/apps/jdk1.8.0_141 E2:/root/apps/
// 把环境变量文件传输到其他机器
scp -r /etc/profile E2:/etc/profile
注意:修改要生效,重启也可以
// 执行修改,每台集群都需要
source /etc/profile
HADOOP文件配置(核心)
配置hadoop环境变量
// 修改环境变量java,修改hadoop-env.sh文件
vim /root/apps/hadoop-2.8.5/etc/hadoop/hadoop-env.sh
修改JAVA_HOME参数为本机JDK路径
配置core-site.xml
详细配置看hadoop官网文档
// 修改core-site.xml
vim /root/apps/hadoop-2.8.5/etc/hadoop/core-site.xml
//默认集群主机配置 namenode位置
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://E1:9000</value>
</property>
</configuration>
配置hdfs-site.xml
hdfs集群配置都在这个文件
// 修改hdfs-site.xml
vim /root/apps/hadoop-2.8.5/etc/hadoop/hdfs-site.xml
<configuration>
//namenode文件存储路径,只对主机有效
<property>
<name>dfs.namenode.name.dir</name>
<value>/root/hdpdata/name/</value>
</property>
//datanode文件存储路径
<property>
<name>dfs.datanode.data.dir</name>
<value>/root/hdpdata/data</value>
</property>
//secondary namenode主机配置,辅助namenode一些任务,最好不要和namenode在一台机器
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>E2:50090</value>
</property>
</configuration>
接下来把配置好的HADOOP拷贝到其他Linux集群
scp -r /root/apps/hadoop-2.8.5 E2:/root/apps/
启动hadoop集群
修改slaves文件启动脚本使用
//输入集群域名
vim /root/apps/hadoop-2.8.5/etc/hadoop/slaves
先要初始化namenode(很容易忘记的操作)
//在namenode主机上
hadoop namenode -format
Hadoop中hdfs启动方式
//启动namenode
hadoop-daemon.sh start namenode
//启动datanode
hadoop-daemon.sh start datanode
更方便的如下
全部集群
//启动全部hdfs
start-dfs.sh
//停止全部hdfs
stop-dfs.sh
启动Yarn平台
配置yarn-stie.xml
vim /root/apps/hadoop-2.8.5/etc/hadoop/yarn-site.xml
<configuration>
//resourcemanager主机配置
<!-- Site specific YARN configuration properties -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>E1</value>
</property>
//nodemanager内存配置,默认配置分析物理内存自动分配,建议不能低于2G
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>2048</value>
</property>
//nodemanager CPU核数配置
<property>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>2</value>
</property>
//shuffle配置
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
复制yarn-stie.xml到集群
scp -r /root/apps/hadoop-2.8.5/etc/hadoop/yarn-site.xml E2:/root/apps/hadoop-2.8.5/etc/hadoop/
启动Yarn
在resourcemanager上启动
start-yarn.sh
Hadoop集群启动方式(最方便)
start-all.sh
Job客户端代码,仅供参考
public class JobCilent {
public static void main(String[] args) throws Exception {
//设置JVM系统参数,用于给job对象获取访问hdfs的用户身份
System.setProperty("HADOOP_USER_NAME", "root");
Configuration conf = new Configuration();
//1.设置Job默认访问的文件系统
conf.set("fs.defaultFS", "hdfs://192.168.174.10:9000");
//2.设置Job提交地方 1.客户端 2.Yarn平台
conf.set("mapreduce.framework.name", "yarn");
conf.set("yarn.resourcemanager.hostname", "192.168.174.10");
//3.如果windows运行这个job,则需要加这个跨平台提交的参数
conf.set("mapreduce.app-submission.cross-platform", "true");
Job job = Job.getInstance(conf);
//1.封装参数:jar包位置
//job.setJarByClass(JobCilent.class);
job.setJar("d://JOB/job1.jar");
//2.封装 调用的实现类
job.setMapperClass(MapTask.class);
job.setReducerClass(ReduceMapper.class);
//3.job实现类产生的类型值
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(IntWritable.class);
//Reduce(K,V)
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
//4.本次job要处理的输入文件路径HDFS
FileInputFormat.setInputPaths(job,new Path("/wordcount/input"));
//5.结果输出路径hdfs,如果路径已存在会报错
Path path = new Path("/wordcount/output1");
FileSystem fileSystem = FileSystem.get(new URI("hdfs://192.168.174.10:9000"), conf, "root");
if(fileSystem.exists(path)){
fileSystem.delete(path, true);
}
FileOutputFormat.setOutputPath(job, path);
//6.设置reducetask启动数量,maptask是hadoop默认设置
job.setNumReduceTasks(1);
//7.提交job到yarn
//job.submit(); 无返回值
boolean res = job.waitForCompletion(true);
System.exit(res?0:-1);
}
}