阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Win7中使用Eclipse连接虚拟机中的Ubuntu中的Hadoop2.4

115次阅读
没有评论

共计 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

————————————– 分割线 ————————————–

成了,一上午没白忙活

Win7 中使用 Eclipse 连接虚拟机中的 Ubuntu 中的 Hadoop2.4

更多详情见请继续阅读下一页的精彩内容 :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;

再次重新运行程序,成功,上张图

Win7 中使用 Eclipse 连接虚拟机中的 Ubuntu 中的 Hadoop2.4

装好插件后显示的你配置的 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

————————————– 分割线 ————————————–

成了,一上午没白忙活

Win7 中使用 Eclipse 连接虚拟机中的 Ubuntu 中的 Hadoop2.4

更多详情见请继续阅读下一页的精彩内容 :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 字段出现的数量

Win7 中使用 Eclipse 连接虚拟机中的 Ubuntu 中的 Hadoop2.4

数据读取类:

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);
 }
}

开发过程中遇到的问题:

  1. Job 被标记为已作废,那应该用什么我还没有查到
  2. 乱码问题,hadoop 默认是 utf8 格式的,如果读取的是 gbk 的需要进行处理
  3. 这类例子网上挺少的,有也是老版的,新版的资料没有,我完全是拼凑出来的,很多地方还不甚了解,需要进一步学习官方资料
  4. 搜索资料时,有资料说不建议采用这种方式处理实际的大数据问题,原因就是并发过高,会瞬间秒杀掉数据库,一般都会采用导成文本文件的形式

更多 Hadoop 相关信息见 Hadoop 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=13

正文完
星哥说事-微信公众号
post-qrcode
 
星锅
版权声明:本站原创文章,由 星锅 2022-01-20发表,共计7523字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中