共计 7523 个字符,预计需要花费 19 分钟才能阅读完成。
一早进入虚拟机启动 Hadoop,发生异常,重新格式化一下恢复正常,原因待查(格式化:在 hadoop 目录下执行 bin/hdfs namenode -format)
java.net.ConnectException:Call From chenph-Ubuntu/127.0.1.1 to localhost:9000 failed on connection
试试昨天制作的成果——eclipse 插件,按照网上的例子进行配置,失败,现象就是无法连接到虚拟机中的 Hadoop,于是试验了如下情况
查看虚拟机中的 ip,输入 ifconfig,得到 192.168.203.136,可以 ping 通 win7 的 ip192.168.101.120
在 win7 中无法 ping 到 192.168.203.136,原因是我将虚拟机创建的一个网络适配器禁用了,启用后通过在 win7 运行 ipconfig -all 可以看到一个 192.168.203.1 的 ip,这个就是 win7 和 ubuntu 俩系统的网段的 ip,这样就可以互相 ping 通了
可是 eclipse 中还是无法远程连接到 hadoop,继续想办法,修改 win7 中的 hosts 文件,发现我的 hosts 文件在系统中没有,后来找到了(没有隐藏,而是设置成了系统保护,去掉保护就行了),增加一条对应的信息 192.168.203.136 localhost
在 eclipse 中还是不行,这时候去 ubuntu 再次执行 ipconfig,ip 竟然变成了 192.168.203.137,我眼花了???
把配置的 ip 统一改成 192.168.203.137,再次试验,依然不行
这时候我把矛头指向了 hadoop 的配置,将所有配置 localhost 的地方统一改成了机器名,重新启动服务后,依然不行
因为 ip 自己会变的问题(可能是 dhcp 自动分配的问题吧,回头设置成固定的试试),所以上一步我用的机器名,这次我统一改成了 ip
————————————– 分割线 ————————————–
相关阅读 :
Ubuntu 13.04 上搭建 Hadoop 环境 http://www.linuxidc.com/Linux/2013-06/86106.htm
Ubuntu 12.10 +Hadoop 1.2.1 版本集群配置 http://www.linuxidc.com/Linux/2013-09/90600.htm
Ubuntu 上搭建 Hadoop 环境(单机模式 + 伪分布模式)http://www.linuxidc.com/Linux/2013-01/77681.htm
Ubuntu 下 Hadoop 环境的配置 http://www.linuxidc.com/Linux/2012-11/74539.htm
单机版搭建 Hadoop 环境图文教程详解 http://www.linuxidc.com/Linux/2012-02/53927.htm
Hadoop LZO 安装教程 http://www.linuxidc.com/Linux/2013-01/78397.htm
Hadoop 集群上使用 Lzo 压缩 http://www.linuxidc.com/Linux/2012-05/60554.htm
————————————– 分割线 ————————————–
成了,一上午没白忙活
更多详情见请继续阅读下一页的精彩内容 :http://www.linuxidc.com/Linux/2014-05/101546p2.htm
昨天下午继续 eclipse 与 Hadoop 间的开发测试,很不顺利,虚拟机中的 ip 果然又变了,设置成手动的后虚拟机中的就上不了网了,检查了各种参数也没有办法,上不了就上不了吧,能别老变 ip 就行了
在 win7 环境下,使用我 eclipse4.3.2 加上我前天制作的 hadoop2.4 的插件进行测试,报异常
Exception in thread “main” java.lang.UnsatisfiedLinkError: org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)Z
网上有相关的介绍,需要下载 hadoop.dll,winutils.exe(下载地址)把这两个文件放到 win 下你 hadoop 目录下的 bin 文件夹中(网上有介绍说直接替换现有 bin,我的还是会出现这个问题,可能是版本问题吧,毕竟我用的是 2.4,上边这两个文件是属于 2.2 版本的)
放好后,重新运行程序(我使用的 Run Application),还是报上边的错,找到源码,把源码放到我的项目里进行 debug,找到第 571 行,改为直接 return true;
再次重新运行程序,成功,上张图
装好插件后显示的你配置的 hdfs 的目录,比在 Ubuntu 中方便一点,可以新增、删除、查看文件
上边提的那个错误,我直接修改的这个类
这个要注意,如果你不放 log4j 的配置文件,你会错过很多有用的报错信息,我刚开始就是没放这个文件,浪费了至少 5,6 个小时走弯路
将输入和输出文件路径在文件中定义好,这里需要说的是如果你的输出文件夹已经存在,再次运行的时候会报错的
运行信息,成功后可以在输出文件夹中的相应文件查看结果
调试过程中,几度崩溃,就是因为没有在工程里添加 log4j,最后看到曙光是因为在 ubuntu 中的 eclipse 调试成功了(这个 eclipse 插件我用的是网上下载的 2.2 的插件)
win7 下,我没有装 cygwin,用的是我自己编译的 2.4 的 eclipse 插件,从网上下了那个 dll 和 exe 直接放到 hadoop 的 bin 目录下,eclipse 中的 hadoop 也是配置的 hadoop 根目录,╮(╯▽╰)╭,网上的资料顶多算参考
一早进入虚拟机启动 Hadoop,发生异常,重新格式化一下恢复正常,原因待查(格式化:在 hadoop 目录下执行 bin/hdfs namenode -format)
java.net.ConnectException:Call From chenph-Ubuntu/127.0.1.1 to localhost:9000 failed on connection
试试昨天制作的成果——eclipse 插件,按照网上的例子进行配置,失败,现象就是无法连接到虚拟机中的 Hadoop,于是试验了如下情况
查看虚拟机中的 ip,输入 ifconfig,得到 192.168.203.136,可以 ping 通 win7 的 ip192.168.101.120
在 win7 中无法 ping 到 192.168.203.136,原因是我将虚拟机创建的一个网络适配器禁用了,启用后通过在 win7 运行 ipconfig -all 可以看到一个 192.168.203.1 的 ip,这个就是 win7 和 ubuntu 俩系统的网段的 ip,这样就可以互相 ping 通了
可是 eclipse 中还是无法远程连接到 hadoop,继续想办法,修改 win7 中的 hosts 文件,发现我的 hosts 文件在系统中没有,后来找到了(没有隐藏,而是设置成了系统保护,去掉保护就行了),增加一条对应的信息 192.168.203.136 localhost
在 eclipse 中还是不行,这时候去 ubuntu 再次执行 ipconfig,ip 竟然变成了 192.168.203.137,我眼花了???
把配置的 ip 统一改成 192.168.203.137,再次试验,依然不行
这时候我把矛头指向了 hadoop 的配置,将所有配置 localhost 的地方统一改成了机器名,重新启动服务后,依然不行
因为 ip 自己会变的问题(可能是 dhcp 自动分配的问题吧,回头设置成固定的试试),所以上一步我用的机器名,这次我统一改成了 ip
————————————– 分割线 ————————————–
相关阅读 :
Ubuntu 13.04 上搭建 Hadoop 环境 http://www.linuxidc.com/Linux/2013-06/86106.htm
Ubuntu 12.10 +Hadoop 1.2.1 版本集群配置 http://www.linuxidc.com/Linux/2013-09/90600.htm
Ubuntu 上搭建 Hadoop 环境(单机模式 + 伪分布模式)http://www.linuxidc.com/Linux/2013-01/77681.htm
Ubuntu 下 Hadoop 环境的配置 http://www.linuxidc.com/Linux/2012-11/74539.htm
单机版搭建 Hadoop 环境图文教程详解 http://www.linuxidc.com/Linux/2012-02/53927.htm
Hadoop LZO 安装教程 http://www.linuxidc.com/Linux/2013-01/78397.htm
Hadoop 集群上使用 Lzo 压缩 http://www.linuxidc.com/Linux/2012-05/60554.htm
————————————– 分割线 ————————————–
成了,一上午没白忙活
更多详情见请继续阅读下一页的精彩内容 :http://www.linuxidc.com/Linux/2014-05/101546p2.htm
经过前面的学习,基本上可以小试牛刀编写一些小程序玩一玩了,在此之前做几项准备工作
明确我要用 Hadoop 干什么
大体学习一下 mapreduce
Ubuntu 重启后,再启动 hadoop 会报连接异常的问题
答:
数据提炼、探索数据、挖掘数据
map= 切碎,reduce= 合并
重启后会清空 tmp 文件夹,默认 namenode 会存在这里,需要在 core-site.xml 文件中增加(别忘了创建文件夹,没权限的话,需要用 root 创建并把权限改成 777):
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop/tmp</value>
</property>
大数据,我的第一反应是现有关系型数据库中的数据怎么跟 hadoop 结合使用,网上搜了一些资料,使用的是 DBInputFormat,那就简单编写一个从数据库读取数据,然后经过处理后,生成文件的小例子吧
数据库弄的简单一点吧,id 是数值整型、test 是字符串型,需求很简单,统计 TEST 字段出现的数量
数据读取类:
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.apache.hadoop.io.Writable;
import org.apache.hadoop.mapreduce.lib.db.DBWritable;
public class DBRecoder implements Writable, DBWritable{
String test;
int id;
@Override
public void write(DataOutput out) throws IOException {
out.writeUTF(test);
out.writeInt(id);
}
@Override
public void readFields(DataInput in) throws IOException {
test = in.readUTF();
id = in.readInt();
}
@Override
public void readFields(ResultSet arg0) throws SQLException {
test = arg0.getString(“test”);
id = arg0.getInt(“id”);
}
@Override
public void write(PreparedStatement arg0) throws SQLException {
arg0.setString(1, test);
arg0.setInt(2, id);
}
}
mapreduce 操作类
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
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.db.DBConfiguration;
import org.apache.hadoop.mapreduce.lib.db.DBInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;
public class DataCountTest {
public static class TokenizerMapper extends Mapper<LongWritable, DBRecoder, Text, IntWritable> {
public void map(LongWritable key, DBRecoder value, Context context) throws IOException, InterruptedException {
context.write(new Text(value.test), new IntWritable(1));
}
}
public static class IntSumReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
private IntWritable result = new IntWritable();
public void reduce(Text key, Iterable<IntWritable> values,
Context context) throws IOException, InterruptedException {
int sum = 0;
for (IntWritable val : values) {
sum += val.get();
}
result.set(sum);
context.write(key, result);
}
}
public static void main(String[] args) throws Exception {
args = new String[1];
args[0] = “hdfs://192.168.203.137:9000/user/chenph/output1111221”;
Configuration conf = new Configuration();
DBConfiguration.configureDB(conf, “Oracle.jdbc.driver.OracleDriver”,
“jdbc:oracle:thin:@192.168.101.179:1521:orcl”, “chenph”, “chenph”);
String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
Job job = new Job(conf, “DB count”);
job.setJarByClass(DataCountTest.class);
job.setMapperClass(TokenizerMapper.class);
job.setReducerClass(IntSumReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(IntWritable.class);
String[] fields1 = { “id”, “test”};
DBInputFormat.setInput(job, DBRecoder.class, “t1”, null, “id”, fields1);
FileOutputFormat.setOutputPath(job, new Path(otherArgs[0]));
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
开发过程中遇到的问题:
- Job 被标记为已作废,那应该用什么我还没有查到
- 乱码问题,hadoop 默认是 utf8 格式的,如果读取的是 gbk 的需要进行处理
- 这类例子网上挺少的,有也是老版的,新版的资料没有,我完全是拼凑出来的,很多地方还不甚了解,需要进一步学习官方资料
- 搜索资料时,有资料说不建议采用这种方式处理实际的大数据问题,原因就是并发过高,会瞬间秒杀掉数据库,一般都会采用导成文本文件的形式
更多 Hadoop 相关信息见 Hadoop 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=13