- java.util.ServiceLoaderが o.a.h.mapreduce.protocol.ClientProtocolProviderの実装である o.a.tez.mapreduce.client.YarnTezClientProtocolProviderを classpath上から見つけてロードする。 mapred-site.xmlのmapreduce.jobtracker.addressの値が"yarn-tez"であれば、 o.a.h.mapreduce.Cluster#getClientがTeZ用の o.a.h.mapreduce.protocol.ClientProtocl実装を返してくれる。
- 既存のMapReduceジョブをTezで動かす場合、 ジョブをsubmitするクライアントノードで、 hadoopのclasspathにTezのjarを追加する必要がある。
- Tezのcontainerのコマンドラインを組み立てるのは o.a.t.dag.util.TezRuntimeChildJVM#getVMCommand。 メインクラスはo.a.t.runtime.task.TezChild。
- データの受け渡しはmapreduce_shuffleの仕組みをそのまま使うようだ。
- 並列度はVertex#createの引数で指定できる。
HBaseのLogWriterはSequenceFileLogWriterではなくProtobufLogWriterがデフォルトに変わった。
master自体が内部的にregionserverを開くようになったので、 擬似分散環境では以下のようにポート番号をずらさないと、 Addless already in useで起動に失敗する。:
$ bin/local-regionservers.sh start 1
Table#flushCommitsは廃止された。(HBASE-12802) Connection#getBufferedMutatorで取得できるBufferedMutator#flushを使う必要がある。(HBASE-12728)
$ cd $HBASE_HOME $ cp -Rp conf conf1 $ cp -Rp conf conf2 $ vi conf1/hbase-env.sh $ vi conf1/hbase-site.xml $ vi conf2/hbase-env.sh $ vi conf2/hbase-site.xml $ HBASE_CONF_DIR=./conf1 bin/hbase-daemon.sh start master $ HBASE_CONF_DIR=./conf1 bin/hbase-daemon.sh start regionserver $ HBASE_CONF_DIR=./conf2 bin/hbase-daemon.sh start master $ HBASE_CONF_DIR=./conf2 bin/hbase-daemon.sh start regionserver $ HBASE_CONF_DIR=./conf2 bin/hbase shell > create 'test', 'f' $ HBASE_CONF_DIR=./conf1 bin/hbase shell > create 'test', 'f' > add_peer 'hbase2', 'localhost:2181:/hbase2' > enable_table_replication 'test' > put 'test', 'r1', 'f:', 'v1'
conf1/hase-env.sh:
export HBASE_IDENT_STRING=hbase1
conf2/hase-env.sh:
export HBASE_IDENT_STRING=hbase2
conf1/hbase-site.xml:
<configuration> <property> <name>hbase.cluster.distributed</name> <value>true</value> </property> <property> <name>hbase.rootdir</name> <value>hdfs://localhost:8020/hbase1</value> </property> <property> <name>hbase.zookeeper.quorum</name> <value>localhost</value> </property> <property> <name>zookeeper.znode.parent</name> <value>/hbase1</value> </property> <property> <name>hbase.master.port</name> <value>60001</value> </property> <property> <name>hbase.master.info.port</name> <value>60011</value> </property> <property> <name>hbase.regionserver.port</name> <value>60021</value> </property> <property> <name>hbase.regionserver.info.port</name> <value>60031</value> </property> </configuration>
conf2/hbase-site.xml:
<configuration> <property> <name>hbase.cluster.distributed</name> <value>true</value> </property> <property> <name>hbase.rootdir</name> <value>hdfs://localhost:8020/hbase2</value> </property> <property> <name>hbase.zookeeper.quorum</name> <value>localhost</value> </property> <property> <name>zookeeper.znode.parent</name> <value>/hbase2</value> </property> <property> <name>hbase.master.port</name> <value>60002</value> </property> <property> <name>hbase.master.info.port</name> <value>60012</value> </property> <property> <name>hbase.regionserver.port</name> <value>60022</value> </property> <property> <name>hbase.regionserver.info.port</name> <value>60032</value> </property> </configuration>
gcログの "[ParNew: ... , %3.7f secs]" という部分は、 GCTraceTimeというクラスのコンストラクタとデストラクタが出力する。 コンストラクタが "[ParNew: "の部分を、デストラクタが ", %3.7f secs]"の部分を出力。 GCTraceTimeが作られてから、 そのスコープを抜ける(ことによってデストラクタが呼ばれる)までの、 所要時間を表している。 所要時間はgettimeofdayで取得したwall-clock timeに基づくもの。 (ParNewGeneration::collectのソースを参照。)
[CMS-concurrent-abortable-preclean: 1.910/54.082 secs] の1.910の部分はイベントカウンタを元に算出されるCPU時間的な値、 54.082の部分はwall-clock time。
CMSの場合、gc causeとしての"Full GC"は出力されない。 Old領域を使い切って(concurrent mode failure)と出力された場合、 内部的にアルゴリズムが切り替わっている。:
// Concurrent mode failures are currently handled by // means of a sliding mark-compact.
Old領域不足でFull Collectionが発生した場合にコンパクションを実行するかどうかは、 UseCMSCompactAtFullCollectionの値(デフォルトでtrue)と、 これまでに実効されたCMSのサイクル数が CMSFullGCsBeforeCompaction(デフォルト0)を超えているかどうかで判断される。
CMSScavengeBeforeRemarkは、 remarkの直前にminor GCを実行することで、remarkの仕事を減らす意図のもの デフォルトでfalse。
promotion failedが発生したときに必要なのは、 collectionかもしれないし、compactionかもしれない。
-XX:NativeMemoryTracking=detail -XX:+UnlockDiagnosticVMOptions -XX:+PrintNMTStatistics
参考
"-Xmx"で指定されるMaxHeapのサイズは、Permanent領域の分を含まない。
curl https://identity.api.rackspacecloud.com/v2.0/tokens \ -X POST \ -d '{"auth":{"RAX-KSKEY:apiKeyCredentials":{"username":"foobar","apiKey":"ffffffffffffffffffffffffffffffff"}}}' \ -H "Content-type: application/json" | jq -r .access.token.id > ~/token.swift curl https://storage101.iad3.clouddrive.com/v1/MossoCloudFS_1035245/testfs/test \ -i \ -X HEAD \ -H "Host: storage.clouddrive.com" \ -H "X-Newest: true" \ -H "X-Auth-Token: `cat ~/token.swift`"
src/test/resources/auth-keys.xml:
<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <property> <name>fs.contract.test.fs.swift</name> <value>swift://testfs.rackspace/</value> </property> <property> <name>fs.swift.service.rackspace.auth.url</name> <value>https://auth.api.rackspacecloud.com/v2.0/tokens</value> </property> <property> <name>fs.swift.service.rackspace.username</name> <value>foobar</value> </property> <property> <name>fs.swift.service.rackspace.region</name> <value>IAD</value> </property> <property> <name>fs.swift.service.rackspace.apikey</name> <value>ffffffffffffffffffffffffffffffff</value> </property> <property> <name>fs.swift.service.rackspace.public</name> <value>true</value> </property> </configuration>
$ bundle install $ bundle exec rake test
特定のテストファイルを実行する場合:
$ bundle exec rake test TEST=test/plugin/test_output_as_buffered.rb
特定のテストケースを実行:
$ bundle exec rake test TEST=test/plugin/test_output_as_buffered.rb TESTOPTS="-t'/buffered output feature with timekey and range/'"
htracedのREST APIをcurlコマンドでたたく。:
curl http://localhost:9095/query -G -d 'query={"pred":[],"lim":11}:'
libhtraceとlibhdfsを使ったコードのコンパイル:
gcc -I/home/iwasakims/srcs/htrace/htrace-c/target/install/include \ -L/home/iwasakims/srcs/htrace/htrace-c/target/install/lib \ -I$HADOOP_HOME/include -L$HADOOP_HOME/lib/native \ -lhtrace -lhdfs -o test_libhdfs_write test_libhdfs_write.c
実行:
export CLASSPATH=`$HADOOP_HOME/bin/hdfs classpath --glob` export LD_LIBRARY_PATH=$HADOOP_HOME/lib/native:/home/iwasakims/srcs/htrace/htrace-c/target/install/lib ./test_libhdfs_write /tmp/test04.txt 2048 2048
htracedの特定のテストを実行:
cd htrace-htraced/go export GOPATH=/home/iwasakims/srcs/htrace/htrace-htraced/go:/home/iwasakims/srcs/htrace/htrace-htraced/go/build go test ./src/org/apache/htrace/htraced -run Client -v
テスト用のspanをロード:
htraceTool load '{"a":"b9f2a1e07b6e4f16b0c2b27303b20e79", "b":1424736225037,"e":1424736225901, "d":"ClientNamenodeProtocol#getFileInfo", "r":"FsShell", "p":["3afebdc0a13f4feb811cc5c0e42d30b1"]}'
htracd用設定:
<property> <name>hadoop.htrace.span.receiver.classes</name> <value>org.apache.htrace.impl.HTracedSpanReceiver</value> </property> <property> <name>hadoop.htrace.htraced.receiver.address</name> <value>centos7:9075</value> </property>
FsShellからtracing:
hdfs dfs -Dfs.shell.htrace.sampler.classes=AlwaysSampler -put test.dat /tmp/
HBaseSpanReceiverを利用するためには、以下のjarも必要。 (htrace-core-3.1.0は、hbase-clientが使う。 hbase-clientとしてのtracing設定がoffだとしても、 htrace関連クラスのロードは実行されるので、 無いとjava.lang.NoClassDefFoundError。)
- hbase-annotation
- hbase-client
- hbase-common
- hbase-protocol
- htrace-core-3.1.0
Setting up single Ambari cluster on CentOS 7.:
sudo curl -L -o /etc/yum.repos.d/ambari.repo http://public-repo-1.hortonworks.com/ambari/centos7/2.x/updates/2.6.0.0/ambari.repo sudo yum -y install java-1.8.0-openjdk-devel ambari-server ambari-agent sudo ambari-server setup -j /usr/lib/jvm/java-1.8.0-openjdk --silent sudo service ambari-server start sudo service ambari-agent start
OpenSSLのバージョンによっては、 /etc/ambari-agent/conf/ambari-agent.iniの[security]セクションに、 以下を記述しないとambari-agentがambari-serverに接続できない。:
force_https_protocol=PROTOCOL_TLSv1_2
HDP 2.6.1だと、以下を実行しないと、HiveMetastoreやHiveServer2が起動できない。:
$ sudo yum install mysql-connector-java* $ ls -al /usr/share/java/mysql-connector-java.jar $ cd /var/lib/ambari-server/resources/ $ ln -s /usr/share/java/mysql-connector-java.jar mysql-connector-java.jar
Python 3 is not supported. Python 2 must be on the path as python.:
$ sudo alternatives --set python /usr/bin/python2
Since MariaDB is not supported, MySQL should be used.:
$ sudo dnf install mysql-server $ sudo yum install https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-8.0.21-1.el8.noarch.rpm $ sudo systemctl start mysqld
CREATE FUNCTION is not allowed without setting log_bin_trust_function_creators.:
$ mysql -u root > SET GLOBAL log_bin_trust_function_creators = 1;
passwords must be set in install.properties.:
# DB UserId used for the Ranger schema # db_name=ranger db_user=rangeradmin db_password=###PASSWORD HERE### # change password. Password for below mentioned users can be changed only once using this property. #PLEASE NOTE :: Password should be minimum 8 characters with min one alphabet and one numeric. rangerAdmin_password=###PASSWORD HERE### rangerTagsync_password=###PASSWORD HERE### rangerUsersync_password=###PASSWORD HERE### keyadmin_password=###PASSWORD HERE###
Policies fetched from ranger-admin are cached in the directory specified by ranger.plugin.hbase.policy.cache.dir.:
2020-08-07 15:01:16,435 INFO [centos8:44025.activeMasterManager] provider.AuditProviderFactory: AUDIT PROPERTY: ranger.plugin.hbase.policy.cache.dir=/etc/ranger/hbase/policycache
Cached policies are loaded if ranger-admin is not available on the startup.
インスタンス起動時にとりあえずでsshのlisten portに443を追加するためのuser data for CentOS 6 and CentOS 7。 再起動してSELinuxがenforcingで上がってくると、 sshdが443をlistenできなくて起動失敗し、ログインできなくなる:
#!/bin/bash setenforce 0 sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/sysconfig/selinux sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config service iptables stop chkconfig iptables off echo "" >> /etc/ssh/sshd_config echo "Port 22" >> /etc/ssh/sshd_config echo "Port 443" >> /etc/ssh/sshd_config service sshd reload
opening ports for zone.:
$ sudo firewall-cmd --permanent --zone=public --add-port=1024-65535/tcp $ sudo firewall-cmd --reload
showing all settings of nftables.:
$ sudo nft -a list ruleset | less
https://docs.gradle.org/current/userguide/publishing_maven.html
$ ./gradlew publishToMavenLocal -Pskip.signing
- alluxio.hadoop.FileSystemがAlluxioのFileSystem実装。
- org.apache.hadoop.fs.FileSystem#openは、alluxio.client.file.FileSystem#openFileに対応付けられる感じ。
return new FSDataInputStream(new HdfsFileInputStream(mFileSystem, uri, mStatistics));
みたいな形で、wrapされるalluxio.hadoop.HdfsFileInputStreamのさらに内側に、 alluxio.client.file.FileInStreamのサブクラス(AlluxioFileInStream)が埋まってる。- FileInStreamの中で、read箇所のブロックに対応するalluxio.client.block.stream.BlockInStreamを作る。
- BlockInStreamの内部では、DataReaderのインスタンスを作ってデータをreadする。 リモートのAlluxio workerにリクエストを送ってデータを読む場合、GrpcDataReader。
- クライアント側の設定は結構複雑
- 以下などから取得した内容をマージして使う。
- クラスパス上のalluxio-site.properties
- alluxio-masterからRPCで取得
- (org.apache.hadoop.conf.Configuration)
- 優先順位は alluxio.conf.Source の値で決まる。ローカル優先。
- 同じRUNTIMEでも、alluxio-site.propertiesよりも、 HadoopのConfiguration経由が優先 される。
- 以下などから取得した内容をマージして使う。
- ASYCN_THROUGHで書き込むと、 typeが ALLUXIO_BLOCK なWriteRequestでデータを送った後、 completeFile するときに asyncPersistOptions をセットしてリクエストを送る。その後、 PersistenceScheduler が非同期に、このファイルをUFSに書き込むためのジョブを起動する。
underfsのライブラリの.jarは、 java.nio.file.Files#newDirectoryStreamで順次読み込む ため、同じunderfsの複数のバージョンのライブラリが存在する場合、どれが使われるかは事前に分からない。 mount時のalluxio.underfs.versionの値で制御 できる。
alluxio.underfs.versionのバージョン番号は、ある程度柔軟にマッチされる。 例えば、libディレクトリにhdfs用のunderfsのjarとして、
alluxio-underfs-hdfs-3.3.4-2.9.4.jar
のみが存在する場合、 3.3や3.3.3は許されるが、2.10や3.2はエラーになる。:alluxio fs mount --option alluxio.underfs.version=2.10 /mnt/hdfs hdfs://nn1:8020/alluxio alluxio fs mount --option alluxio.underfs.version=3.2 /mnt/hdfs hdfs://nn1:8020/alluxio alluxio fs mount --option alluxio.underfs.version=3.3 /mnt/hdfs hdfs://nn1:8020/alluxio alluxio fs mount --option alluxio.underfs.version=3.3.3 /mnt/hdfs hdfs://nn1:8020/alluxio
launch pseudo distributed cluster by pre-built packages.:
./docker-hadoop.sh \ --create 1 \ --memory 16g \ --image bigtop/puppet:trunk-rockylinux-8 \ --repo http://repos.bigtop.apache.org/releases/3.3.0/rockylinux/8/x86_64 \ --stack hdfs,yarn,mapreduce,alluxio
or with locally built packages.:
./docker-hadoop.sh \ --create 1 \ --memory 16g \ --image bigtop/puppet:trunk-ubuntu-22.04 \ --repo file:///bigtop-home/output/apt \ --disable-gpg-check \ --stack hdfs,yarn,mapreduce,alluxio
vi /etc/alluxio/conf/alluxio-site.properties
:
alluxio.user.short.circuit.enabled=false alluxio.user.file.writetype.default=CACHE_THROUGH alluxio.underfs.s3.streaming.upload.enabled=true s3a.accessKeyId=XXXXX s3a.secretKey=XXXXXXXXXX
vi /etc/alluxio/conf/log4j.properties
and vi /etc/hadoop/conf/log4j.properties
:
log4j.logger.alluxio.client.file=DEBUG log4j.logger.alluxio.client.block.stream=DEBUG log4j.logger.alluxio.conf=DEBUG log4j.logger.alluxio.extensions=DEBUG log4j.logger.alluxio.underfs=DEBUG log4j.logger.alluxio.underfs.hdfs=DEBUG log4j.logger.alluxio.underfs.s3=DEBUG log4j.logger.alluxio.worker.grpc=DEBUG
vi /etc/hadoop/conf/core-site.xml
:
<property> <name>alluxio.user.file.writetype.default</name> <value>CACHE_THROUGH</value> </property> <property> <name>fs.alluxio.impl</name> <value>alluxio.hadoop.FileSystem</value> </property>
vi /etc/hadoop/conf/hadoop-env.sh
:
export HADOOP_CLASSPATH=/usr/lib/alluxio/client/build/alluxio-2.9.4-hadoop3-client.jar
preparing services:
usermod -aG hadoop root systemctl restart alluxio-master alluxio-worker alluxio-job-master alluxio-job-worker hdfs dfs -mkdir /alluxio alluxio fs mkdir /mnt alluxio fs mount /mnt/hdfs hdfs://$(hostname --fqdn):8020/alluxio alluxio fs mount /mnt/s3 s3://my-test-backet/alluxio
puttting file via alluxio.hadoop.FileSystem:
dd if=/dev/zero of=256mb.dat bs=1M count=256 hadoop fs -put -d 256mb.dat alluxio://localhost:19998/mnt/hdfs/ hadoop fs -put -d 256mb.dat alluxio://localhost:19998/mnt/s3/
- pipeline中のChannelHandlerは、
1本の双方向リストhttps://github.com/netty/netty/blob/netty-4.1.100.Final/transport/src/main/java/io/netty/channel/DefaultChannelPipeline.java#L64-L65
につながれている。
- inboundはheadからtailに向かって処理されていく。
- outboundはtailからheadに向かって処理されていく。
- handlerがinboundの方しか対応していなければ(ChannelInboundHandlerしか実装していなければ)、outboundの処理ではスキップされる。 このスキップは、 マスク を利用して行われる。
- この辺については、 ChannlePipelineのコメントの説明 が分かりやすい。
- Consumerというのは、外からデータを受け取るin。
- Producerというのは、外にデータを送るout。
- Consumerが外からデータを受け取ってExchangeを作る。
- 受け取ったデータは
Exchange#setIn
される。
- 受け取ったデータは
- ExchangeはConsumerに紐づけられたProcessorで、processされる。
- 戻りのレスポンスデータがあれば
Exchange#setOut
される。
- 戻りのレスポンスデータがあれば
- Exchangeを作るのは、 server channelのpipeline末尾に追加される ServerChannelHandler 。
- レスポンスを入れるのは、 client channelのpipeline末尾に追加される ClientChannelHandler 。