当前位置: 首页 > Linux

hadoop配置和wordcount

时间:2023-04-06 18:22:17 Linux

hadoop配置和wordcount参考博客大多基于hadoop2.x及java的低版本。配置过程写出来好像很简单。看别人的博客感觉步骤差不多,但是自己配置的时候出现了很多问题:datanode无法启动,网页无法正常显示,datanode莫名死机,resourcemanager无法启动,nodemanager无法启动,mapreduce进程无法连接到slave等。这个过程花了很多时间看博客和日志才搞定,所以记录一下。我在虚拟机中安装了四个linux系统作为节点,需要的环境是一样的,所以我这里先配置一个,然后用虚拟机自带的功能直接复制另外三个。环境:Macos、ParallelsDesktopLinux16.04Jdk1.8.0Hadoop3.2.0Java环境配置从oracle官网下载最新的jdk压缩文件,复制到安装目标目录下解压:sudotar-zxvfjdk-12_linux-x64_bin.tar.gzsudormjdk-12_linux-x64_bin.tar.gz并配置环境变量。可以写在~/.bashrc或/etc/profile中,其中~/.bashrc在用户的主目录下,只对当前用户生效,/etc/profile是所有用户的环境变量。vim/etc/profile在末尾添加jdk环境变量JAVA_HOME=/usr/lib/jdk-12CLASSPATH=.:$JAVA_HOME/lib.tools.jarPATH=$JAVA_HOME/bin:$PATHexportJAVA_HOMECLASSPATHPATH然后source/etc/profile生效,java--version检查配置是否正确。后面启动resourcemanager时出现问题,换成jdk8,过程同上。ssh免密钥连接之后是hadoop的安装。该过程放在下一部分。安装完成后,复制生成三个环境相同的虚拟机。我用的是parallels,比其他的更稳定好用。然后是分布式部分。纯粹的分销很难实现。Hadoop仍然使用一个master来集中管理数据节点。master不存储数据,而是将数据存储在datanodes中。在这里,它们被命名为slave1、slave2和slave3。datanode,网络连接是桥接的。因此,master需要能够免密登录slave。添加节点的ip地址(为了不在ip变化时重新配置,可以配置静态ip):vim/etc/hosts192.168.31.26master192.168.31.136slave1192.168.31.47slave2192.168.31.122slave3vim/etc/hostnamemaster#配置slave1,slave2,slave3pingslave1#测试并安装ssh,这个在ubuntu官方源里很慢,我尝试切换到国内的清华源和阿里云源,但是没有其中一个,或者它可能是不同的版本或其他东西。如果你懒得管它,就耐心等待吧。sudoapt-getinstallssh然后生成公钥和私钥:ssh-keygen-trsa这里默认路径是用户家目录下的.ssh,一路回车即可。使每台主机无需密钥即可连接自身:cp.id_rsa.pubauthorized_keys然后,为了使主机无需密钥即可连接到从机,将主机的公钥附加到每个从机的authorized_keys。然后测试是否可以正常连接:sshslave1安装配置hadoop从官网下载hadoop3.2,解压到/usr/lib/。并赋予hadoop用户读权限cd/usr/libsudotar–xzvfhadoop-3.2.0.tar.gzchown–Rhadoop:hadoophadoop#将hadoop文件夹的读权限赋予hadoop普通用户sudorm-rfhadoop-3.2.0.tar.gz添加环境变量:HADOOP_HOME=/usr/lib/hadoop-3.2.0PATH=$HADOOP_HOME/bin:$PATHexportHADOOP_HOMEPATH接下来是配置hadoop最重要的部分,配置HADOOP_HOME/etc/hadoop/下分别有如下文件:hadoop-env.shexportJAVA_HOME=/usr/lib/jdk1.8.0_201core-site.xmlhadoop.tmp.dir/usr/lib/hadoop-3.2.0/tmp其他临时目录的基础。fs.defaultFShdfs://master:9000hdfs-site.xmldfs.replication3<属性>dfs.name.dir/usr/lib/hadoop-3.2.0/hdfs/namedfs.data.dir/usr/lib/hadoop-3.2.0/hdfs/datayarn-site.xmlyarn.resourcemanager.addressmaster:8032yarn.resourcemanager.scheduler.addressmaster:8030yarn.resourcemanager.resource-tracker.addressmaster:8031yarn.resourcemanager.admin.address<值>master:8033yarn.resourcemanager.webapp.addressmaster:8088yarn.nodemanager.aux-servicesmapreduce_shuffleyarn.nodemanager.aux-services.mapreduce.shuffle.classorg.apache.hadoop.mapred.ShuffleHandlermapred-site.xmlmapreduce.framework.nameyarnmapred.job.trackermaster:49001mapred.local.dir/usr/lib/hadoop-3.2.0/varyarn.app.mapreduce.am.envHADOOP_MAPRED_HOME=$HADOOP_HOMEmapreduce.map.envHADOOP_MAPRED_HOME=$HADOOP_HOMEmapreduce.reduce.envHADOOP_MAPRED_HOME=$HADOOP_HOMEworkersslave1slave2slave3配置完成,然后将整个文件夹复制到其他三台主机,完成启动格式namenodehdfsnamenode-format#前提是环境变量中已经添加了HADOOP_HOME。如果看到上面的INFO,这一步就成功了。然后运行启动脚本:./sbin/start-all.sh#将hadoop2.x版本放在./bin/下,用jps查看Java进程,master应该包含NameNode,SecondaryNameNode,ResourceManager,slave应该包括DataNode、NodeManager。这里常见的问题有没有datanodes,没有访问权限,resoucemanager无法启动等,下面我写了一些原因,大部分都是配置问题,大家可以通过查看日志文件找到原因。可以在网页上通过master:9870查看集群状态。WordCount示例程序wordcount可以说是hadoop学习过程中的“helloworld”。可以在网上找源码,也可以自己写。我这里直接使用官方的$HADOOP_HOME/share/hadoop/mapreduce/示例程序。首先,将输入文件传输到dfs。这里我写了两个txt文件,里面有“hadoop”、“hello”、“world”这几个词。然后运行示例程序:hdfsdfs-mkdir/inhdfsdfs-put~/Desktop/file*.txt/inhadoopjarshare/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.0.jarwordcount/in/out即可看到这里要mapreduce分为map和reduce过程。Mapreduce分为map、shuffle、reduce三个过程。首先将大任务分配给各个节点进行计算,然后shuffle按照一定的规则将不同的key值分配给不同的节点进行融合,然后提交任务再reduce进行融合。查看结果:hdfsdfs-cat/out/part-r-00000才说Hadoop集群环境安装正确。接下来就是修改wordcount代码自己玩了,上手之后自己写就可以了。遇到的一些问题在复制配置的文件夹时不小心复制错了文件夹,复制了之前配置失败时使用的文件夹,导致datanode一直无法启动,但是全程没有任何提示。谷歌了半天也解决不了。后来看datanode的日志文件,发现不对的地方。这是core-site.xml的问题。修改后重新格式化,启动成功。这个悲伤的故事告诉我们,如果出现问题,首先要查看日志文件来定位错误。每个人的错误都是千奇百怪的,谷歌也不是万能的。没有resourcemanager和nodemanager:查看日志发现原因是classNoFound(javax.XXXXXXX)。发现由于java9以上的一些限制,javaxAPI默认是禁用的。参考博客有两种解决方法:在yarn-env.sh中添加(但是我试了,不行,因为我不会java,所以放弃研究了)exportYARN_RESOURCEMANAGER_OPTS="--add-modules=ALL-SYSTEM"exportYARN_NODEMANAGER_OPTS="--add-modules=ALL-SYSTEM"替换为jdk8第一次运行wordcount程序时,整个$HADOOP_HOME/etc/hadoop文件夹会被完全通过作为输入,结果是错误的。根据日志发现内存不足。我的每个虚拟机只开了1G内存。可见这样的配置只能作为对Hadoop分布式环境的熟悉,并不能满足能够解决问题的条件。