Hadoop与MapReduce的框架实践
前言:
最近想要撸一些关于hadoop框架的代码,首先在自己的mac上安装一下这个框架用来本地测试
Hadoop 的安装
首先需要下载Hadoop最新的安装包,可以直接前往www.apache.org/dyn/closer.… 下载,也可以在mirrors.bfsu.edu.cn/apache/hado… 镜像站中下载,更推荐镜像站,Apache官方下载的速度太慢了。 下载下来以后,在自己的文件夹下打开并且解压。
配置ssh
开启mac远程登录功能,且将当前用户加入允许的用户列表中,避免以后需要多次输入密码
ssh-keygen -t rsa
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
# 验证ssh
ssh localhost
配置环境变量
vim ~/.bash_profile
# hadoop
export HADOOP_HOME=/Users/xxx/App/hadoop-2.7.3
export HADOOP_INSTALL=$HADOOP_HOME
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib"
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin
退出以后运行:
source ~/.bash_profile
使用命令查看是否配置成功:
然后开始配置一大批的文件:
hadoop-env.sh :
添加配置
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_261.jdk/Contents/Home
core-site.xml
添加配置在两个<configuration>中间
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
<!--用来指定hadoop运行时产生文件的存放目录 自己创建-->
<property>
<name>hadoop.tmp.dir</name>
<value>file:/Users/xuejiameng/Documents/data/tmp</value>
</property>
<property>
<name>fs.trash.interval</name>
<value>1440</value>
</property>
hdfs-site.xml
添加配置:
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<!--不是root用户也可以写文件到hdfs-->
<property>
<name>dfs.permissions</name>
<value>false</value> <!--关闭防火墙-->
</property>
<!-- name node 存放 name table 的目录 -->
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/Users/xuejiameng/Documents/data/tmp/dfs/name</value>
</property>
<!-- data node 存放数据 block 的目录 -->
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/Users/xuejiameng/Documents/data/tmp/dfs/data</value>
</property>
mapred-site.xml
添加配置:
<property>
<!--指定mapreduce运行在yarn上-->
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
yarn-site.xml
添加配置
<!-- Site specific YARN configuration properties -->
<property>
<!-- mapreduce 执行 shuffle 时获取数据的方式 -->
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>localhost:18040</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>localhost:18030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>localhost:18025</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>localhost:18141</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>localhost:18088</value>
</property>
以上所以的配置都配置好了 在终端执行先执行命令 hadoop namenode -format 让hadoop格式化, 这个命令只执行一遍, 执行成功好, 重复执行导致namespaceID不一致,出现问题, 这个时候我们需要 删掉 hadoop文件下的temp和tmp文件夹, 重新执行命令格式化
输入
hadoop namenode -format
./start-all.sh
然后查看jps运行结果:
访问地址http://localhost:9870 和http://localhost:18088
启动成功。
第一个mapReduce 程序 wordcount
在目录里面新建文件夹,然后随便写两个test
cd $HADOOP_HOME
mkdir test
echo Hello World >> test/test1.txt
echo Hello Hadoop >> test/test2.txt
在hdfs上创建输入文件夹
hadoop fs -mkdir /input
上传本地test目录中的文件到HDFS的input目录下
hadoop fs -put test/* /input
然后跑例子里的程序
cd $HADOOP_HOME/share/hadoop/mapreduce
hadoop jar hadoop-mapreduce-examples-3.2.3.jar wordcount /input /output
查看HDFS的output路径下的文件信息。
hadoop fs -ls /output
查看结果信息
hadoop fs -cat /output/part-r-00000
将Hadoop运行结果输出到本地文件系统:
hadoop fs -get /output/* $HADOOP_HOME/test
遇到的问题:
- 启动的时候application状态问题
本机node节点的磁盘使用率超过90%导致不健康,解决办法就是把本机磁盘清理一下,留出给hadoop足够使用的空间
- 跑job running就卡住
任务一直卡在mapreduce.Job: Running job这个位置 在yarn-site.xml下面添加
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>20480</value>
</property>
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>2048</value>
</property>
<property>
<name>yarn.nodemanager.vmem-pmem-ratio</name>
<value>2.1</value>
</property>
- 找不到或无法加载主类 org.apache.hadoop.mapreduce.v2.app.MRAppMaster 在命令行输入:hadoop classpath
把上述输出的值添加到yarn-site.xml文件对应的属性 <name>yarn.application.classpath</name>
如下:
<property>
<name>yarn.application.classpath</name>
<value>/Users/xuejiameng/Documents/software/hadoop-3.2.3/etc/hadoop:/Users/xuejiameng/Documents/software/hadoop-3.2.3/share/hadoop/common/lib/*:/Users/xuejiameng/Documents/software/hadoop-3.2.3/share/hadoop/common/*:/Users/xuejiameng/Documents/software/hadoop-3.2.3/share/hadoop/hdfs:/Users/xuejiameng/Documents/software/hadoop-3.2.3/share/hadoop/hdfs/lib/*:/Users/xuejiameng/Documents/software/hadoop-3.2.3/share/hadoop/hdfs/*:/Users/xuejiameng/Documents/software/hadoop-3.2.3/share/hadoop/mapreduce/lib/*:/Users/xuejiameng/Documents/software/hadoop-3.2.3/share/hadoop/mapreduce/*:/Users/xuejiameng/Documents/software/hadoop-3.2.3/share/hadoop/yarn:/Users/xuejiameng/Documents/software/hadoop-3.2.3/share/hadoop/yarn/lib/*:/Users/xuejiameng/Documents/software/hadoop-3.2.3/share/hadoop/yarn/*</value>
</property>