8月 11th, 2014

HBaseぜ filter遅?

Posted in Hadoop by admin

HBaseぜ filterが遅いバグがある(HBASE-9428)
https://issues.apache.org/jira/browse/HBASE-9428

CDHでも、4.3.0, 4,4,0, 4.5.0が該? する。
パッチはこちら。

# wget https://issues.apache.org/jira/secure/attachment/12601412/9428-0.94.txt
# cat https://issues.apache.org/jira/secure/attachment/12601412/9428-0.94.txt
Index: src/main/java/org/apache/hadoop/hbase/filter/RegexStringComparator.java
===================================================================
--- src/main/java/org/apache/hadoop/hbase/filter/RegexStringComparator.java	(revision 1519839)
+++ src/main/java/org/apache/hadoop/hbase/filter/RegexStringComparator.java	(working copy)
@@ -30,6 +30,7 @@
 import java.io.IOException;
 import java.nio.charset.Charset;
 import java.nio.charset.IllegalCharsetNameException;
+import java.util.Arrays;
 import java.util.regex.Pattern;

 /**
@@ -91,9 +92,12 @@

   @Override
   public int compareTo(byte[] value, int offset, int length) {
+    // See HBASE-9428. Make a copy of the relevant part of the byte[],
+    // or the JDK will copy the entire byte[] during String decode
+    byte[] tmp = Arrays.copyOfRange(value, offset, offset+length);
     // Use find() for subsequence match instead of matches() (full sequence
     // match) to adhere to the principle of least surprise.
-    return pattern.matcher(new String(value, offset, length, charset)).find() ? 0
+    return pattern.matcher(new String(tmp, charset)).find() ? 0
         : 1;
   }
2月 11th, 2014

HadoopStreamingバイナリ対応ぜ ImageMagickを使う

Posted in Hadoop by admin

Hadoopストリーミングは、通常テキストデータのストリームにのみ対応しており、
バイナリデータをそのまま入力にすると改? コードなどでデータが壊れてしまう。

以? ぜ JIRAのパッチを利用して、Hadoopストリーミングをバイナリストリームぜ
対? し、ImageMagickのコマンドを実行するMap処理を行える。
このパッチぜ Hadoopコアへの改修は? 要とせず、追加jarファイルのみだけぜ
動作するため、運用中システムへの影響度もあまりない。

https://issues.apache.org/jira/browse/MAPREDUCE-5018

※動作を確? した環? は、CDH4.4、JDK1.6.0_31

予め、利用するCDHバージョンの環? でパッチに含まれる以? のソースから
justbytes.jarを生成しておきます。

org/apache/hadoop/io/JustBytesWritable.java
org/apache/hadoop/mapred/JustBytesInputFormat.java
org/apache/hadoop/mapred/JustBytesOutputFormat.java
org/apache/hadoop/streaming/io/IdentifierResolver.java
org/apache/hadoop/streaming/io/JustBytesInputWriter.java
org/apache/hadoop/streaming/io/JustBytesOutputReader.java

後は、生成justbytes.jarをクライアントボ ードに配置して、Hadoop
ストリーミングを実行するだけです。ただし、ImageMagickを利用する
場合は、全スレーブボ ードぜ ImageMagickをインストールしておきます。
付属ぜ mapstreamスクリプトを利用してもいいですが、内部では以下のようぜ
hadoopコマンドを実行しています。

$ ls
justbytes.jar  mapstream

バイナリデータのバイト数確認

$ hadoop jar /usr/lib/hadoop-0.20-mapreduce/contrib/streaming/hadoop-streaming-2.0.0-mr1-cdh4.4.0.jar \
    -D stream.io.identifier.resolver.class=org.apache.hadoop.streaming.io.JustBytesIdentifierResolver \
    -libjars justbytes.jar \
    -io justbytes \
    -inputformat org.apache.hadoop.mapred.JustBytesInputFormat \
    -outputformat org.apache.hadoop.mapred.JustBytesOutputFormat \
    -input "/user/hdfs/input" \
    -output "/user/hdfs/output" \
    -mapper "wc -c" \
    -numReduceTasks 0

ImageMagickぜ convertコマンドぜ jpeg画? を50%にリサイ゜

$ hadoop jar /usr/lib/hadoop-0.20-mapreduce/contrib/streaming/hadoop-streaming-2.0.0-mr1-cdh4.4.0.jar \
    -D stream.io.identifier.resolver.class=org.apache.hadoop.streaming.io.JustBytesIdentifierResolver \
    -libjars justbytes.jar \
    -io justbytes \
    -inputformat org.apache.hadoop.mapred.JustBytesInputFormat \
    -outputformat org.apache.hadoop.mapred.JustBytesOutputFormat \
    -input "/user/hdfs/input_jpg" \
    -output "/user/hdfs/output_jpg" \
    -mapper "convert -resize 50% - -" \
    -numReduceTasks 0

$ hdfs dfs -ls /user/hdfs/output_jpg
Found 6 items
-rw-r--r--   3 hdfs hadoop          0 2014-02-05 17:31 /user/hdfs/output_jpg/_SUCCESS
drwxr-xr-x   - hdfs hadoop          0 2014-02-05 17:31 /user/hdfs/output_jpg/_logs
-rw-r--r--   3 hdfs hadoop     249193 2014-02-05 17:31 /user/hdfs/output_jpg/part-00000
-rw-r--r--   3 hdfs hadoop     195777 2014-02-05 17:31 /user/hdfs/output_jpg/part-00001
-rw-r--r--   3 hdfs hadoop     182178 2014-02-05 17:31 /user/hdfs/output_jpg/part-00002
-rw-r--r--   3 hdfs hadoop     473279 2014-02-05 17:31 /user/hdfs/output_jpg/part-00003

$ identify /hdfs/user/hdfs/input_jpg/test1.jpeg
/hdfs/user/hdfs/input_jpg/test1.jpeg JPEG 4256x2832 4256x2832+0+0 DirectClass 4.8mb

$ identify /hdfs/user/hdfs/output_jpg/part-00000
/user/hdfs/output_jpg/part-00000 JPEG 2128x1416 2128x1416+0+0 DirectClass 1.5mb

part-nnnnnnがそれぞれconvert後の画? ファイルになっている。
fuseマウント経由ぜ identifyを行い、リサイズ? ぜ jpegが生成されていることを確? 。

9月 12th, 2013

GreenplumDB + RODBC

Posted in DWH by admin

RからGreenplum DBぜ ODBC接続するRODBCの環? 設?

configure: error: "ODBC headers sql.h and sqlext.h not found"
configure: error: "no ODBC driver manager found"
checking size of long... configure: error: cannot compute sizeof (long), 77

R CMD INSTALLで? のようぜ configure errorが出ていたが、
以? のコマンドで接続まで確認できた。

# export LDFLAGS='-Xlinker -rpath /usr/local/greenplum-connectivity-4.2.5.0-build-1\
/drivers/odbc/psqlodbc-08.02.0500/unixodbc-2.2.12'
# export LD_LIBRARY_PATH=/usr/local/greenplum-connectivity-4.2.5.0-build-1/drivers\
/odbc/psqlodbc-08.02.0500/unixodbc-2.2.12
# R CMD INSTALL RODBC_1.3-5.tar.gz --configure-args='--with-odbc-manager=odbc \
--with-odbc-include=/usr/local/greenplum-connectivity-4.2.5.0-build-1/drivers/odbc\
/psqlodbc-08.02.0500/unixodbc-2.2.12/include --with-odbc-lib=/usr/local/greenplum-\
connectivity-4.2.5.0-build-1/drivers/odbc/psqlodbc-08.02.0500/unixodbc-2.2.12'
# vi /usr/local/greenplum-connectivity-4.2.5.0-build-1/greenplum_connectivity_path.sh
GP_ODBC_DRIVER=psqlodbc-08.02.0500
GP_ODBC_DRIVER_MANAGER=datadirect-52_64
?
# su - gpadmin
$ vi .odbc.ini
[greenplum]
Description = PostgreSQL driver for Greenplum
Driver = /usr/local/greenplum-connectivity-4.2.5.0-build-1/drivers/odbc\
/psqlodbc-08.02.0500/unixodbc-2.2.12/psqlodbcw.so
Trace = 1
Debug=1
Database = testdb
Servername = ms01
UserName = gpadmin
Password = password
Port = 5432
ReadOnly = No
RowVersioning = No
DisallowPremature = No
ShowSystemTables = Yes
ShowOidColumn = No
FakeOidIndex = No
useDeclareFetch = 1
Fetch = 4096
UpdatableCursors = No
Protocol = 7.4-1
$ export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/greenplum-connectivity-\
4.2.5.0-build-1/drivers/odbc/psqlodbc-08.02.0500/unixodbc-2.2.12"
$ R
> library(RODBC)
> ch < - odbcConnect("greenplum", uid="gpadmin", case="postgresql", pwd="password")
> sqlColumns(ch, "testtable")
> sqlQuery(ch, "SELECT * FROM testtable")
> odbcClose(ch)
12月 13th, 2012

ReduceTask OutOfMemoryError

Posted in Hadoop by admin

Hadoop Troubleshooting 101の日本? 版スライドはこちらにあります。
http://www.slideshare.net/cloudera/hadoop-troubleshooting-101-japanese-version

ここにないケースで、shuffleフェーズで発生するOutOfMemoryErrorがありました。
使用バージョンぜ hadoop-0.20.2 なので、MAPREDUCE-1182のバグではないようです。

Error: java.lang.OutOfMemoryError: Java heap space
        at org.apache.hadoop.mapred.ReduceTask$ReduceCopier$MapOutputCopier.shuffleInMemory(ReduceTask.java:1612)
        at org.apache.hadoop.mapred.ReduceTask$ReduceCopier$MapOutputCopier.getMapOutput(ReduceTask.java:1472)
        at org.apache.hadoop.mapred.ReduceTask$ReduceCopier$MapOutputCopier.copyOutput(ReduceTask.java:1321)
        at org.apache.hadoop.mapred.ReduceTask$ReduceCopier$MapOutputCopier.run(ReduceTask.java:1253)

大容釜 ファイルぜ terasortを実行すれば簡単に再現します。
以? のようぜ Hadoopパラメータで対処できる事も゜ かりました。

ボ reducer最大スロット(mapred.tasktracker.reduce.tasks.maximum)の数値を下げて、TaskTracker子プロセスのヒープサイ゜ (mapred.child.java.opts)の割り当てを挙げる。試してませんが、shuffle中ぜ map出力を格? するために割り当てることができるメモリの割合(mapred.job.shuffle.input.buffer.percent)を上げるという対? も考えられます。

ボ reducerがデータ転送する為にパラレルに接続出来るTaskTrackerの? (mapred.reduce.parallel.copies)を必要以? に? ぜ しない 。デフォルトぜ 5だが、推奨値ぜ sqrt(ボ ード? )で、最作 値ぜ 10。

問題の発生するジョブにだけ適用させたいのぜ JobConfや実行時の? ? (-D)で指定するのでしょうか。
他に良い方? があればいいのですが。。

関連する情?
http://hadoop-common.472056.n3.nabble.com/Shuffle-In-Memory-OutOfMemoryError-td433197.html

9月 26th, 2012

CDH+Azkabanぜ version mismatch

Posted in Hadoop, Tomcat by admin

CDH3ぜ Hadoopクラスタを構築し、クライアントとしぜ Azkaban-0.10を利用する場合、
クライアントからNameNodeへの接続が圏 れずに以下のようぜ Exceptionが発生する。
(Azkabanぜ HDFSディレクトリ圏 照? 能にアクセスすることで確認出来る)

javax.servlet.ServletException: java.io.IOException:
Call to namenode/10.10.10.1:8020 failed on local exception: java.io.EOFException
    azkaban.web.pages.HdfsBrowserServlet.init(HdfsBrowserServlet.java:76)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
?

java.io.IOException: Call to namenode/10.10.10.1:8020 failed on local exception: java.io.EOFException
    org.apache.hadoop.ipc.Client.wrapException(Client.java:775)
    org.apache.hadoop.ipc.Client.call(Client.java:743)
    org.apache.hadoop.ipc.RPC$Invoker.invoke(RPC.java:220)
?

java.io.EOFException
    java.io.DataInputStream.readInt(DataInputStream.java:375)
    org.apache.hadoop.ipc.Client$Connection.receiveResponse(Client.java:501)
?

NameNode側には、以? のようなクラスタとクライアントのバージョンミスマッチが
発生しているログが出力される。

WARN org.apache.hadoop.ipc.Server: Incorrect
 header or version mismatch from 10.10.10.10:40424 got version 3 expected
 version 4

表面? ぜ Hadoopバージョンは、CDHぜ Azkabanの使用しているコミュニティ版ぜ
同一ぜ 0.20.2だが、Clouderaのバックポートで更新され互朏 性がなぜ なっている。

対? 方? は、azkabanぜ WEB-INF/lib配下の「hadoop-0.20.2-core.jar」を削除し、
CDH(/usr/lib/hadoop配下)の「hadoop-core-0.20.2-cdh3u4.jar」ぜ
「guava-r09-jarjar.jar」をWEB-INF/lib配下に置ぜ 。

上記ぜ warファイルをTomcat上に配置するパターンを想? しているが、
その場合、「servlet-api-2.5.jar」「catalina-ant.jar」あたりも
不要になるのでついでに削除する。削除すれば、以? ぜ INFOログを出力
しなぜ なる。

INFO: validateJarFile jar not loaded.
See Servlet Spec 2.3, section 9.7.2.
Offending class: javax/servlet/Servlet.class