-
Hadoop使用学习笔记(4)
2016-08-03 15:31:19Hadoop使用学习笔记2. 基本Map-Reduce工作配置与原理(下)之前的任务: 用新的API如下:package com.hash.test.hadoop.mapred;import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.conf....Hadoop使用学习笔记
2. 基本Map-Reduce工作配置与原理(下)
之前的任务:
用新的API如下:
package com.hash.test.hadoop.mapred; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.conf.Configured; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Job; import org.apache.hadoop.mapreduce.Mapper; import org.apache.hadoop.mapreduce.Reducer; import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; import org.apache.hadoop.mapreduce.lib.input.TextInputFormat; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat; import org.apache.hadoop.util.Tool; import org.apache.hadoop.util.ToolRunner; import java.io.IOException; import java.util.StringTokenizer; /** * @author Hash Zhang * @version 1.0.0 * @date 2016/8/3 */ public class WordCount extends Configured implements Tool { private static void deleteDir(Configuration conf, String dirPath) throws IOException { FileSystem fs = FileSystem.get(conf); Path targetPath = new Path(dirPath); //如果文件夹存在,则删除 if (fs.exists(targetPath)) { boolean delResult = fs.delete(targetPath, true); if (delResult) { System.out.println(targetPath + " has been deleted sucessfullly."); } else { System.out.println(targetPath + " deletion failed."); } } } public int run(String[] strings) throws Exception { System.setProperty("HADOOP_USER_NAME", "sfdba"); Job job = Job.getInstance(); job.setJar("D:\\Users\\862911\\hadoopT\\target\\hadoopT-1.0-SNAPSHOT.jar"); //设置Job名称 job.setJobName("My Word Count"); //设置每阶段输出格式 job.setOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class); //设置Map的类和reduce的类 job.setMapperClass(Map.class); job.setReducerClass(Reduce.class); //设置输入输出格式 job.setInputFormatClass(TextInputFormat.class); job.setOutputFormatClass(TextOutputFormat.class); //设置输入输出路径,远程Hdfs需要加链接地址 FileInputFormat.setInputPaths(job, strings[0]); FileOutputFormat.setOutputPath(job, new Path(strings[1])); //先删除输出目录 deleteDir(job.getConfiguration(), strings[1]); final boolean success = job.waitForCompletion(true); return success ? 0 : 1; } public static void main(String[] args) throws Exception { int ret = ToolRunner.run(new WordCount(),args); System.exit(ret); } } class Map extends Mapper<LongWritable, Text, Text, IntWritable> { private static final IntWritable one = new IntWritable(1); private final Text word = new Text(); @Override protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { String line = value.toString(); StringTokenizer stringTokenizer = new StringTokenizer(line); while (stringTokenizer.hasMoreTokens()) { word.set(stringTokenizer.nextToken()); context.write(word, one); } } } class Reduce extends Reducer<Text, IntWritable, Text, IntWritable> { @Override protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException { int sum = 0; for (IntWritable value : values) { sum += value.get(); } context.write(key, new IntWritable(sum)); } }
之后的演示,我们都会使用新版的API。
-
Hadoop 使用常见问题
2015-04-21 20:28:52最近一个月刚开始接触Hadoop,这两天在搞排序的时候遇到了点问题,终于解决了,所以想着可以将其记录下来,防止以后忘记,还可以为我国的社会主义...本篇文章的内容主要就是在Hadoop使用中遇到的各种问题以及解决方法。最近一个月刚开始接触Hadoop,这两天在搞排序的时候遇到了点问题,终于解决了, 所以想着可以将其记录下来,防止以后忘记,还可以为我国的社会主义建设做贡献。本篇文 章的内容主要就是在Hadoop使用中遇到的各种问题以及解决方法。
问题1: Can’t read partitions file
背景:
Hadoop进行全局排序时有一个非常高效的算法–terasort,这种方法充分利用Hadoop本身在reduce阶段shuffle过程中对key的排序,但默认的shuffle过程只能保证每个reduce任务内的key是有序的,无法保证全局有序,因为键值在partition时是通过hash来分配给不同reduce任务的,为了实现全局的排序,一种策略是根据键值大小进行partition,使得reduce任务间是有序的,但是在为reducer分配任务前是无法得知键值的分布情况容易造成分配给每个reducer的任务量不均匀,效率低下。terasort就是通过提前抽样获取键值的分布,生成一个partitions file,map会根据这个partitions file建立trie数,从而更为有效的partition。
问题:
进行terasort全局排序时出现java.lang.IllegalArgumentException: Can’t read partitions file这样的错误,但在HDFS中是可以找到partition文件的。
原因:
在指定reduce task数量时指定的过多,键值的个数小于task数量,导致partition文件中有标识不同reducer的键值相同(还是鸽巢原理呢)。
解决方法:
减少reduce task的数量到合适的数量,至少是(抽到样本键值数-1)个。问题2:Wrong FS & 日志无法收集(不能查看)
背景:
Hadoop可以有不同的集群(集群之间性能,配置会有不同),另外Hadoop的计算和数据资源是分离的,在某些需求下,更换了集群的计算资源。
原因:
在配置中只更换了计算资源的集群,使用的确实原来集群的数据节点。
解决方法:
更改配置,使用同一集群下的计算资源和数据资源。
问题3:运行Hadoop程序使用通用配置选项不生效
背景:
在运行Hadoop程序是有一些通用性的选项的比如设置队列优先级等。
问题:
输入对应的命令但是不生效
原因:
代码有误。
解决方案:
要使用通用性的配置选项,在代码上有两个地方需呀注意,一是在类的定义时需要继承Configured类并实现Tool,例如:
public class NGramCounter extends Configured implements Tool
二是在实现run函数时对参数的解析时要这样:
public int run(String[] args) throws Exception {
// TODO Auto-generated method stub
Configuration conf = getConf();
String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
conf获取的时候不要直接new,而是应该使用继承自Configured的getConf方法获得,另外还需要使用GenericOptionsParser类对通用的参数进行解析。
问题4:运行Hadoop程序时类型不匹配
背景:
Hadoop 程序需要运行时需要设定mapper和reducer的input和output 的key value类型。
问题:
直接上段代码说明吧:
使用了这样的mapper:public static class RawGramCountMapper extends
Mapper<BytesWritable, BytesWritable, IntWritable, IntWritable> {
public void map(BytesWritable key, BytesWritable value, Context context){
context.write(new IntWritable(1),new IntWritable(1));
}
}
使用了这样的reducer:public static class RawGramCountReducer extends
Reducer<IntWritable, IntWritable, Text, IntWritable> {}
在使用启动任务的代码中出现了这样的语句:job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
运行时会报出类似这样的错误:Type mismatch in key from map: expected org.apache.hadoop.io.Text, received org.apache.hadoop.io.IntWritable
原因:
设置有误,mapper 和 reducer的output key 和value的类型必须通过显示的设置来确定,仅仅通过泛型的类型指定是不可取的,而
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
对mapper和reducer都生效。
解决方案:
如果mapper 和 reducer 的ouput key和value的类型是相同的,那么可以通过
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
来设定。
如果mapper 和 reducer 的ouput key和value的类型是不相同的,那么需要通过
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
设定两者的kv类型。和
job.setMapOutputKeyClass(IntWritable.class);
job.setMapOutputValueClass(IntWritable.class);
单独设定mapper的output kv类型。
先发表,待续~~ -
Hadoop使用学习笔记(1)
2016-07-18 15:29:14Hadoop使用学习笔记1.Hadoop安装与基本概念Hadoop发行版本地址1.1环境配置需求本文是用的Hadoop版本是最新的2.7.2发行版。 本文分两个机器环境,分别是研发环境和测试环境:本地环境配置(配置较好,用于压测): ...Hadoop使用学习笔记
1.Hadoop安装与基本概念
1.1环境配置需求
本文是用的Hadoop版本是最新的2.7.2发行版。
本文分两个机器环境,分别是研发环境和测试环境:环境配置:
操作系统:
LSB Version: :base-4.0-amd64:base-4.0-noarch:core-4.0-amd64:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-noarch:printing-4.0-amd64:printing-4.0-noarch
Distributor ID: RedHatEnterpriseServer
Description: Red Hat Enterprise Linux Server release 6.6 (Santiago)
Release: 6.6
Codename: Santiago
硬件配置:
内存 16384MB
虚拟处理器(VCPU) 8
硬盘 40GB首先检查环境配置,
1.Java需求,目前Java版本支持度测试,Hadoop2.7需要Java1.7以上的版本,Hadoop2.6以及之前的需要Java1.6版本以上。
2.Hadoop利用ssh远程操控集群,所以需要ssh(输入sshd命令看是否可以找到这个命令)
3.rsync命令是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件。rsync使用所谓的rsync算法来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。(同理,请输入rsync 命令检查是否存在)
之后开始安装,下载好Hadoop,解压:>tar zxvf hadoop-2.7.2.tar.gz >cd hadoop-2.7.2 >ll total 52 drwxr-xr-x 2 sfdba usr01 4096 Jan 26 08:20 bin drwxr-xr-x 3 sfdba usr01 4096 Jan 26 08:20 etc drwxr-xr-x 2 sfdba usr01 4096 Jan 26 08:20 include drwxr-xr-x 3 sfdba usr01 4096 Jan 26 08:20 lib drwxr-xr-x 2 sfdba usr01 4096 Jan 26 08:20 libexec -rw-r--r-- 1 sfdba usr01 15429 Jan 26 08:20 LICENSE.txt -rw-r--r-- 1 sfdba usr01 101 Jan 26 08:20 NOTICE.txt -rw-r--r-- 1 sfdba usr01 1366 Jan 26 08:20 README.txt drwxr-xr-x 2 sfdba usr01 4096 Jan 26 08:20 sbin drwxr-xr-x 4 sfdba usr01 4096 Jan 26 08:20 share
解压完毕后,需要修改一个脚本。修改etc/hadoop/hadoop-env.sh
>vim etc/hadoop/hadoop-env.sh
修改其中的JAVA_HOME为java安装路径,hadoop运行时会在后面加上/bin/java来启用java
# The java implementation to use. export JAVA_HOME=/usr/lib/jvm/jre-1.7.0-openjdk.x86_64/
之后保存,运行一个简单的hadoop命令,看到如下输出,则成功:
>bin/hadoop version Hadoop 2.7.2 Subversion https://git-wip-us.apache.org/repos/asf/hadoop.git -r b165c4fe8a74265c792ce23f546c64604acf0e41 Compiled by jenkins on 2016-01-26T00:08Z Compiled with protoc 2.5.0 From source with checksum d0fda26633fa762bff87ec759ebe689c This command was run using /home/sfdba/hadoop-2.7.2/share/hadoop/common/hadoop-common-2.7.2.jar
下面测试官网给的独立运行测试:
mkdir input cp etc/hadoop/*.xml input bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar grep input output 'dfs[a-z.]+' cat output/*
这是一段将所有配置文件作为输入,检查其中匹配’dfs[a-z.]+’这个正则表达式(开头是dfs末尾为多个字母的词语)的词语的个数
1.2 伪集群安装
Hadoop可以单机伪集群模式运行。
首先我们先来明确几个概念:
Hadoop主要由两部分构成,分别是Mapreduce计算部分,还有底层存储HDFS。
系统架构(manager-worker架构):
其中Namenode就是整个集群中的Manager,保存着文件系统的命名空间,以及维护整个文件系统。这些信息保存在两个文件中形式中:命名空间镜像文件还有编辑日志文件。也记录着每个文件的块(有的地方叫block也有叫chunk,都可以,磁盘块大概512字节,Hadoop中目前默认为128MB,原理:块设置的足够大,那么块寻址时间将远小于磁盘传输时间,减少寻址占比。假设寻址时间为10ms,传输速度为100MB/s,那么块设置为100MB,将使寻址时间占比约为1%)所载在的据节点信息,但是不是持久化的,这些信息会在系统启动时,由数据节点重建
Datanode就是文件系统中的工作节点,根据需要存储并检索数据库块,并且定时向Namenode发送所存储块的列表。
Namenode不能损坏,否则数据无法从data中拼接出来伪集群安装,就是在单机部署多个Hadoop实例(多个JVM运行)。这里,我们部署一个namenode和一个datanode的单机伪集群。
首先,我们需要修改etc/hadoop/core-site.xml,添加如下所示:<configuration> <property> <!-指定HDFS服务端口--> <name>fs.defaultFS</name> <value>hdfs://localhost:9000</value> </property> </configuration>
之后修改HDFS配置文件:
<configuration> <property> <!-指定HDFS数据复制份数--> <name>dfs.replication</name> <value>1</value> </property> </configuration>
之后,检查是否可以无参正常ssh连接localhost
>ssh localhost
如果不行,则执行如下命令生成SSH秘钥:
>ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa >cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys >chmod 0600 ~/.ssh/authorized_keys
之后启动HDFS,分为如下几步:
1.格式化文件系统,执行下面命令,初始化Hadoop文件系统HDFS(其实就是初始化保存目录以及namenode中要保存的metadata)如果,,日志中没报错并且看到INFO util.ExitUtil: Exiting with status 0的话则成功初始化>bin/hdfs namenode -format
2.启动Datanode还有Namenode。运行下面命令:
>sbin/start-dfs.sh
打开浏览器,访问http://你的机器ip:50070,如果出现如下类似界面,则成功
3.下一步我们为当前用户创建必要的目录>bin/hdfs dfs -mkdir /user #这里<username>替换成你当前系统用的用户名 >bin/hdfs dfs -mkdir /user/<username>
查看刚才网页中的Utilities->Browse the file system,可以看到我们之前创建的文件夹:
4.接下来接着使用刚才的例子测试,首先将etc/hadoop 目录下的文件传入HDFS中的input文件夹(就是放在/usr//input中)>bin/hdfs dfs -put etc/hadoop input
之后执行刚才的例子:
>bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar grep input output 'dfs[a-z.]+'
命令中指定结果放在HDFS的
/usr/<username>/output
文件夹中,查看结果,结果如下所示:>bin/hdfs dfs -cat output/* 6 dfs.audit.logger 4 dfs.class 3 dfs.server.namenode. 2 dfs.period 2 dfs.audit.log.maxfilesize 2 dfs.audit.log.maxbackupindex 1 dfsmetrics.log 1 dfsadmin 1 dfs.servers 1 dfs.replication 1 dfs.file
可以看出,HDFS其实和linux的基本文件系统在使用命令上大同小异
5.停止集群:
>sbin/stop-dfs.sh
1.3 利用YARN提交任务
确认上面1.2节的前三步已经执行后,我们可以通过YARN(Yet Another Resource Negotiator)来提交MapReduce任务。
为了能够对集群中的资源进行统一管理和调度,Hadoop 2.0引入了数据操作系统YARN。YARN的引入,大大提高了集群的资源利用率,并降低了集群管理成本。首先,YARN允许多个应用程序运行在一个集群中,并将资源按需分配给它们,这大大提高了资源利用率,其次,YARN允许各类短作业和长服务混合部署在一个集群中,并提供了容错、资源隔离及负载均衡等方面的支持,这大大简化了作业和服务的部署和管理成本。
之后我们会详细介绍YARN。
首先,如果要里用YARN提交任务,我们需要先启动YARN。修改etc/hadoop/mapred-site.xml:<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration>
之后修改YARN配置etc/hadoop/yarn-site.xml:
<configuration> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> </configuration>
启动YARN:
>sbin/start-yarn.sh
访问http://你的机器ip:8808,可以看到YARN控制台
就可以以YARN的方式提交MapReduce任务。
关闭YARN:>sbin/stop-yarn.sh
1.4 Hadoop集群安装
在Hadoop集群中,一般包括如下七个元素:
HDFS: NameNode, SecondaryNameNode, 还有DataNode
YARN:ResourceManager, NodeManager, 还有WebAppProxy
如果需要用到MapReduce,则MapReduce历史服务器也需要用到。
我们通过修改etc/hadoop/hadoop-env.sh, etc/hadoop/mapred-env.sh and etc/hadoop/yarn-env.sh这三个脚本来修改一些关于JVM的配置。
这里我们对于云环境,稍微修改限制下JVM heap size,防止内存溢出。第一步,首先配置每台机器的host文件。对于每台机器,执行 vim /etc/hosts 添加:
#三台机器/etc/hosts文件配置,nosql1作为主,nosql2作为从 10.202.7.184 nosql1 10.202.7.185 nosql2 10.202.7.186 nosql3
之后,在每台机器上分别执行:
ping nosql1 ping nosql2 ping nosql3
看网络是否通畅。
第二步,添加hadoop用户,配置两台机器ssh无密登陆。
几台机器中的hadoop用户以及hadoop存放路径需要相同,否则hadoop HDFS会找不到节点。
SSH无密码原理:Master作为客户端,要实现无密码公钥认证,连接到服务器Salve上时,需要在Master上生成一个密钥对,包括一个公钥和一个私钥,而后将公钥复制到所有的Slave上。当Master通过SSH连接Salve时,Salve就会生成一个随机数并用Master的公钥对随机数进行加密,并发送给Master。Master收到加密数之后再用私钥解密,并将解密数回传给Slave,Slave确认解密数无误之后就允许Master进行连接了。这就是一个公钥认证过程,其间不需要用户手工输入密码。
以nosql1举例,首先在master上创建hadoop用户,属于hadoop组:#创建hadoop组 groupadd hadoop #创建具有管理员权限的用户hadoop,属于hadoop组,同时自动创建用户home目录 useradd -g hadoop -r -m hadoop #修改hadoop密码 passwd hadoop #切换到hadoop用户 su - hadoop
之后,我们需要生成SSH秘钥:
#生成公钥私钥至~/.ssh/id_dsa ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa #添加到授权秘钥 cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys #更改权限为仅限当前用户读写 chmod 0600 ~/.ssh/authorized_keys
验证是否可以无密登陆本机:
ssh localhost
在slave上添加同样的用户后,从master将公钥拷贝过去:
ssh-copy-id hadoop@nosql2 ssh-copy-id hadoop@nosql3
验证成功后,即可无密登陆nosql2和nosql3
ssh nosql2 ssh nosql3
之后以相同的方式配置slave无密登陆master即可
注意:每次修改host中的相关DNS信息后,需要清除掉之前的SSH公钥秘钥,重新生成第三步,配置Hadoop。
如下配置:
etc/hadoop/core-site.xml:<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://nosql1:9000</value> </property> <property> <name>io.file.buffer.size</name> <value>131072</value> </property> </configuration>
etc/hadoop/hdfs-site.xml:
<configuration> <property> <name>dfs.replication</name> <value>1</value> </property> <!--Path on the local filesystem where the NameNode stores the namespace and transactions logs persistently.--> <!--If this is a comma-delimited list of directories then the name table is replicated in all of the directories, for redundancy.--> <property> <name>dfs.namenode.name.dir</name> <value>/home/hadoop/nnData1,/home/hadoop/nnData2</value> </property> <!--HDFS blocksize of 256MB for large file-systems.--> <property> <name>dfs.blocksize</name> <value>268435456</value> </property> <!--More NameNode server threads to handle RPCs from large number of DataNodes.--> <property> <name>dfs.namenode.handler.count</name> <value>5</value> </property> <!--Comma separated list of paths on the local filesystem of a DataNode where it should store its blocks.--> <property> <name>dfs.datanode.data.dir</name> <value>/home/hadoop/dnData1,/home/hadoop/dnData2,/home/hadoop/dnData3</value> </property> <property> <name>dfs.namenode.secondary.http-address</name> <value>nosql2:9001</value> </property> </configuration>
etc/hadoop/mapred-site.xml:
<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <property> <name>mapreduce.jobhistory.address</name> <value>nosql1:10020</value> </property> <property> <name>mapreduce.jobhistory.webapp.address</name> <value>nosql1:19888</value> </property> </configuration>
etc/hadoop/yarn-site.xml:
<configuration> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name> <value>org.apache.hadoop.mapred.ShuffleHandler</value> </property> <property> <name>yarn.resourcemanager.address</name> <value>nosql1:8032</value> </property> <property> <name>yarn.resourcemanager.scheduler.address</name> <value>nosql1:8030</value> </property> <property> <name>yarn.resourcemanager.resource-tracker.address</name> <value>nosql1:8031</value> </property> <property> <name>yarn.resourcemanager.admin.address</name> <value>nosql1:8033</value> </property> <property> <name>yarn.resourcemanager.webapp.address</name> <value>nosql1:8088</value> </property> </configuration>
etc/hadoop/slaves:
nosql2 nosql3
第四步,修改脚本
至少要修改JAVA_HOME为你的JAVA安装地址
在hadoop-env.sh,mapred-env.sh,yarn-env.sh添加或修改:export JAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.101-2.6.6.1.el7_2.x86_64/jre
第五步,格式化,启动集群
首先将master上配置好的hadoop拷贝传输到slave上,注意master和slave上的hadoop路径一定要一致:scp –r hadoop-2.7.2 hadoop@nosql2:/home/hadoop/ scp –r hadoop-2.7.2 hadoop@nosql3:/home/hadoop/
传输完成,在master上执行:
>bin/hdfs namenode -format
sbin/start-all.sh
启动完成后,在主机执行jps,可以看到:
7826 NameNode 8662 Jps 8092 ResourceManager
在从机上执行,可以看到:
30742 Jps 29552 SecondaryNameNode 29638 NodeManager 29425 DataNode
访问:http://nosql1:50070/查看HDFS集群状况
访问:http://nosql1:8088/cluster查看任务状况
接着测试之前的MapReduce任务:bin/hdfs dfs -mkdir -p /test/input bin/hdfs dfs -put ./etc/hadoop/hdfs-site.xml /test/input bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar grep /test/input /test/output 'dfs[a-z.]+'
观察结果即可:
问题整理:
1、Map-Reduce成功,结果失败:Job history中:
2014-06-04 13:17:20,060 ERROR [Thread-62] org.apache.hadoop.mapreduce.v2.app.rm.RMContainerAllocator: Exception while unregistering java.lang.NullPointerException at org.apache.hadoop.mapreduce.v2.util.MRWebAppUtil.getApplicationWebURLOnJHSWithoutScheme(MRWebAppUtil.java:133) at org.apache.hadoop.mapreduce.v2.util.MRWebAppUtil.getApplicationWebURLOnJHSWithScheme(MRWebAppUtil.java:148) at org.apache.hadoop.mapreduce.v2.app.rm.RMCommunicator.doUnregistration(RMCommunicator.java:207) at org.apache.hadoop.mapreduce.v2.app.rm.RMCommunicator.unregister(RMCommunicator.java:177) at org.apache.hadoop.mapreduce.v2.app.rm.RMCommunicator.serviceStop(RMCommunicator.java:250) at org.apache.hadoop.mapreduce.v2.app.rm.RMContainerAllocator.serviceStop(RMContainerAllocator.java:255) at org.apache.hadoop.service.AbstractService.stop(AbstractService.java:221) at org.apache.hadoop.service.ServiceOperations.stop(ServiceOperations.java:52) at org.apache.hadoop.mapreduce.v2.app.MRAppMaster$ContainerAllocatorRouter.serviceStop(MRAppMaster.java:817) at org.apache.hadoop.service.AbstractService.stop(AbstractService.java:221) at org.apache.hadoop.service.ServiceOperations.stop(ServiceOperations.java:52) at org.apache.hadoop.service.ServiceOperations.stopQuietly(ServiceOperations.java:80) at org.apache.hadoop.service.CompositeService.stop(CompositeService.java:159) at org.apache.hadoop.service.CompositeService.serviceStop(CompositeService.java:132) at org.apache.hadoop.service.AbstractService.stop(AbstractService.java:221) at org.apache.hadoop.mapreduce.v2.app.MRAppMaster.shutDownJob(MRAppMaster.java:548) at org.apache.hadoop.mapreduce.v2.app.MRAppMaster$JobFinishEventHandler$1.run(MRAppMaster.java:599)
表明:某个host配置有问题,检查*-site.xml中所有的域名是否正确
2、都提示成功,但是找不到datanode,但是jps中有datanode,datanode日志报错:
2016-07-19 16:38:13,817 INFO org.apache.hadoop.hdfs.server.datanode.DataNode: Block pool BP-896553954-10.202.44.205-1468914346523 (Datanode Uuid null) service to /10.202.44.205:9000 beginning handshake with NN 2016-07-19 16:38:13,820 ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: Initialization failed for Block pool BP-896553954-10.202.44.205-1468914346523 (Datanode Uuid null) service to /10.202.44.205:9000 Datanode denied communication with namenode because hostname cannot be resolved (ip=10.202.44.206, hostname=10.202.44.206): DatanodeRegistration(0.0.0.0:50010, datanodeUuid=9ef57feb-d3a5-47c4-9ed2-db386e4969a8, infoPort=50075, infoSecurePort=0, ipcPort=50020, storageInfo=lv=-56;cid=CID-d5340873-3047-4a6a-89db-8aba9ee5846b;nsid=463107860;c=0) at org.apache.hadoop.hdfs.server.blockmanagement.DatanodeManager.registerDatanode(DatanodeManager.java:863) at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.registerDatanode(FSNamesystem.java:4528) at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.registerDatanode(NameNodeRpcServer.java:1285) at org.apache.hadoop.hdfs.protocolPB.DatanodeProtocolServerSideTranslatorPB.registerDatanode(DatanodeProtocolServerSideTranslatorPB.java:96) at org.apache.hadoop.hdfs.protocol.proto.DatanodeProtocolProtos$DatanodeProtocolService$2.callBlockingMethod(DatanodeProtocolProtos.java:28752) at org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:616) at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:969) at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2049) at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2045) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:415) at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1657) at org.apache.hadoop.ipc.Server$Handler.run(Server.java:2043)
表明:域名填写的是IP,改成域名。
3、执行ssh-copy-id hadoop@nosql2
提示:/usr/bin/ssh-copy-id: ERROR: No identities found
改成指定公钥文件的命令:
ssh-copy-id -i ~/.ssh/id_dsa.pub nosql24、远程登录被拒绝:
设置允许远程登录,linux一般都通过ssh远程连接,修改/etc/ssh/sshd_config文件
在结尾处添加 AllowUsers 用户名,如 AllowUsers zhangsan
保存,退出
重启ssh服务,service sshd restart -
Hadoop使用学习笔记(5)
2016-08-08 09:14:50Hadoop使用学习笔记 3. Map-Reduce本地调试全程Debug(上) 将之前的项目中的Resource中的除了log4j配置其他的文件全部删除。同时,添加本地库(就是之前从集群中拷贝下来的Hadoop文件夹),添加其目录下的share...Hadoop使用学习笔记
3. Map-Reduce本地调试全程Debug(上)
将之前的项目中的Resource中的除了log4j配置其他的文件全部删除。同时,添加本地库(就是之前从集群中拷贝下来的Hadoop文件夹),添加其目录下的share/hadoop中的所有文件作为一个library,如下所示:
之后,注释掉删除/test/ouput那一行代码,因为本地运行无法这样删除远程HDFS目录:
//先删除输出目录 //deleteDir(jobConf, args[1]);
我们在集群机器上手动删除:
./bin/hdfs dfs -rm -r /test/output
运行,发现异常:
16/08/04 19:17:51 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable 16/08/04 19:17:52 INFO Configuration.deprecation: session.id is deprecated. Instead, use dfs.metrics.session-id 16/08/04 19:17:52 INFO jvm.JvmMetrics: Initializing JVM Metrics with processName=JobTracker, sessionId= 16/08/04 19:17:53 WARN mapreduce.JobResourceUploader: Hadoop command-line option parsing not performed. Implement the Tool interface and execute your application with ToolRunner to remedy this. 16/08/04 19:17:54 INFO input.FileInputFormat: Total input paths to process : 2 16/08/04 19:17:55 INFO mapreduce.JobSubmitter: number of splits:2 16/08/04 19:17:56 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_local2007553514_0001 16/08/04 19:17:56 INFO mapreduce.JobSubmitter: Cleaning up the staging area file:/tmp/hadoop-862911/mapred/staging/sfdba2007553514/.staging/job_local2007553514_0001 Exception in thread "main" java.lang.UnsatisfiedLinkError: org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)Z at org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Native Method) at org.apache.hadoop.io.nativeio.NativeIO$Windows.access(NativeIO.java:609) at org.apache.hadoop.fs.FileUtil.canRead(FileUtil.java:977) at org.apache.hadoop.util.DiskChecker.checkAccessByFileMethods(DiskChecker.java:187) at org.apache.hadoop.util.DiskChecker.checkDirAccess(DiskChecker.java:174) at org.apache.hadoop.util.DiskChecker.checkDir(DiskChecker.java:108) at org.apache.hadoop.fs.LocalDirAllocator$AllocatorPerContext.confChanged(LocalDirAllocator.java:285) at org.apache.hadoop.fs.LocalDirAllocator$AllocatorPerContext.getLocalPathForWrite(LocalDirAllocator.java:344) at org.apache.hadoop.fs.LocalDirAllocator.getLocalPathForWrite(LocalDirAllocator.java:150) at org.apache.hadoop.fs.LocalDirAllocator.getLocalPathForWrite(LocalDirAllocator.java:131) at org.apache.hadoop.fs.LocalDirAllocator.getLocalPathForWrite(LocalDirAllocator.java:115) at org.apache.hadoop.mapred.LocalDistributedCacheManager.setup(LocalDistributedCacheManager.java:125) at org.apache.hadoop.mapred.LocalJobRunner$Job.<init>(LocalJobRunner.java:163) at org.apache.hadoop.mapred.LocalJobRunner.submitJob(LocalJobRunner.java:731) at org.apache.hadoop.mapreduce.JobSubmitter.submitJobInternal(JobSubmitter.java:240) at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1290) at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1287) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:415) at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1657) at org.apache.hadoop.mapreduce.Job.submit(Job.java:1287) at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:1308) at com.hash.test.hadoop.mapred.wordcount.WordCount.run(WordCount.java:54) at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70) at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:84) at com.hash.test.hadoop.mapred.wordcount.WordCount.main(WordCount.java:59) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
这个是因为windows目录权限所致的问题,改写(NativeIO.java:609)代码:
public static boolean access(String path, NativeIO.Windows.AccessRight desiredAccess) throws IOException { return true; // return access0(path, desiredAccess.accessRight()); }
让这个方法直接返回true(改写方法就是新建同包同名类NativeIO,复制所有源代码,替换上面的代码部分)
继续运行,成功
接下来我们可以打断点调试了。 -
Hadoop使用lzo格式-问题汇总
2013-12-02 20:46:02Hadoop使用lzo格式-问题汇总 -
Hadoop使用学习笔记(3)
2016-08-03 11:21:04Hadoop使用学习笔记2. 基本Map-Reduce工作配置与原理(中)我们先用老版本的API编写,下一篇会用新的API,并解释区别: 环境配置: 提交Job,开发IDE所在机器环境:Windows 7,4C8G,IntelliJ IDEA 15. Hadoop... -
ES-Hadoop使用
2017-08-07 16:24:14上篇文章简单介绍了ES-Hadoop插件的功能和使用场景,本篇就来看下如何使用ES-hadoop里面的ES-Spark插件,来完成使用spark想es里面大批量插入数据。 这里说明下ES-Hadoop是一个fat的maven依赖,也就是引入这个包会... -
Hadoop 使用IntelliJ IDEA 进行远程调试代码
2021-03-28 14:42:35.一 .前言二 .服务器端配置.2.1. 设置启动远程debug端口2.2. 具体操作三 .Idea配置3.1. 根据报错信息定位到断点所在的位置3.2. 配置远程连接3.3....一 ....昨天晚上遇到一个奇葩的问题, ...修改 服务器上的配置文件 ${HADOOP_ -
hadoop使用kerberos认证后,hadoop fs -ls命令行无法使用,求大神帮忙
2017-08-01 08:38:22hadoop版本apache hadoop 2.7.3,jdk-1.7 输入hadoop fs -ls,错误信息如下: hadoop@hadoop01 native]$ hadoop fs -ls 17/08/01 01:33:36 WARN ipc.Client: Exception encountered while connecting to the server... -
hadoop使用命令大全
2014-07-15 09:08:21启动Hadoop 进入HADOOP_HOME目录。执行sh bin/start-all.sh 关闭Hadoop 进入HADOOP_HOME目录。执行sh bin/stop-all.sh 1、查看指定目录下内容 hadoop dfs –ls [文件目录] eg: hadoop dfs –... -
hadoop 使用 -- spring-data-hadoop
2015-01-22 16:50:24spring是java开发者比较熟悉的框架,准备使用spring-data-hadoop为hadoop开发定制一个框架,方便后续开发人员能快速熟悉开发框架 hadoop下载地址(含各版本): http://mirrors.cnnic.cn/apache/hadoop/common/ ... -
Hadoop使用jar运行实例
2016-05-23 11:14:58在eclipse中使用编写程序,然后打成jar包, 程序代码: package tju.chc; import java.io.File; import java.io.IOException; import java.util.Scanner; import org.apache.hadoop.conf.Configuration; import ... -
Hadoop使用常见问题以及解决方法 (转)
2014-03-02 18:00:26Hadoop使用常见问题以及解决方法 . 作者:keda8997110 和linux相关 http://biancheng.dnbcw.info/linux/441854.html 1:Shuffle Error: Exceeded MAX_FAILED_UNIQUE_FETCHES; bailing-out Answer: 程序... -
Hadoop使用常见问题以及解决方法
2010-09-15 09:03:00Hadoop使用常见问题以及解决方法 1:Shuffle Error: Exceeded MAX_FAILED_UNIQUE_FETCHES; bailing-out Answer: 程序里面需要打开多个文件,进行分析,系统一般默认数量是1024,(用ulimit -a可以... -
hadoop使用心得总结
2016-07-25 09:46:34想到什么平常遇到的问题就记一下,持续更新。。。1.修改完profile文件后记得source一下。 -
hadoop使用经验收集
2013-03-29 16:34:031. 比如遇到过hadoop溢出没有? 如果hadoop溢出了如何解决? 为了防止oom,需要限制task的内存上限,例如一个task占的内存量,以及并发度是多少,二者相乘,再和本机内存做个比较。 内存配置示例: 我们的... -
elasticsearch-hadoop使用记录
2015-11-18 18:13:14elasticsearch-hadoop是一个深度集成Hadoop和ElasticSearch的项目,也是ES官方来维护的一个子项目,通过实现Hadoop和ES之间的输入输出,可以在Hadoop里面对ES集群的数据进行读取和写入,充分发挥Map-Reduce并行处理... -
hadoop使用docker安装和使用(单节点适合开发环境)
2018-08-15 13:30:22本人亲测可用大家放心安装,本文适合开发...下载hadoop镜像 docker pull sequenceiq/hadoop-docker:2.6.0 查看镜像 docker images 运行hadoop docker run -i -t -p 50070:50070 sequencei... -
hadoop使用中常见问题的总结
2013-11-29 15:35:251. 比如遇到过hadoop溢出没有? 如果hadoop溢出了如何解决? 为了防止oom,需要限制task的内存上限,例如一个task占的内存量,以及并发度是多少,二者相乘,再和本机内存做个比较。 内存配置示例: ... -
hadoop 使用log4j日志
2013-07-03 20:07:43[root@c02b01 conf]# cat log4j.properties # Define some default values that can be overridden by system properties hadoop.root.logger=DEBUG,console hadoop.log.dir=. ...hadoop.log.file=hadoop.log -
10.Hadoop使用SNN的FSimage和Edits还原Namenode
2019-11-06 17:14:56[root@node01 ~]# cd /export/servers/hadoop-2.6.0-cdh5.14.0 关闭集群 [root@node01 hadoop-2.6.0-cdh5.14.0]# sbin/stop-all.sh 2.删除日志Fsimage 和edits 删除edits rm -rf /export/servers/hadoop-2.6.0-cdh.... -
ubuntu16系统下使用Intellij IDEA配置hadoop使用(无坑版)
2019-07-03 15:22:25文章目录创建hadoop工程配置依赖环境编译环境配置测试配置成功与否运行步骤运行结果 创建hadoop工程 创建一个新的工程,选择JAVAEE Application 添加自己本地目录下的JAVA SDK到project中 输入项目名称,... -
hadoop使用第三方jar包
2015-10-28 14:40:57当我们实现了一个Hadoop MapReduce Job以后,而这个Job可能又依赖很多外部的jar文件,在Hadoop集群上运行时,有时会出现找不到具体Class的异常。出现这种问题,基本上就是在Hadoop Job执行过程中,没有从执行的上... -
Hadoop使用公平调度策略
2011-02-11 12:12:00<br />前向hadoop提交的任务数越来越多, 任务的执行是按照FIFO的默认调度算法执行的,这样会造成一些任务,即使只有1,2个map或reduce,独占资源的现象,因此改为公平调度算法。cdh hadoop 0.20.2+320 的... -
配置hadoop 使用fair scheduler调度器
2012-09-22 10:00:48hadoop版本为cloudera hadoop cdh3u3 配置步骤为 1. 将$HADOOP_HOME/contrib/fairscheduler/hadoop-fairscheduler-0.20.2-cdh3u3.jar拷贝到$HADOOP_HOME/lib文件夹中 2. 修改$HADOOP_HOME/conf/mapred-site... -
hadoop使用Yarn进行资源队列划分管理
2018-11-08 20:20:06最近在做一个使用sqoop抽取数据最终存进hawq里面的一个项目,然后在做项目的过程,因为经验等一系列的问题,碰到了不少坑,现在将我最近碰到的一个坑写一下,现象大致是这样的,数据在通过sqoop跑量时,会出现跟hawq... -
Mac OSX 下 Hadoop 使用本地库提高效率
2016-06-07 16:02:03Mac OSX: 10.9.5Hadoop: 2.6.0Java: 1.7.0_71 Mac OSX 下运行Hadoop老出现以下警告, 其实就是缺少本地库 14/12/05 14:40:27 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your ... -
关于hadoop使用HDFS集群的WEB监控页面
2018-10-10 18:14:12这里划一次重点! 目前win10自带的浏览器无法使用该功能。推荐用火狐或者谷歌 主节点ip:50070 -
关于hadoop使用LZO压缩模式有感
2012-05-08 15:49:03最近LZO的使用问题,发现java.library.path设置问题,很多网上写的是在hadoop-env.sh文件里增加JAVA_LIBRARY_PATH这个属性(关于另一个增加HADOOP_CLASSPATH是有效的,确实在这个hadoop-0.20.205.0版本确实启动时,...