废话不多说,最近在学hadoop,然后利用docker搭建的集群,网上有利用docker搭建hadoop的博客教程。
但是需要提醒一下,我看的两篇博客都没设置将mapreduce函数放到yarn平台跑,都是自己利用本地机器跑的。
自己边搭边踩坑,终于遇到一个百度也没直接找到解决方法的问题。
英文的wordcount跑成功之后,寻思利用分词做个中文的wordcount。
我是按照视频来的,就是网上下载的别人的培训视频。分词器用的IK分词器。
对了,在此,因为maven貌似对IK分词器不更新了,得把配置文件写一下
在csdn上下载了jar包,然后在maven中配置了本地jar包
org.wltea
ik-analyzer
3.2.8
system
/home/username/workspace/hadoop1/lib/IKAnalyzer3.2.8.jar
maven-assembly-plugin
jar-with-dependencies
cn.edu.bjut.hadoop.WcAndIk
make-assembly
package
single
org.apache.maven.plugins
maven-compiler-plugin
1.7
-------------------------------------------------------------------------------------------------
lib/
lib/
**/IKAnalyzer3.2.8.jar
-------------------------------------------------------------------------------------------------------
map函数的写法如下:
public void map(Object key, Text value, Context context) throws IOException, InterruptedException {
// StringTokenizer itr = new StringTokenizer(value.toString());
// while (itr.hasMoreTokens()) {
// word.set(itr.nextToken());
// context.write(word, one);
// }
byte[] bytes = value.getBytes();
InputStream is = new ByteArrayInputStream(bytes);
Reader reader = new InputStreamReader(is);
IKSegmentation ikSegmentation = new IKSegmentation(reader);
Lexeme t = null;
while ((t = ikSegmentation.next()) != null) {
context.write(new Text(t.getLexemeText()), new IntWritable(1));
}
}
reduce函数因为和英文的wordcount一致就不贴了。
-------------------------------------------------------------------------------------
结果jar包上传到集群,利用hadoop命令跑的时候,愣是没有结果,后来在map函数里加入了System.out.println之类的输出语句
发现了输入语句是乱码。然后上网搜原因,发现大家都说hadoop的编译是基于java的,是UTF-8的,然后我就想,难道是我的待
分词文件不是UTF-8的?然后就各种搜索ubuntu下更改文件编码的方式,结果永远是乱码,乱码,乱码。
关键是网上别人做中文wordcount顶多是遇到输出是乱码,可是我这压根没输出阿。
------------------------------------------------------------------------------------------
后来灵光一现,会不会是我的java在编译时,不是以utf-8的编码格式编译文件的?
于是,写个含有中文String的代码放到集群节点机上编译,果然提示中文呢乱码无法识别
unmappable character for encoding ASCII
在StackOverFlow上找到一个解答(在此抱怨下学校网速,网页最起码花了20秒才打开)
stackoverflow.com/questions/26067350/unmappable-character-for-encoding-ascii-but-my-files-are-in-utf-8
于是我修改了 ~/.bashrc,加入了
export JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF8
为防止不生效,保存~/.bashrc之后,执行了 source ~/.bashrc
再次编译测试代码,不再不识别中文,问题也相应解决了。
----------------------------------------------------------------------------------
有点疑惑,貌似大多数人在ubuntu下装的java在编译时都是可以直接识别中文的,不知道为啥我装的这个需要如此设定。